Generar disparos usando SDL y C/C++

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

Generar disparos usando SDL y C/C++

Notapor sofoke » Jue May 17, 2012 12:08 am

Hola, aqui yo de nuevo...
Tengo una duda, sobre disparos de los personajes en concreto el siguiente efecto:
http://www.youtube.com/watch?v=7ySvfqN4gto&feature=related
Para ser especificos un efecto como el que comienza en el segundo 28.
Mi pregunta es: Como se logra que realize disparos en un circulo de 360º y esos mismos disparos se muevan, se expandan y continuen moviendose hasta que salgan de pantalla o hasta que colisionen con un objetivo?
Imagino que se logra haciendo una clase que por ejemplo 10 disparos los acomode de cierto modo hasta cerrar el circulo. Ahora el problema es que imagino se hace con alguna ecuacion o algo por el estilo, pero; ni idea con que se pueda.
Pues hacer que cada disparo se mueva segun un movimiento prediseñado seria muy tardado en cuanto a programarlo, de ahi que imagino con una ecuacion que los acomode automaticamente seria mas rapido y una respuesta mejor.
Alguien tiene alguna idea?
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Re: Generar disparos usando SDL y C/C++

Notapor hechelion » Jue May 17, 2012 1:32 am

Si tienes un objeto, este debe tener una posición y una velocidad.
Cuando actualices el movimiento te queda:
posición = posición + velocidad.

De esta forma, la dirección de cada objeto queda determinado por el vector velocidad.

En el caso de las balas que no suelen cambiar su dirección tienen una velocidad constante, por consiguiente el problema se reduce a generar la velocidad inicial.

Ahora voy de salida pero llegando a la casa te puedo dar una mano con las formulas
Avatar de Usuario
hechelion
 
Mensajes: 29
Registrado: Vie Ene 13, 2012 3:06 pm
Ubicación: Houston

Re: Generar disparos usando SDL y C/C++

Notapor sofoke » Jue May 17, 2012 1:57 am

Gracias por responder tan rapido.
Con respecto al movimiento recto puedo generarlo sin problemas, el problema viene cuando intento hacer un circulo de objetos y moverlos independientemente sin antes haber programado el movimiento de cada uno de ellos, por eso decia yo que quiza se puede generar con alguna formula y asi evitar hacer que el codigo sea tan grande.
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Re: Generar disparos usando SDL y C/C++

Notapor hechelion » Jue May 17, 2012 4:33 am

No sé a que te refieres exactamente con tener programado el movimiento, tal vez nos referimos a lo mismo pero con diferentes palabras, por las dudas te voy a explicar paso a paso como yo lo haría, ahí vez que parte te sirve y que parte descartas.

Como no sé que lenguaje usas, voy a exponer la idea en forma similar a pseudocódigo.

Lo primero, es tener una clase para las balas, la cual, para la parte de movimiento deberá tener 4 variables (PosX - PosY - VelX -VelY).
La clase bala, solo necesita una única función para moverse, la cual, lo único que debe hacer es sumar a su posición , la variable velocidad.
Código: Seleccionar todo
Public Class ClsBala{
...Public PosX
...Public PosY
...Public VelX
...Public VelY

...Refrescar{
......PosX = PosX + VelX
......PosY = PosY + VelY
...}

...SetDireccion (Angulo, Velocidad){
......VelX = Coseno(Angulo) * Velocidad
......VelY = Seno(Angulo) * Velocidad
...}
}


Con eso, la dirección de cada bala queda determinado solo como un par de números (los VelX y VelY), y hemos creado una función que permite generar esos valores a partir de un ángulo.

Ahora, generar 10 balas que formen un circulo es solo cosa de un bucle.

