Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: serviciosadistancia en Noviembre 03, 2014, 08:40:08 PM

Título: Dos jugadores, uno por turno. ¿Por donde empezar?
Publicado por: serviciosadistancia en Noviembre 03, 2014, 08:40:08 PM
Hola makeros, tengo un problema, en un juego de tiro al blanco que estaba haciendo pense que estaria bueno poder jugar de a dos, nada complicado, solo por turnos, player 1 tira ahora, player 2 tira ahora. La realidad es que cuando me puse a hacerlo me di cuenta de que no era tan facil, de hecho llevo horas tratando y me complico, si hago un controlador no se en que evento controlar las variables para el cambio de turno y si lo hago del objeto lanzado todo se confunde, sinceramente necesito una idea, me perdí y estoy completamente bloqueado, también se me complicó a la hora de sumar el score de cada uno, como asociar que el tiro dio en el blanco (eso esta en el evento colision del proyectil) con que sume un punto en el objeto controlador, ayudaaa.
Título: Re:Dos jugadores, uno por turno. ¿Por donde empezar?
Publicado por: TheSandBoxMKG en Noviembre 03, 2014, 08:57:47 PM
para hacer un score para cada jugador, podés hacer esto:

Al inicio del juego
[gml]
global.puntaje[1]=0//le pone a cero el puntaje al jugador 1
global.puntaje[2]=0//le pone a cero el puntaje al jugador 2
global.turno=1//Turno del jugador 1
[/gml]

Para cambiar de turnos:
[gml]
switch(global.turno)
{
   case 1:global.turno=2;break;
   case 2:global.turno=1;break;
}
[/gml]

Para sumar puntaje:
[gml]
global.puntaje[global.turno]+=100//le añade 100 de puntaje al jugador del turno actual
[/gml]
Título: Re:Dos jugadores, uno por turno. ¿Por donde empezar?
Publicado por: penumbra en Noviembre 03, 2014, 09:14:57 PM
Cita de: serviciosadistancia en Noviembre 03, 2014, 08:40:08 PM
si hago un controlador no se en que evento controlar las variables para el cambio de turno

Bueno, como no se sabe en que momento puede ocurrir un cambio de turno (porque depende del desempeño de los jugadores), el evento adecuado para hacer un cambio de turno es un evento que se ejecute recurrentemente, para que en cuanto se cumplan las condiciones de cambio de turno, se produzca el cambio. Sólo dos eventos en GM cumplen con esa característica de recurrencia, pero uno de ellos, DRAW, se usa más que nada para dibujar cosas, así que la opción más común sería usar...


alguno de los eventos STEP
Título: Re:Dos jugadores, uno por turno. ¿Por donde empezar?
Publicado por: serviciosadistancia en Noviembre 03, 2014, 10:32:01 PM
Antes que nada gracias por responder, Sandbox gracias por los códigos, los voy a usar, y Penumbra, ahí justamente está mi confusión, sé que tengo que hacerlo desde el step del controlador pero lo que no sé es como detenerlo sin cambiar la variable de otro objeto porque eso me genera otros problemas, por ejemplo, objeto proyectil tiene una variable supongamos "dioenblanco" y yo en el step del controlador le digo if dioenblanco==1 hacer tal cosa pero como lo detengo para que no haga esa cosa a cada step sin poner en ese codigo obj_proyectil.dioenblando=0 porque eso me complica todo, espero haber sido claro y sino trato de hacerlo más simple, gracias amigos.
Título: Re:Dos jugadores, uno por turno. ¿Por donde empezar?
Publicado por: penumbra en Noviembre 03, 2014, 11:16:48 PM
No entendí muy bien, pero suponiendo que cada jugador tiene una oportunidad de tiro, y si falla pierde el turno...

[CREATE] del controlador
[gml]globalvar turno, oportunidad;
turno = 0         //0 = turno del jugador 1, 1 = turno del jugador 2
oportunidad = 1                //El usuario tiene una oportunidad para hacer su siguiente tiro (siempre que no falle)
[/gml]

En el jugador 1 y 2, debe haber código para saber si el proyectil dio en el blanco o no, si p1 o p2 acierta, pues aumentará su marcador, pero si falló, entonces hay que avisar que
[gml]oportunidad = 0[/gml]

Luego, en [STEP] del jugador 1
[gml]if (turno == 0)        //Si durante mi turno...
{
     if ( !oportunidad )             //... fallé el tiro...
     {
          turno != turno             //se cambia de turno al jugador 2 (si es 0 se hace 1, si es 1 se hace 0)
          oportunidad = 1   
     }

     //Más acciones que pasan cuando es turno del jugador 1

}[/gml]
Aquí se observa que la variable oportunidad es una variable que sirve para controlar la oportunidad de cualquiera de los dos jugadores, que sirve para informar si hay un fallo (de cualquiera) y que nos estamos apoyando en la variable turno para decidir qué jugador debe disparar. En el jugador 2 la idea es la misma
[STEP] jugador 2.
[gml]if (turno == 1)        //Si durante mi turno...
{
     if ( !oportunidad )             //... fallé el tiro...
     {
          turno != turno       //se cambia de turno al jugador 2
          oportunidad = 1     //El otro jugador tiene una oportunidad
     }

     //Más acciones que pasan cuando es turno del jugador 2
}[/gml]

Sobre la duda de "como lo detengo para que no haga esa cosa a cada step" creo que queda claro que eso depende de la condición que uses en el if. Sólo se puede entrar al IF si oportunidad es 0 o false, y cuando eso pasa, en el bloque mismo te aseguras de que sólo se ejecuta una vez cambiando el valor de la variable oportunidad a true o 1, por lo que el if no se vuelve a ejecutar hasta que uno de los jugadores falla.

... o eso creo, a lo mejor hay algún fallo, pero la idea es esa.  :-[ De hecho, las variables turno y oportunidad pueden ser dos variables (incluso no es necesario que sean globales) declaradas en cualquiera de los dos objetos jugador, pero como se usan en ambos, a mi me gusta usar un controlador con variables globales, que aparte puede servir para dibujar esas variables y otras cosas sin que afecte el dibujo de de los jugadores
Título: Re:Dos jugadores, uno por turno. ¿Por donde empezar?
Publicado por: serviciosadistancia en Noviembre 03, 2014, 11:49:48 PM
Mil gracias por semejante explicación! ahora estoy tratando de entenderlo, yo cuando intenté hacerlo lo hice de una forma totalmente diferente pero ya ves que no me funcionó muy bien, yo tenia un solo objeto controlador y los players eran simples variables, no objetos, hoy voy a poner todo en blanco y voy a implementar esta formula, luego comento como va, saludosss