Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Disparos, crear balas en C

Iniciado por zunou, 25 de Junio de 2009, 01:27:41 AM

« anterior - próximo »

zunou

Hola, pues resulta que estoy intentado hacer un juego en c de disparos con vista cenital, como los de antaño :D, y me he encontrado con el problema de no saber como crear disparos, es decir, que según se apriete el boton de disparo, se cree una serie de balas que avancen a una posición (segun el ángulo)  :(, creo que tengo que hacerlo utilizando un array, pero no tengo ni idea de como construir el programa.

¿Alguien podría darme una pista, u orientarme un poco con este problemilla?

Saludos!

Buffon

Lo que quieres hacer es tan genérico que no sabría darte una "pista".

No hay una forma de crear una Bala, en C, significa que no es C++, no son objetos, así que lo que podrías hacer es crearte un array de X posiciones (máximas balas disponibles a la vez) de estructuras:

typedef struct {
   int posX;
   int posY;
   bool existe;
} Bala;

Y luego un array de ellas

#define MAX_BALAS_DISPONIBLES 20
Bala[MAX_BALAS_DISPONIBLES] Balas;
int balaVacía = 0;

--

Así cuando creas una bala nueva.

Balas[balaVacia].posX = XX
Balas[balaVacia].posY = YY
Balas[balaVacia].existe = true

Cuando impacta:

Balas[balaVacia].existe = false

-----------



Como mejorarías esto ?

Si en vez de 20 balas, tienes 2.000.000, recorrerte los 2.000.000 para pintar lo mismo sólo 5 es una putada, así que te puedes crear un Set de identificadores de balas que existen, haces un .join del identificador de las balas nuevas y un .remove de las que se ponen en false y así tienes una "lista" que contiene sólo los identificadores de las balas activas.


Pero tu pregunta no es de C, es de estructuras de datos, hay formás más sencillas o más complicadas de montárselo, algunas te dan mayor entendimiento de como está construida tu aplicación y otras le dan mayor eficiencia.

zunou

Hola Buffon, al final me di cuenta de como tenia que hacerlo, pero claro el problema es lo que tu dices, tener que recorrer la posicion de todas, intentaré hacer lo que comentas, a ver que tal.

Muchas grácias  :)




ethernet

#3
Por si te sirve de algo te dejo el código:

pj_input es un array donde se guardan las pulsaciones del jugador
ph_file_cnt es un contador que sirve para evitar que en todos los frames se lancen balas (ojo, tengo tiempo de frame fijo)
ACTOR_get retorna un objeto de juego, por defecto se actualiza con velocidad uniforme (vel) desde la posición que se le espcifique (pos). Este método yo lo tengo implementgado con un bucle for+if de toda la vida, si quieres optimizar puedes tener un par de pilas con lso objetos usados/no usados pero optimizar es para perdedores :P


//shots
if(pj_input[4] && pj_fire_cnt-- == 0)
{
int i;
for( i = 0; i < 3; ++i)
{
actor* a = ACTOR_get(actor_pool);

a->pos[0] = pj_pos[0];
a->pos[1] = pj_pos[1];
a->pos[2] = 0.0f;

a->vel[0] = i - 1.5f;
a->vel[0]*=2.0f;

a->vel[1] = 35.0f;
a->vel[2] = 0.0f;

a->type = BULLET;
//a->flags |= F_ACTIVE;
pj_fire_cnt = PJ_FIRE_RATE;
}
}



si quieres ver como queda:
http://vimeo.com/3959672

y el código completo:
http://bitbucket.org/javisantana/cubyshot/src/tip/src/intro.c#cl-128

zunou

 :D gracias por tu codigo, creo que me será de ayuda.

Esto... ^_^' tengo otra duda con respecto a los disparos, creo que es un poco basica, pero no doy con ello  ^_^', si por ejemplo en lugar de hacer que los disparos sean en una dirección fija, quiero que se dirijan a la posicion del ratón, ¿como podría hacerlo mas o menos?.

Lo que intento hacer es que cuando  pulse "disparar" se registre la posicion que tenía el ratón en el momento de pulsar, y que la bala en cuestion se dirija a esas coordenadas, lo he intentado calculando el arco tangente con atan(objetivo.x-bala.x) y atan(objetivo.y-bala.y), pero claro los valores que me da son de +1 o -1, no se si lo estoy aplicando bien... el caso es que tampoco tengo ni idea de como hacerlo. :(

saludso

Buffon

Cuando creas una bala deberías tener.

struct {
     float posX,posY;
     float dirX, dirY;
     float vel;
}Bala;

posX, posY serán la posición de la nave.

dirX, dirY lo deberías inicializar como el vector dirección del ratón hacia la nave unitario !!!

y vel; puede ser una constante;


recordemos.

MouseActual = {mouseX, mouseY}
Nave = {naveX, naveY}

la dirección de la bala es { dirX = mouseX - naveX, dirY = mouseY - naveY}

moduloDireccion = sqrt( pow(dirX,2) + pow(dirY,2));

dirX = dirX / moduloDirección
dirY = dirY / moduloDirección

y ya tienes un vector dirección normalizado, que se moverá en cada paso del bucle 1 unidad de terreno.

zunou

 :D uy, casi lo consigo, pero tu codigo parece mas eficiente :D y lo habia hecho calculando

direccion=atan2(mouse.y-bala.y, mouse.x-bala.x)*(180/PI);

luego la direccion de bala.x  y bala.y la obtenia calculando el coseno de x y el seno de y, pero claro, así tengo que estar calculando tambien si el raton está arriba o abajo, izquierda. derecha....

Pues muchas gracias otra vez :), lo adaptaré a mi codigo a ver que tal.

saludos

Sergio Vargas

Amigo me podrias ayudar con un juego en consola de un jugador que se mueve por un laberinto y dispara con una tecla. Ya puedo hacer que se mueve el jugador la duda es con el disparo?






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.