Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: blastychan en Octubre 17, 2012, 12:13:19 AM

Título: Vidas y salud diferenciadas para dos jugadores "Solucionado"
Publicado por: blastychan en Octubre 17, 2012, 12:13:19 AM
Hola!
Estoy haciendo un proyecto tipo Battle City y mi dilema son las barras de salud y las vidas para cada tanque.

¿Cómo hago para que cada uno disponga de barras y vidas independientemente del otro jugador?

Gracias!
Título: Re:Vidas y salud diferenciadas para dos jugadores
Publicado por: the_blade en Octubre 17, 2012, 12:24:38 AM
Utiliza este codigo

//evento create de cada objeto
Salud=100
//evento draw
//dibujamos la barra de vida
draw_healthbar(view_xview+160,view_yview+55,view_xview+260,view_yview+65,100*Salud,c_black,c_red,c_green,0,1,1);

ahora por ejemplo si cuando colisiona con X objeto le quita 5 de vida, por ejemplo:

Salud-=5;

el draw te dibujara la vida actual, eso si ponle una condicion para no tener porblemas, por ejemplo:

if Salud > =5{
Salud-=5
}
else{
Salud=0;
}

de esta forma nunca tendra un valor menor a 0, y a su vez podrias comprobar que si Vida es igual 0 se destruya la instancia.-
Salu2.-
Título: Re:Vidas y salud diferenciadas para dos jugadores
Publicado por: Mgbu en Octubre 17, 2012, 12:40:17 AM
Lo explico con D&D