Código: Seleccionar todo
for (i = 0, i < 10, i++){
...ListaBalas(i).PosX = 400
...ListaBalas(i).PosY = 300
...ListaBalas(i).SetDireccion( i * (2*pi/10), 2)



En ese ejemplo, todas las balas saldrán del punto (400, 300) al mismo tiempo pero en diferentes direcciones.
La dirección de salida está expresada como una formula en radianes (la unidad de trabajo habitual en los entornos de programación), donde 2*Pi [Rad]. = 360º

Para que las balas se muevan, solo necesitas recorrer la lista de balas e ir actualizando su posición.
Código: Seleccionar todo
for (i = 0, i < 10, i++){
...ListaBalas(i).Refrescar



Espero no haber sido muy confuso y que la explicación sirviera para orientarte.
Avatar de Usuario
hechelion
 
Mensajes: 29
Registrado: Vie Ene 13, 2012 3:06 pm
Ubicación: Houston

Re: Generar disparos usando SDL y C/C++

Notapor sofoke » Sab May 19, 2012 4:47 am

Me parece una muy buena idea probare a teclear un poco de codigo y estare comentando que tal los resultados, muchas gracias por la idea; me encanto :lol:
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Re: Generar disparos usando SDL y C/C++

Notapor sofoke » Mié Jun 20, 2012 7:13 pm

Hola de nuevo.
Bueno por fin he tenido algo de tiempo para intentar lo que me comentaste.
el codigo me quedo de la siguiente forma:
Código: Seleccionar todo
short int balastotales = 0;
    for( counta = 1; counta < MAXBALLSSATELIE; counta++){
        if( totBallsSatelite[counta].activa == false ){
            totBallsSatelite[counta].posx = x;
            totBallsSatelite[counta].posy = y;
            totBallsSatelite[counta].velx = cos( balastotales * (2*M_PI/10) )*2;
            totBallsSatelite[counta].vely = sin( balastotales * (2*M_PI/10) )*2;
            totBallsSatelite[counta].activa = true;
            balastotales += 1;
            if( balastotales >= 10 ){
                counta += counta+MAXBALLSSATELIE;
                balastotales = 0;
            }
        }
    }
    return;

Con esta funcion busca en una estructura que almacena la informacion de las balas, 10 espacios vacios para poder usar para crear el efecto que quiero. Las variables x, y son variables que recibe la funcion para indicar claro el puntos (x,y)
Código: Seleccionar todo
for( counta = 1; counta < MAXBALLSSATELIE; counta++){
        if( totBallsSatelite[counta].activa == true ){
            totBallsSatelite[counta].posx += totBallsSatelite[counta].velx;
            totBallsSatelite[counta].posy += totBallsSatelite[counta].vely;
        }
    }

Esta segunda funcion se encarga solo de mover las balas que esten actibas
El caso es que imaginemos que mi estructura es solo de 10
Código: Seleccionar todo
#define MAXBALLSSATELIE 10

pero cuando ejecuto el ejemplo me sale algo mas o menos asi:
.....*..*..*
..*...........*
.....*..*..*
Los asteriscos son las balas los puntos espacios vacios
con respecto al punto central, por lo que veo no me esta creando las 10 que necesito; que estare haciendo mal? habra forma de crear un circulo? (claro no necesariamente tienen que ser 10 balas para generar el circulo pueden ser mas.
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Re: Generar disparos usando SDL y C/C++

Notapor sofoke » Mar Jun 26, 2012 11:40 pm

Me respondo a mi mismo pues he logrado ver el error que tenia...
Era muy simple el tipo de dato que tenia tanto para la posicion como para la velocidad la tenia:
Código: Seleccionar todo
short int

eh ahi el error lo cambie a:
Código: Seleccionar todo
float


Y asi he logrado solucionar el problema de que no me generaba el efecto correctamente :D.
Gracias por la ayuda me ha servido de mucho.
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Re: Generar disparos usando SDL y C/C++

Notapor carlostex » Sab Jun 30, 2012 9:17 pm

Hola, al principio había entendido otra cosa, en el efecto al que te refieres efectivamente las balas salen de un un punto con direcciones diferentes y mantienen un vector fijo, pero mas adelante en el video vi que las balas se movían con una trayectoria curva y suave, eso quiere decir que el vector no es fijo, lo cual da un efecto mas interesante, no se si a eso te referías, pero te explico como lo haría:

En la clase tienes dos valores que indican la velocidad, los cuales tiene un valor inicial cuando empieza el disparo, lo que tienes que hacer es cambiar esos valores una vez que el disparo esta en ejecución, pero el tener la velocidad descrita de esa forma no te sirve mucho para esto, lo mejor es que lo tengas en forma de vector, con velocidad y ángulo, esas serán las nuevas variables en ves de velx y vely, entonces al actualizar el disparo solo has la conversión del vector a coordenadas, es decir posx+=velocidad*cos(angulo);
Ahora en cada actualización del disparo si pones una linea como ángulo+=.3; veras que el disparo describe una trayectoria curva.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado