Como hacer que salte mi personaje

Como hacer que salte mi personaje

Notapor mcmakia696 » Lun Mar 12, 2012 11:13 pm

Hola, quisiera saber si alguien me da una funcion o me explique como hacer que salte mi personaje en un juego hecho con sdl.
mcmakia696
 
Mensajes: 4
Registrado: Vie Mar 09, 2012 11:43 pm

Re: Como hacer que salte mi personaje

Notapor shackra » Mar Mar 13, 2012 5:41 am

Hola! :D
No sé si has estado en foros antes, o realizado consultas del estilo, pero generalmente, al pedir ayuda, es necesario mostrar algo de codigo fuente. Asi los demas Losers (iba a escribir foreros, pero si uno es de la comunidad, este te combierte en un Loser, ¿no? :P) podran asistirte más eficientemente.

Ahora bien, el concepto de saltar depende de como sea tu juego, si es de plataformas, como Mario Bros. o Mortal Kombat (si, las versiones para SNES) lo que podrias hacer es por ejemplo, hacer que, cuando el jugador presiones una tecla, tu personaje suba por el eje Y de la pantalla de juego y en una variable vas descontando su valor hasta llegar a 0 que bien podria significar que el personaje no puede subir más por el eje Y de la pantalla y bien, tiene que entrar en caida libre.

Por supuesto que estó debe verse natural, de otra forma el jugador vera al personaje aparecer por arriba de donde estaba y luego donde estaba antes de saltar (o nisiquiera notaria que salto porque la cuenta a sucedido muy deprisa!), puede que usar box2d, te ayudara con la fisica de tu juego.

una videodemostracion sobre box2d: http://www.youtube.com/watch?v=0awh5MFJwQo&html5=True

Tambien tienes la opcion de usar tweener, que es casi similar que box2d, nada más que en el sitio de la comúnidad existe un articulo al respecto que aconsejo leer.

saludos!
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: Como hacer que salte mi personaje

Notapor hugoruscitti » Mar Mar 13, 2012 5:42 pm

En la pagina de losersjuegos hay un artículo llamado "gravedad", seguramente te va a servir, fijate
que está casi al final de la siguiente página:

http://www.losersjuegos.com.ar/referencia/ejemplos

También vas a encontrar dos artículos que hacen saltar a personajes, aunque son un
poco mas elaborados:

http://www.losersjuegos.com.ar/referenc ... lataformas
http://www.losersjuegos.com.ar/referenc ... aso_a_paso

Saludos!
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: Como hacer que salte mi personaje

Notapor mcmakia696 » Mar Mar 20, 2012 1:40 pm

Gracias a los dos por sus respuestas, me ayudaron, pero si quieren les puedo dar el codigo fuente del programa para que tengan una idea de como es la cuestion
mcmakia696
 
Mensajes: 4
Registrado: Vie Mar 09, 2012 11:43 pm

Re: Como hacer que salte mi personaje

Notapor mcmakia696 » Mar Mar 20, 2012 11:25 pm

Hola, aqui esta el codigo fuente.Lo que necesito es que mi personaje salte,intente hacer como me dijieron pero no funciono apenas veo el salto cuando presiono la tecla de salto jeje.fue un fracaso espero que me ayuden.

NOTA: las dimensiones del PJ son 50x50 y la de la plataforma 800x150.

Código: Seleccionar todo

#include <SDL.h>
#include <stdio.h>

SDL_Surface *PANTALLA = NULL;
SDL_Surface *PJ = NULL;
SDL_Surface *PLAT = NULL;
SDL_Rect PJ_RECTA;
SDL_Rect PLAT_RECTA;
SDL_Rect FONDO_RECTA;
SDL_Event EVENTO;
char TITULO[]="Aplicacion de pruebas 20-03-2012-1";
bool SALIR = false;
int FONDO;
int VELX = 0;
int VELY = 0;
int VAR3 = 3;

bool COLISION( SDL_Rect A, SDL_Rect B )
{
    //Lados de los rectangulos
    int leftA, leftB;
    int rightA, rightB;
    int topA, topB;
    int bottomA, bottomB;

    //Calcular los lados del rectangulo A
    leftA = A.x;
    rightA = A.x + A.w;
    topA = A.y;
    bottomA = A.y + A.h;

    //calcular los lados del rectangulo B
    leftB = B.x;
    rightB = B.x + B.w;
    topB = B.y;
    bottomB = B.y + B.h;

    //Si alguno de los lados de A esta fuera de B
    if( bottomA <= topB ){ return false; }
   if( topA >= bottomB ){ return false; }
   if( rightA <= leftB ){ return false; }
   if( leftA >= rightB ){ return false; }

    //Si ninguno de los lados de A esta fuera de B
    return true;
}

