Entrar
¿Usuario nuevo? Regístrate
allegro-espanol · Una lista en español sobre la librería Allegro.
? ¿Ya estás suscrito? Entrar en Yahoo!

Consejos de Yahoo! Grupos

¿Sabías que...?
Puedes buscar mensajes antiguos en un grupo.

Mensajes

  Mensajes Ayuda
Avanzado
Problemas con funciones   Lista de mensajes  
Responder | Reenviar Mensaje #787 de 9896 |
RE: Problemas con funciones

> DISPARO_NAVE() {
>
> int velocidad_disparo = -10;
>
> if (key[KEY_SPACE]) {
> do {
> draw_sprite (compartidos.buffer, nave.imagen_disparo,
> nave.disparo_x, nave.disparo_y);
> nave.disparo_y = nave.disparo_y + velocidad_disparo;
>
> } while (nave.disparo_y > compartidos.limite_superior_y);

Va muy rapido el disparo porque hasta que no colisione (la condicion
del while) el seguira moviendose pero sin dibujarse en pantalla (solo
lo dibujas en el buffer), que significa esto: que si haces que
velocidad_disparo=0.00000001, pues el disparo avanzara poco a poco
pero no se dibuja en pantalla (se dibuja en el buffer), lo que pasara
es que al cabo de x milisegundos colisionara con algo y entonces
saldra del bucle y se dibujara, a la practica significa que no veras
el disparo y que tu juego se ha detenido mientras el disparo "se movia".

Solución:

Esto es algo complicadillo de ver pero en la practica te soluciona
multitud de problemas, ademas es un estilo de diseño bastante común:

tu programa tendrias que separarlo en dos funciones

MOVER(); la cual mueve todo tu mundo (hace avanzar los disparos, mueve
las naves, contador de puntos, inteligencia artificial, todo excepto
dibujar (ni sobre buffers ni sobre pantallas), solo mover variables.

DIBUJAR(); el cual mira el estado de las variables y dibuja uno por
uno todos los objetos en un buffer, cuando esten todos, vuelcas el
buffer en pantalla.

entonces tu programa es un:

salir=0;
while(Salir==0) // si pones en mover que salir vale 1, pues fin del
programa
{
mover();
dibujar();
}

Entonces en la funcion mover creas un nuevo disparo (algo asi como:

mover() {

float velocidad_disparox = -0.001;
float velocidad_disparoy = 0;
int cont;

if (key[KEY_SPACE]) {
disparos[numDisparos].x=nave.disparo_x; // posicion del
disparo en x
disparos[numDisparos].y=nave.disparo_y; // en y
disparos[numDisparos].imagen=nave.imagen_disparo; // dibujo de
disparo, por si tienes diferentes tipos en pantalla (lo normal)
disparos[numDisparos].velocidadx=velocidad_disparox; // como se
mueve en x
disparos[numDisparos].velocidady=velocidad_disparoy; // como se
mueve en y
numDisparos++; // un disparo mas en pantalla
}

// ahora muevo todos los disparos en pantalla
for (cont=0;cont<numDisparos;cont++)
{
disparos[cont].x+=disparos[cont].velocidadx; // aumento x con
velocidadx
disparos[cont].y+=disparos[cont].velocidady;
}

// aqui hacer mas cosas: movimiento de naves, etc
}

dibujar()
{

int cont;

for (cont=0;cont<numDisparos;cont++)
{
draw_sprite (compartidos.buffer, disparos[cont].image_disparo,
disparos[cont].x, disparos[cont].y);
}

// dibujar mas cosas y por ultimo:

dibujar_todo();
}


Por supuesto este esquema lo puedes aplicar solo a tu funcion de
disparo nave, separandola en las dos partes: mover y dibujar (asi no
tienes que reformar todo tu codigo).

En este trozo de codigo te he dejado para ti dos cosas: la gestion de
la memoria: como coges un nuevo elemento de disparos, yo he supuesto
que tengo espacio, vamos que se definio como DISPAROS disparos[1000];
pero yo lo haria con memoria dinamica: DISPAROS *disparos;
y luego ha usar malloc(); o new (para C o C++ respectivamente)
(si tienes alguna duda sobre esto pregunta)
Y el otro supuesto que he hecho que las variables son globales (parece
que es uno de tus primeros juegos, usa globales, mas adelante puedes
liarte a no usarlas, y es posible: todo local)

Y sobre lo que comentaba Grzegorz Adam Hankiewicz sobre como evitar
que se pulse continuamente el disparo (aunque tu le des muy rapido)
depende de si tu quieres que se pueda mantener pulsado la tecla de
disparo y se vaya disparando solo de poco en poco, o si tienes que
estar continuamente pulsando la tecla (una se hace mirando el tiempo,
y la otra pones:


if (key[KEY_SPACE])
{
if (pulsadoTecla==0)
{
todo lo que quieras
pulsadoTecla=1; // asi no se cumplira la condicion mas hasta que
suelte la tecla.
}
}
else // no esta pulsando la tecla
{
pulsadoTecla=0;
}

Esto lo haces por cada tecla que no quieres que se use una vez (como
por ejemplo la tipica tecla de superbomba)

Carlos Rodríguez Caminero (Havoc)
http://gice.sourceforge.net

PD: Ya hacia mucho tiempo que no posteaba nada, no toy muerto, toy
trabajando en un pedazo de juego que os vais a cagar patas abajo :D
proximamente os dire algo cuando se pueda ver (minimo hasta verano)

Feliz año a toa la lista




Do, 5 de Ene, 2003 11:16 am

todoslosnomb...
Sin conexión Sin conexión
Enviar mensaje Enviar mensaje

Reenviar Mensaje #787 de 9896 |
Desplegar mensajes Autor Ordenar por fecha

Hola: Les queria hacer dos consultas. Consulta 1º) Tengo una función para provocar el disparo de una nave: DISPARO_NAVE() { int velocidad_disparo = -10; if...
fallosbsas
Sin conexión Enviar mensaje
4 de Ene, 2003
1:25 pm

... Si te refieres a que el disparo sale contínuamente, eso es porque la condición del if es cierta mientras el usario esté pulsando la tecla (a nivel...
Grzegorz Adam Hankiew...
gradha@...
Enviar mensaje
4 de Ene, 2003
2:44 pm

... Va muy rapido el disparo porque hasta que no colisione (la condicion del while) el seguira moviendose pero sin dibujarse en pantalla (solo lo dibujas en el...
todoslosnombresestanc...
todoslosnomb...
Sin conexión Enviar mensaje
5 de Ene, 2003
11:16 am

Muchas gracias a todos. Voy a probar lo que me recomendaron y después les cuento. Un saludo....
fallosbsas
Sin conexión Enviar mensaje
13 de Ene, 2003
2:52 pm
Avanzado

Copyright © 2009 Yahoo! Todos los derechos reservados.
Política de Privacidad Actualizada - Condiciones del servicio - Directrices - Ayuda