PDA

Ver la versión completa : Pausas (Sprites)



CyberPure
09/11/2004, 21:48
Hola:

Estoy haciendo un tio que dispara con una metralleta. Quiero que el disparo sea con la velocidad que yo kiera por que los disparos salen muy juntos y muy rapidos. Como puedo contralar el tiempo del sprite "bala"?

No se si me explico.

Salu2!

fagotero
09/11/2004, 22:06
Mira yo lo que uso es esto, si no lo entiendes, pregúntame :P

Creas una constante al inicio del código del programa:


Program ejemplo;

Const
Retardo=5; // Podría ser 10, o el número que mejor se ajuste a el tiempo entre cada disparo.
__________________________


Luego en el proceso del personaje que dispara:

Process eltioquedisparaconlametralleta ()

Private
Cont=0; //añadimos esta linea que pone el contador a 0.

Begin
ESTO YA LO TIENES
ESTO TAMBIÉN
Y ESTO TAMBIÉN xDD
Loop
Cont--; //aquí añadimos un bucle que decrementa el contador y de esta manera se quedará en 0
If (cont<0) cont=0; end //hasta que vuelvas a pulsar x (el botón que tú uses para disparar)
If esto no importa
If esto tampoco
If esto ya lo tendrás
If y esto también xDDD
If (key(_x) and (cont==0)) // bueno esto es lo que te explico también arriba.
Cont=retardo;
disparo();
end
Frame;
end
end

_______________________________


Yo creo que esto funciona xDDD


Lo que está comentado es lo que tienes que poner y lo que te puse como que ya lo tienes escrito pues simplemente se supone que ya tendrás tus temas escritos para mover al personaje etc..etc...


Saludos!

(_=*ZaXeR*=_)
10/11/2004, 00:06
Puede que lo que le suceda a tu programa es que no le tengas puesto un tiempo de espera entre pulsado y pulsado del boton.

Esto hace que tu programa sea mas rapido que tu al detectar el pulsado de boton, me explico, en el tiempo que tu pulsas una vez por ejemplo la A, pues el programa ya ha evaluado un monton de veces lo que devuelve GpKeyGet(), puesto que este se encuentra dentro del bucle infinito principal del juego.

Para controlar esto tienes dos opciones:

1º Puedes crear una variable que te sirva de bandera, de esta forma:

int Flag_disparo=0;
int boton;
....
while (1)
{
......
boton=GpKeyGet();
.....
if ((boton==GPC_VK_FA)&&(!Flag_disparo))
{
Flag_disparo=1;
disparar();
}
if (disparar) Flag_disparo=0;
.....
}

En este ejemplo se entiende que disparar te devuelve un 1 cuando termina de disparar

2º Metodo:

Utilizar dentro de tu codigo
n_tick = GpTickCountGet();
while ( ( GpTickCountGet() - n_tick ) < 100);

Esto lo que hace es que tu programa vaya mas lento, osea que te dara mas tiempo entre lectura y lectura de la funcion GpKeyGet(); dentro del bucle, esta relentizacion la tienes que sincronizar con el tiempo que tu quieras, eso lo consiguas cambiando el 100 por otro valor.

Generalmente el segundo metodo se utiliza para que los frames de una animacion se ajusten mas a la velocidad a la que se ejecuta el programa.

Espero haberte servido de ayuda, y no haber respondido a una pregunta que no era la tuya :p

fagotero
10/11/2004, 00:22
Emmmmmm esto es soporte fenix ¿?

:D :D

(_=*ZaXeR*=_)
10/11/2004, 00:34
:eek: Ostias es verdad :explota: ni me habia dao cuenta, yo he visto programacion y he tirao palante mas feliz que na.

Pos bueno, espero que le sirva a alguien que use el SDK. Fijo que mas de uno ha pensao que toy algo :loco:

:musico: :musico: :musico:

oankali
10/11/2004, 10:11
Según lo que dice CyberPure, el tío dispara con metralleta, o sea que los disparos salen seguidos mientras tienes apretado el botón de disparo.
:ametra: :canon2:

Yo, en mis juegos, cuando necesito tener diferentes temporizaciones para diferentes elementos de la pantalla, lo que hago es guardar un contador de tiempo para cada elemento móvil.

Por ejemplo creo una estructura general que me sirva para cada elemento con estos campos:
estructura elementoMovil
{
&nbsp&nbsp.posición
&nbsp&nbsp.dirección de movimiento
&nbsp&nbsp.bitmap con la lista de sprites
&nbsp&nbsp.fotograma en curso
&nbsp&nbsp...
&nbsp&nbsp// y lo más importante para tu caso:
&nbsp&nbsp.tiempo // la última vez que se ha movido
&nbsp&nbsp.espera // cada cuanto se tiene que mover
}

Entonces cada elemento es de tipo elementoMovil y puede tener su propia velocidad de movimiento.

El bucle principal muy simplificado podría parecerse a esto:

Bucle
&nbsp&nbspMoverElementos
&nbsp&nbspDibujarElementos
&nbsp&nbspLeerTeclado
&nbsp&nbspGestionarTeclado
FinBucle

MoverElementos:
&nbsp&nbspPara cada elemento de la lista de elementos
&nbsp&nbsp&nbsp&nbsp// Comprobamos si hay que mover el elemento
&nbsp&nbsp&nbsp&nbspSi .tiempo + .espera <= RelojActual
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp.tiempo = RelojActual
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp// Mover elemento cambiando fotograma y demás
&nbsp&nbsp&nbsp&nbspFinSi
&nbsp&nbspFinPara
Fin

Con esto consigo independizar todos los elementos. Además puedo acelerar o frenar un elemento cambiando su campo .espera durante el juego.
Y lo que es más, puedo prescindir completamente de un bucle de retardo en el bucle principal, con lo que consigo el máximo refresco de pantalla para obtener más FPS.

Me dirás que con esto no he contestado a tu pregunta ya que tu no preguntabas por la velocidad de movimiento, sino por la frecuencia de salida de los disparos. Puedes utilizar el mismo sistema para lo que sea, en tu caso si pones en el elemento metralleta dos campos más: .tiempoDisparo y .esperaDisparo podrás controlar la frecuencia de los disparos.

Espero que te sirva de algo.
Oankali

CyberPure
10/11/2004, 12:05
Muchas Gracias a todos, despues de comer probare cosas haber que tal resultan, que ahora estoy en el curro.

Gracias! Salu2!

enkonsierto
10/11/2004, 15:27
A ver, a ver las cosas que resultan de todo esto...