La vida, salud, munición, y todo se guarda en variables (http://www.comunidadgm.org/manual_GM/Variables.htm)
Vos cuando usás la acción "Set health" con 100 estás haciendo exactamente lo mismo que si pusieras "Set variable" con variable de nombre "health" y el valor 100

En definitiva en el jugador 1 en vez de usar "Set health" usás "Set variable" con nombre "vida_jug1", y obviamente para el jugador 2 usás "Set variable" con nombre "vida_jug2"

Lo mismo es para "Test Health", en vez de usar eso usás "Test Variable" con nombre en "vida_jug1"

El problema es cuando querés dibujar la vida, en vez de usar "Draw Health" se usa "Draw Rectangle" (que debe ser puesto en step). Como necesitamos hacer un rectángulo que sea largo depende de la vida que tenemos tenemos esto:
x1: Es la x de la esquina superior izquierda del rectángulo, se pone el mismo valor que había en x1 de "Draw Health"
y1: Es la y de la esquina superior izquierda del rectángulo, se pone el mismo valor que había en y1 de "Draw Health"
x2: Es la x de la esquina superior izquierda del rectángulo, se debe poner: "(x1+vida_jug1)/100*ancho_de_barra" hay que cambiar esos valores, entonces si el ancho de tu barra es de 54 y x1 era 32 ponés: "(32+vida_jug1)/100*64"
y2: Es la y de la esquina superior izquierda del rectángulo, se debe poner "y1+alto_de_barra", si el alto de tu barra es de 10 y habías puesto 30 en y1 se debe colocar "30+alto_de_barra"
filled: Acá ponés si dibujar el rectángulo rreleno o sólo sus líneas, dejalo en filled

Bueno, me parece que es todo ;D
Título: Re:Vidas y salud diferenciadas para dos jugadores
Publicado por: blastychan en Octubre 17, 2012, 01:41:18 AM
Gracias muchachos por tomarse el tiempo en responderme... pero sinceramente soy un animal con el código... todavía estoy usando el GM de forma animalesca  :-[

Por hueso mesmo les pongo la info de lo que hice hasta ahora (obvié las funciones de movimiento para reducirlo):

Jugador 1

Information about object: player1

Sprite: p1_tanke
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent: <no parent>
Mask: <same as sprite>

Create Event:
set variable shoot to 1
set variable dir to 0
set the health to 100

Alarm Event for alarm 0:
set variable shoot to 1

Collision Event with object p2_bala:
set the health relative to -20

Key Press Event for <Space> Key:
if shoot is equal to 1
      set Alarm 0 to 15
      create instance of object p1_bala at relative position (0,0) with speed 15 in direction dir
      set variable shoot to 0




Jugador 2

Information about object: player2

Sprite: p2_tanke
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent: <no parent>
Mask: <same as sprite>

Create Event:
set variable shoot2 to 1
set variable dir2 to 0
set the health to 100

Alarm Event for alarm 2:
set variable shoot2 to 1

Collision Event with object p1_bala:
set the health relative to -20

Key Press Event for Keypad 0 Key:
if shoot2 is equal to 1
      set Alarm 2 to 15
      create instance of object p2_bala at relative position (0,0) with speed 15 in direction dir2
      set variable shoot2 to 0



Para la vida de cada uno, creé dos objetos para cada vida, en donde se dibuja la barra de salud

Information about object: p1_vida

Sprite: <no sprite>
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent: <no parent>
Mask: <same as sprite>

Step Event:
jump to position (player1.x,player1.y)

Draw Event:
draw the health bar with relative size (-16,-20,16,-25) with back color none and bar color green




Bueh, eso es lo que hice hasta ahora, el tema es que cuando P1 le dispara a P2, la barra de salud disminuye en los dos... ¿cómo puedo resolverlo? (nótese el nivel de noooooob que tengo) XD XD XD

Gracias de a Th_Blade y Mgbu por ayudar a este bestia!

Saludos!
Título: Re:Vidas y salud diferenciadas para dos jugadores
Publicado por: Mgbu en Octubre 17, 2012, 02:13:26 AM
No te trates tan de noob que todos empezanos sin saber :D

Fijate si te sale cambiar los "set the health..." por "set variable vida..."
Te digo porque la variable health es comun para todos los objetos (es una variable global por si sabes la definicion) entonces debes inventarte una variable con nombre vida (justo como inventaste la variable dir), las variables inventadas normalmente no son globales, o sea que hay una variable vida para cada jugador.

Si no te sale mañana explico con tiempo, ahora me tengo que ir  :P
Título: Re:Vidas y salud diferenciadas para dos jugadores
Publicado por: blastychan en Octubre 18, 2012, 12:51:23 AM
Muchachos! salio!!!

Después de muchos dolores de cabeza, salió!!

Les pongo cómo quedaron las cosas:

Player 1

Information about object: player1

Sprite: p1_tanke
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent: <no parent>
Mask: <same as sprite>

Create Event:
set variable shoot to 1
set variable dir to 0
set variable vida to 100

Alarm Event for alarm 0:
set variable shoot to 1

Collision Event with object p2_bala:
set variable vida relative to -5

Key Press Event for <Ctrl> Key:
if shoot is equal to 1
      set Alarm 0 to 15
      create instance of object p1_bala at relative position (0,0) with speed 15 in direction dir
      set variable shoot to 0




Controlador de vida del Player 1

Information about object: p1_vida

Sprite: <no sprite>
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent: player1
Mask: <same as sprite>

Step Event:
jump to position (player1.x,player1.y)

Draw Event:
draw a horizontal gradient filled rectangle with relative vertices (-15,-21) and ((-15+vida)/100*15,-18) and colors 255 to 65280
if vida is smaller than -50
      else
            create a medium effect of type explosion relative at (0,0) of  color 16777215 below objects
      for all player1: destroy the instance
      destroy the instance





Tenía un dilema, y era que si ponía el evento Draw en el Player1 me reemplazaba el sprite del jugador. Por mera "eureka" le dí clic al parent en el obj controlador de vida... y... chan chan! pude hacer que la barra de salud se mueva con el player 1!!!!

Los valores de la barra de salud los puse "a ojo" probando la posición correcta para que quede arriba del sprite del jugador. XD XD

Cuando ahora solamente falta algunos cambios (vida x salud  :-[ ), niveles, menúes y sonidos, cuando termine subo una demo.

Una tonelada de Gracias muchachos!!!

Saludos!!
Título: Re:Vidas y salud diferenciadas para dos jugadores "Solucionado"
Publicado por: Mgbu en Octubre 18, 2012, 01:06:47 AM
Cita de: blastychan en Octubre 18, 2012, 12:51:23 AM
Tenía un dilema, y era que si ponía el evento Draw en el Player1 me reemplazaba el sprite del jugador.
Ah si, no sé por qué el Game Maker cuando uno agrega el evento Draw deja de dibujar al objeto
Para que no suceda, en ese draw hay que dibujar al jugador, lástima que hay que hacerlo con código. Agrega un "Add a piece of code" (está en la pestaña Control) y adentro pegá esto:
draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha)
No hace falta que te aprendas que dice por ahora XD

Es mejor que dibujes la barra con el objeto player1 porque es más rápido, simple y además si dibujás con otro objeto vas a ver que la barra va un poco atrasada cuando el jugador se mueve