saltar - clase - SDL - "SOLUCIONADO"

Losersjuegos cuenta con una secciones de ejemplos en su web. Utilice esta sección para consultar o proponer ideas acerca de ellos.

saltar - clase - SDL - "SOLUCIONADO"

Notapor d00ze » Sab Jun 04, 2011 7:47 pm

Hola buenas, tengo hecha una clase para los sprites para que realicen determinadas funciones, pero no consigo que el sprite realice un salto.
os muestro la parte de codigo de la clase sprite a ver si me pudierais hechar una mano.
void sprite::saltar(){
speedy=5;
for(int i=1;i<=10;i++){
if(i<=5){
posy-=speedy;
//if(i%2==0)
speedy--;
}else{
posy+=speedy;
//if(i%2==0)
speedy++;
}
}
}


edito: El código lo tengo en el último post solucionado
Última edición por d00ze el Dom Jun 05, 2011 10:43 am, editado 1 vez en total
d00ze
 
Mensajes: 10
Registrado: Sab Jun 04, 2011 7:43 pm

Re: saltar - clase - SDL

Notapor Mightygaver » Sab Jun 04, 2011 8:40 pm

Tiene pinta de que lo que intentas es incrementar su velocidad en el salto hacia arriba y luego decrementarla.

Esto está bien, pero piensa que lo estás haciendo de golpe, por lo que preparas tu sprite, cambias tu posición, pero cuando dibujas es como
si ya hubiera caido del salto. Es decir, al principio incrementas su velocidad, pero luego la vuelves a decrementar dejándola como estaba y,
por tanto, dejando al sprite en la misma posición.

Para hacerlo de manera correcta te aconsejo los siguientes pasos.

En el método saltar, en lugar de cambiar la posición activa un estado dentro de la clase para saber que tu sprite está saltando.
Luego, añade a tu bucle de control un método update al sprite que se llame antes de dibujarlo. En este método, comprueba si el objeto
está saltando, haciendo en ese caso la animación de manera incremental, cambiando el valor de la posición en cada dibujado. De esa manera conseguirás la animación, aunque puede que con 10 frames para el salto no baste dependiendo de los FPS que estés utilizando.

Espero que te sirva de ayuda. No puedo aportarte código xq no tengo tiempo ni compilador para mirarlo, pero creo que con la idea te puede bastar para implementarla
tu mismo o incluso mejorarla :D
Mightygaver
 
Mensajes: 69
Registrado: Vie Ago 27, 2010 5:46 pm
Ubicación: Vila-real, España

Re: saltar - clase - SDL

Notapor d00ze » Sab Jun 04, 2011 9:16 pm

Muchas gracias por tu amplia respuesta, la verdad es que me has aclarado bastante, pero aun no consigo del todo que funcione.
Muestro algo breve del codigo para ver si veis algo mal.
sprite.cpp
sprite::sprite(){
salto=0;
}
void sprite::saltar(){
speedy=-10;
salto=1;
}
void sprite::actualizar(){
if(salto==1)
speedy++;
}

main.cpp
while(done==0){

if(saltando==1){
personaje.actualizar();
}
DibujaSprite(ventana);

//Aqui antes irian mas cosas de la manejadora de eventos
switch(event.key.keysym.sym){
case SDLK_e:
personaje.saltar();
saltando=1;
break;
}
}
d00ze
 
Mensajes: 10
Registrado: Sab Jun 04, 2011 7:43 pm

Re: saltar - clase - SDL

Notapor Mightygaver » Sab Jun 04, 2011 10:35 pm

Por lo que parece, la rutina de saltar está bien. No tengo muy claro si más adelante controlas que deje de saltar en el momento oportuno, (por ejemplo, si speedy vuelve a valer 0, pero eso simplemente tendría que hacerlo caer más.

Dime que te da el programa a ver si puedo ayudarte.
Mightygaver
 
Mensajes: 69
Registrado: Vie Ago 27, 2010 5:46 pm
Ubicación: Vila-real, España

Re: saltar - clase - SDL

Notapor d00ze » Sab Jun 04, 2011 11:13 pm

Ya consegui mas o menos que me saltara, aunque creo que es una forma muy chapucera nose si sera asi....., simplemente puse lo siguiente en la funcion actualizar de la clase sprite.
void sprite::actualizar(){
posy+=speedy;

if(salto==1)
speedy++;

if(speedy==9){
salto=0;
speedy=0;
}
}


Ahora lo que queria conseguir es que si esta realizando la accion de saltar no pueda volver a saltar, porque sino sube hasta arriba del mapa dandole muchas veces seguidas a la tecla de saltar.

Gracias por tu tiempo! ; )
d00ze
 
Mensajes: 10
Registrado: Sab Jun 04, 2011 7:43 pm

Re: saltar - clase - SDL

Notapor Mightygaver » Dom Jun 05, 2011 10:10 am

De nada, tranquilo que lo paso bien haciendo estas cosas :P

Pues, yo he sacado un rato y he hecho mi versión en Python + SFML, que es donde mejor me muevo.

from PySFML import sf

class Sprite(sf.Sprite):

def __init__(self,route):
i = sf.Image()
i.LoadFromFile(route)
sf.Sprite.__init__(self,i)
self._saltando = False
self._factor_de_salto = 15


def saltar(self):
if not self._saltando:
self._saltando = True
self._speedy = -self._factor_de_salto

def actualizar(self):
if self._saltando:
x,y = self.GetPosition()
y += self._speedy
self.SetPosition(x,y)
print self._speedy
if self._speedy > self._factor_de_salto:
self._saltando = False


Como puedes ver, el método saltar comprueba que ya no esté saltando. Así, aunque llames al método no tendrá ningún efecto.

Respecto a si es una chapuza o no, más o menos lo es. Si quieres realismo, tienes que considerar que la gravedad hace que las velocidades cambien de manera no lineal, y en este código cambian linealmente. No sé demasiado de física en los juegos, pero supongo que si utilizas un motor de física como box2D puedes hacerlo, pero eso ya es cuestión de tiempo y ganas.

Por otro lado, te aconsejo que mejores un poco en la programación. Para hacer juegos es muy importante el arte, pero coger soltura
en cosas como éstas pueden hacerte más fuerte frente a este tipo de problemas.
Mightygaver
 
Mensajes: 69
Registrado: Vie Ago 27, 2010 5:46 pm
Ubicación: Vila-real, España

Re: saltar - clase - SDL

Notapor d00ze » Dom Jun 05, 2011 10:35 am

Vale ya lo conseguí muchas gracias Mightygaver !! La verdad es que estoy empezando con esto de la programación en 2D y aun me cuesta un poco.
Dejo el código por si le puede servir a alguien, esta hecho de manera muy chapucera, pero era simplemente para que funcionara el salto y a partir de ahi desarrollarlo mas.

sprite.cpp
sprite::sprite(){
speedx=0;
speedy=0;
posx=0;
posy=0;
salto=0;
}
void sprite::saltar(){
if(!salto){
speedy=-20;
salto=1;
}
}
void sprite::actualizar(){
posy+=speedy;

if(salto==1)
speedy++;

if(speedy>20){
speedy=0;
salto=0;
}
}


main.cpp
int done=0, saltando=0;
//SDL_Init
//SDL_SetVideoMode
//CargamosSprite
while(done==0){
if(saltando==1){
personaje.actualizar();
}
DibujaSprite(ventana);

//consulta el estado del teclado
keys=SDL_GetKeyState(NULL);

while(SDL_PollEvent(&event)){
if(event.type==SDL_QUIT){done=1;}

//KEYDOWN
if(event.type==SDL_KEYDOWN){
switch(event.key.keysym.sym){
case SDLK_e:
personaje.saltar();
saltando=1;
break;
default:
break;
}//fin switch
}//fin if eventos
}//fin while event
}//fin while bucle done

DeleteSprite();
return 0;
}
d00ze
 
Mensajes: 10
Registrado: Sab Jun 04, 2011 7:43 pm

Re: saltar - clase - SDL - "SOLUCIONADO"

Notapor blacklotus.938 » Dom Dic 23, 2012 3:35 pm

Olle colega y como le harias si tienes un juego de plataformas y el personaje tienen que ir saltando por ejemplo en unas escaleras, ya que en tu codigo el personaje siempre se detiene en una posicion constante luego de haber saltado.
blacklotus.938
 
Mensajes: 8
Registrado: Mié Oct 31, 2012 2:26 pm


Volver a Ejemplos

¿Quién está conectado?

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