[Palib] ¿Cómo manejo el tiempo?

Buenas,

llevo poco menos de una semana probando cosas en la consola con Palib. Y haciendo un pequeño juego (a ver en qué sale, jeje), me surgen dudas que no sé solucionar, y no sé cómo documentarme.

> Me gustaría hacer explotar un objeto. Eso es fácil con Sprites, pero el problema es que no sé cómo dejar que la 'explosión' dure 1 segundo antes de eliminarlo (O sea: Nave enemiga > Recibe disparo > Explota > Elimino el sprite).
> También me gustaría controlar los tiempos que una nave dedicaría para disparar indefinidamente. Ahora mismo dispara según un bucle 'for', pero claro, dispara como un loco, y quiero que la nave espere 2 segundos antes de disparar de nuevo. ¿Cómo lo podría hacer?
> Ponerme limitaciones de tiempo también a mí. Si no habéis adivinado, estoy haciendo un juego de navecitas, y la velocidad de disparo de mi nave no sé tampoco limitarla. En resumidas el límite es la capacidad de pulsar botones que tengamos... y no me gusta demasiado.

Así que eso... ¿cómo puedo hacer estas cosas?


Salu3
Virusaco escribió:Buenas,

llevo poco menos de una semana probando cosas en la consola con Palib. Y haciendo un pequeño juego (a ver en qué sale, jeje), me surgen dudas que no sé solucionar, y no sé cómo documentarme.

> Me gustaría hacer explotar un objeto. Eso es fácil con Sprites, pero el problema es que no sé cómo dejar que la 'explosión' dure 1 segundo antes de eliminarlo (O sea: Nave enemiga > Recibe disparo > Explota > Elimino el sprite).
> También me gustaría controlar los tiempos que una nave dedicaría para disparar indefinidamente. Ahora mismo dispara según un bucle 'for', pero claro, dispara como un loco, y quiero que la nave espere 2 segundos antes de disparar de nuevo. ¿Cómo lo podría hacer?
> Ponerme limitaciones de tiempo también a mí. Si no habéis adivinado, estoy haciendo un juego de navecitas, y la velocidad de disparo de mi nave no sé tampoco limitarla. En resumidas el límite es la capacidad de pulsar botones que tengamos... y no me gusta demasiado.

Así que eso... ¿cómo puedo hacer estas cosas?


Salu3



haber, te explico, yo no se como tienes el trozo que dice cuando explota la nave y tal, pero yo tendria una variable de vida, cuando llega a 0, la nave explota.
A partir de hay hacesuna variable, llamemosta tiempoexplosion, y haces lo siguiente:
u8 tiempoexplosion = 60; // la variablñe que decia, 60 seria un segundo, 120, 2 seg, etc...

// si la vida de la nave es menor que uno, (osea,0)...
if (vidanave < 1){ // la variable de vida que yo decia..
PA_StartSpriteAnim(...); // haces la animacion de explosion
tiempoexplosion--; //bajas el valor del tiempo
}

// cuando la variable es menor de uno
if (tiempoexplosion < 1){
PA_DeleteSprite(...) // se borra el sprite
}


Para lo del disparo, parecido, te haces un booleano y una variable:
bool recarga = true; // si es true, el disparo esta recargado y puede disparar, sino no...
u8 tiempodisparo = 120; // dos segundos antes de disparar...

// aqui la tecla que tengas puesta para disparar, supongamos que es la A:

// si pulsas a y el booleano tiene valor de verdadero...
if ((Pad.Newpress.A) && (recarga == true)){
// dispara, aqui tu funcion o lo que sea
tiempodisparo = 120; // le decimos el tiempo que tarda en disparar nuevamente
recarga = false; // hemos disparado y le damos un valor de falso
tiempodisparo --; // vamos bajando el valor de la variable
}

// si el tiempo es menor de uno y el disparo se a recargado...
if ((tiempodisparo < 1) && (recarga == false)){
tiempodisparo = 0; // le das un valor de cero al tiempo de disparo (una chorrada, pero bueno)
recarga = true; // se recarga
}

Y con eso ya valdria.
Esto es aplicable a la nave enemiga y a la tuya, asi que ya sabes...

Salu2
Gracias por responder. En definitiva, eso que usas es un contador con un valor muy alto, que hasta que no llege a cero no dispara de nuevo, ¿no? Ya tenía pensado eso, pero no sabía que 120 serían 2 segundos, y me parece un poco chapucero :P, aunque útil saberlo ^^.

Aunque buscando mi propia respuesta, me creé una función con PA_RTC.Seconds, que forma parte de una estructura que saca el tiempo real de la consola (en segundos en este caso), y ya solo tenía que hacer ciertas comprobaciones:

if (ListoParaDisparar == 1){
      //Acciónes pertinentes de Dispararar
      ListoParaDisparar = 0; //ahora debe esperar a estar listo de nuevo
      MomentoDeDisparo = PA_RTC.Seconds; //guardo en segundos el momento del disparo

}else{
      //La nave no está lista para disparar, pero comprobaré a ver si se acerca el momento
      int tiempoActual = PA_RTC.Seconds; //Nueva variable que me guardará el tiempo actual, para luego compararla...
      
      //Si el tiempoActual supera al MomentoDeDisparo más el desfase, entonces será momento de disparar de nuevo, o sea, estar ListoParaDisparar:
      if (tiempoActual >= (MomentoDeDisparo + desfaseDisparo)) ListoParaDisparar = 1;
     
}


Aunque no he comprobado si me funciona siempre bien (creo que en el momento de que MomentoDeDisparo+desfaseDisparo supere el valor 59 no funciona, con hacer un módulo ya basta.


Lo de explotar la nave... pues igual supongo. Tengo un sprite de vida de la nave que acaba en una explosión, pero quiero que esa explosión sea vistosa durante un pequeño periodo de tiempo. La forma de resolverlo sería similar a la de los disparos.

Salu3
Virusaco escribió:Gracias por responder. En definitiva, eso que usas es un contador con un valor muy alto, que hasta que no llege a cero no dispara de nuevo, ¿no? Ya tenía pensado eso, pero no sabía que 120 serían 2 segundos, y me parece un poco chapucero :P, aunque útil saberlo ^^.

Aunque buscando mi propia respuesta, me creé una función con PA_RTC.Seconds, que forma parte de una estructura que saca el tiempo real de la consola (en segundos en este caso), y ya solo tenía que hacer ciertas comprobaciones:

if (ListoParaDisparar == 1){
//Acciónes pertinentes de Dispararar
ListoParaDisparar = 0; //ahora debe esperar a estar listo de nuevo
MomentoDeDisparo = PA_RTC.Seconds; //guardo en segundos el momento del disparo

}else{
//La nave no está lista para disparar, pero comprobaré a ver si se acerca el momento
int tiempoActual = PA_RTC.Seconds; //Nueva variable que me guardará el tiempo actual, para luego compararla...

//Si el tiempoActual supera al MomentoDeDisparo más el desfase, entonces será momento de disparar de nuevo, o sea, estar ListoParaDisparar:
if (tiempoActual >= (MomentoDeDisparo + desfaseDisparo)) ListoParaDisparar = 1;

}


Aunque no he comprobado si me funciona siempre bien (creo que en el momento de que MomentoDeDisparo+desfaseDisparo supere el valor 59 no funciona, con hacer un módulo ya basta.


Lo de explotar la nave... pues igual supongo. Tengo un sprite de vida de la nave que acaba en una explosión, pero quiero que esa explosión sea vistosa durante un pequeño periodo de tiempo. La forma de resolverlo sería similar a la de los disparos.

Salu3


Menuda forma de liarte, lo haces como te he dicho y mejor, ademas tambien es el tiempo exacto el mio, ya que la ds va a 60 fps...
Sí, me parece que seguiré ese método mejor xD


Salu3
Tampoco es muy dificil de pensar. Sólo tienes que pensar un poco. PA_WaitForVBL sirve para hacer una espera de 1/60 segundos. Entonces si lo multiplicas por 60, es un segundo. Podrías hacer una función para hacerlo más rapido y de esa forma controlas cuando pasa cada cosa(lo que hago yo). Por cierto, no uses Newpress, sino utiliza Held. Por cierto Plata, un pequeño error en tu código. "if(tiempoexplosion < 1) blablabla...", pero has nombrado esa variable como unsigned.He aquí un pequeño owned xD.
alexpowerup escribió:Tampoco es muy dificil de pensar. Sólo tienes que pensar un poco. PA_WaitForVBL sirve para hacer una espera de 1/60 segundos. Entonces si lo multiplicas por 60, es un segundo. Podrías hacer una función para hacerlo más rapido y de esa forma controlas cuando pasa cada cosa(lo que hago yo). Por cierto, no uses Newpress, sino utiliza Held. Por cierto Plata, un pequeño error en tu código. "if(tiempoexplosion < 1) blablabla...", pero has nombrado esa variable como unsigned.He aquí un pequeño owned xD.


con el pa_wait, pararias TODO, a el le interesa una espera parcial

P.D: Si que ha habido una cagadilla, pero tampoco tiene tanta importancia u.u xDDDD :)
6 respuestas