int main( int argc, char* args[] )
{

   SDL_Init( SDL_INIT_VIDEO );
   SDL_WM_SetCaption( TITULO, NULL );
   PANTALLA = SDL_SetVideoMode(800,600,24,SDL_HWSURFACE|SDL_DOUBLEBUF);
   PJ = SDL_LoadBMP("pj.bmp");
   PLAT = SDL_LoadBMP("plataforma.bmp");
   FONDO = SDL_MapRGB(PANTALLA->format, 0,0,0);

   PJ_RECTA.x = 0;
   PJ_RECTA.y = 0;
   PJ_RECTA.w = PJ->w;
   PJ_RECTA.h = PJ->h;
   
   PLAT_RECTA.x = 0;
   PLAT_RECTA.y = 450;
   PLAT_RECTA.w = PLAT->w;
   PLAT_RECTA.h = PLAT->h;

   FONDO_RECTA.x = 0;
   FONDO_RECTA.y = 0;
   FONDO_RECTA.w = PANTALLA->w;
   FONDO_RECTA.h = PANTALLA->h;

   while( SALIR == false )
    {
        while( SDL_PollEvent( &EVENTO ) )
        {
         if( EVENTO.type == SDL_QUIT ){ SALIR = true; }
           
         if( EVENTO.type == SDL_KEYDOWN )
    {
       
        switch( EVENTO.key.keysym.sym )
        {
            case SDLK_UP: VELY -= VAR3 ; break;
            case SDLK_DOWN: VELY += VAR3; break;
            case SDLK_LEFT: VELX -= VAR3; break;
            case SDLK_RIGHT: VELX += VAR3; break;
         
      }
   
   }
   

   else if( EVENTO.type == SDL_KEYUP )
   {
        switch( EVENTO.key.keysym.sym )
        {
            case SDLK_UP: VELY += VAR3; break;
            case SDLK_DOWN: VELY -= VAR3; break;
            case SDLK_LEFT: VELX += VAR3; break;
            case SDLK_RIGHT: VELX -= VAR3; break;
         
      }   
    }

      if( EVENTO.key.keysym.sym == SDLK_ESCAPE ){ SALIR = true;}
      }

      
      PJ_RECTA.x += VELX;
      PJ_RECTA.y += VELY;

      if(PJ_RECTA.x <0)PJ_RECTA.x -= VELX;
      if(PJ_RECTA.x +50 >=801)PJ_RECTA.x -= VELX;
      if(PJ_RECTA.y <0)PJ_RECTA.y -= VELY;
      if(PJ_RECTA.y +50 >=601)PJ_RECTA.y -= VELY;

      if(COLISION(PJ_RECTA,PLAT_RECTA)){ PJ_RECTA.x -= VELX; PJ_RECTA.y -= VELY; }

      SDL_FillRect(PANTALLA, &FONDO_RECTA, FONDO);
      SDL_BlitSurface(PJ, NULL, PANTALLA, &PJ_RECTA);
      SDL_BlitSurface(PLAT, NULL, PANTALLA, &PLAT_RECTA);
      SDL_Flip( PANTALLA );
      
      
       
    }
   
   SDL_FreeSurface(PJ);
   SDL_FreeSurface(PLAT);

return 0;
}

mcmakia696
 
Mensajes: 4
Registrado: Vie Mar 09, 2012 11:43 pm

Re: Como hacer que salte mi personaje

Notapor kaiser » Mié Mar 21, 2012 11:13 am

Hace mucho que no uso SDL así que a lo mejor estoy metiendo la pata hasta el fondo. Cuando calculas VELX y VELY en función de las teclas que estás pulsando se lo aplicas a PJ_RECTA que es el rectángulo que contiene a PJ, creo que se lo deberías aplicar a PJ directamente no a su rectángulo, es decir, mover a PJ que es lo que ves en pantalla, con ese código no solo no deberías ver al PJ saltar sino que tampoco deberías ver como se mueve a dcha e izda. Por otro lado no tienes una función de salto propiamente dicha, cuando pulsas hacia arriba el PJ sube y cuando pulsas hacia abajo el PJ baja. Lo que deberías hacer es detectar si el PJ esta o no encima de una plataforma y mientras no lo esté hacer que baje.

Un saludo!
De la API al IDE y del IDE a la API.
Avatar de Usuario
kaiser
 
Mensajes: 121
Registrado: Mié Nov 24, 2010 7:47 pm
Ubicación: Madrid (España)

Re: Como hacer que salte mi personaje

Notapor shackra » Mar Mar 27, 2012 7:20 pm

kaiser escribió: Por otro lado no tienes una función de salto propiamente dicha, cuando pulsas hacia arriba el PJ sube y cuando pulsas hacia abajo el PJ baja. Lo que deberías hacer es detectar si el PJ esta o no encima de una plataforma y mientras no lo esté hacer que baje.


Es que eso mismo le dije yo a él en mi primer respuesta xD
ahora le toca ingeniarselas, porque ya le dimos algo de dirección al chico!
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica


Volver a Videojuegos

¿Quién está conectado?

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