Problema semicirculo para realizar un salto en video juego.

Iniciado por ThePinkPanther, 14 Marzo 2013, 00:07 AM

0 Miembros y 1 Visitante están viendo este tema.

ThePinkPanther

Estoy estudiando SDL, y tenia pensado hacer un juego ,pero todavia no me llevo muy bien con las cordenadas.

Con SDL creo una superficie principal de por ejemplo 400(ancho) x 400(largo) , cuadrada.

Quiero hacer un salto , osea que si el personaje salta tiene que formar un semicirculo dentro del eje.

Suponiendo que el salto arranca del 1 en x , y llega a 10 en x , en 5 de x tendria que estar el punto más alto del salto , que luego disminueria a medida que valla avanzando.. osea, en 5 de x , Y disminueria hasta llegar a 10 de ex . siendo y 0 para el entonces. ( En el piso ).

Mientras y aumenta hasta 5 de x, dismunuye en semetria ..

Hay algun patron , o formula para hacer un semicirculo en el salto , osea que valla aumentando en forma de parabola hasta llegar a 5 de x y dismuir en forma de parabola hasta llegar a 10 de x ?..

QUIERO HACER UN MOVIMIENTO ASI..


Gracias de antemano y un saludo.

leosansan

#1
Cita de: ThePinkPanther en 14 Marzo 2013, 00:07 AM

Suponiendo que el salto arranca del 1 en x , y llega a 10 en x , en 5 de x tendria que estar el punto más alto del salto , que luego disminueria a medida que valla avanzando.. osea, en 5 de x , Y disminueria hasta llegar a 10 de ex . siendo y 0 para el entonces. ( En el piso ).

Mientras y aumenta hasta 5 de x, dismunuye en semetria ..

Hay algun patron , o formula para hacer un semicirculo en el salto , osea que valla aumentando en forma de parabola hasta llegar a 5 de x y dismuir en forma de parabola hasta llegar a 10 de x ?..
...............................................

Las coordenadas de los puntos serian:


Citar
                          y=4.5^2 - (x-5.5)^2
..... con x variando de 1 a 10




Saluditos!. ...

ThePinkPanther

#2
Muchas gracias ... jaja .. lo pude hacer al programa del "saltito" , pero resulta que esta medio bugueado y todavia no encuentro el error del bug, aca dejo el codigo fuente por si a alguien le sobra el tiempo y esta interesado en revisarlo ..

gracias de antemano..


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL/SDL.h>
#define ANCHO 400
#define LARGO 400

//Variables globales
SDL_Surface *superficie,*icono; //Superficie principal.
SDL_Rect cuadrado,suelo; //Rectangulos
SDL_Event userevent; //Para registrar los eventos del usuario.
int cds=10*35; //Cordenadas del suelo
int bandera=0; //Esta bandera indica , si el salto se pudo realizar o no.


//--
//Prototipos
void modtam(SDL_Rect *,int , int); //Prototipo de la funcion modtam , que cambia el tamaño de un rect.Ancho y alto.
void modcor(SDL_Rect *,int , int);  //Prototipo de funcion que cambia las cordenadas de un rectangulo.
void sueloo(SDL_Rect *,int); //Prototipo de funcion , que crea el suelo.
void moverd(SDL_Rect *);//Mueve el personaje o cuadrado en el eje x.( Simulacion de la accion caminar)(hacia la derecha);
void moveri(SDL_Rect *) ; //Mueve el personaje o cuadrado en el eje x.( Simulacion de la accion caminar)(hacia la izquierda);
void restaurar(SDL_Surface *,SDL_Rect *,int ); //Restaura fondo original.
void salto(SDL_Rect *);
void salto2(SDL_Rect *);
// --




int main (int argc, char *argv[])
{
   
   //Inicio de sistemas, creacion de superficie principal,cambio de titulo.
   //Carga de las imagenes.
SDL_Init(SDL_INIT_VIDEO);
superficie=SDL_SetVideoMode(ANCHO,LARGO,24,0);
SDL_WM_SetCaption("Salto",NULL);

//



//Codigo general
//Crea el suelo,ajusta el tamaño del cuadrado(objeto), pone objetos en pantalla.
sueloo(&suelo,cds);
modtam(&cuadrado,10,10);
modcor(&cuadrado,1,cds-10);
SDL_Flip(superficie);
//--------
//Variable que indica el final del programa
int final=1;
//--

//Comienza lectura de eventos..

do
{
     while (SDL_PollEvent(&userevent)) //Mientras aya eventos por parte del usuario -->
   {
           
           
           
           //Cambiamos el valor de final, si se registra el evento de cierre de pantalla.
           if(userevent.type==SDL_QUIT)final=0; //Cuando se lee el evento de cierre de ventana ( se cierra)
           if(userevent.type==SDL_KEYDOWN)
           {
           restaurar(superficie,&suelo,cds);
            if(userevent.key.keysym.sym==SDLK_RIGHT)moverd(&cuadrado); //mueve hacia la derecha el cuadrado
            if(userevent.key.keysym.sym==SDLK_LEFT)moveri(&cuadrado); //mueve hacia la izquierda el cuadrado
            if(userevent.key.keysym.sym==SDLK_SPACE)salto(&cuadrado);
            if(userevent.key.keysym.sym==SDLK_d)salto(&cuadrado); //Salto hacia la derecha
            if(userevent.key.keysym.sym==SDLK_a)salto2(&cuadrado); //Salto hacia la izquierda
            }
            }
                                       
         

           }while(final);  //Mientras final sea igual a 1 se repite..






//Finaliza lecturas de eventos..





//Final del programa..


   return 0;
}
//


//Codigo de las funciones..

//Modifica las cordenadas de un rectangulo.
void modcor(SDL_Rect *rectangulo,int x , int y) //Ver prototipo.
{
    rectangulo->x=x;
    rectangulo->y=y;
    SDL_FillRect(superficie,rectangulo,0xFF0000);
   
}

//Crea el suelo ( piso ) .
void sueloo(SDL_Rect *rectangulo,int cds) //Ver prototipo
{
     rectangulo->w=1;
     rectangulo->h=1;
     rectangulo->y=cds;
     for(int i=0;i<400;i++)
{
rectangulo->x=i;      
SDL_FillRect(superficie,rectangulo,0xFFFFFF);
}
     
 }
 
 //Modifica el tamaño de un rectangulo.
 void modtam(SDL_Rect *rectangulo,int w, int h) //Ver prototipo.
 
 {
      rectangulo->w=w;
      rectangulo->h=h;
     
  }
 
 
 
 
  //Mueve un rectango..
void moverd(SDL_Rect *personaje) // Ver prototipo
 {
     if(personaje->x<390)personaje->x+=10;
     SDL_FillRect(superficie,personaje,0xFF0000);
     SDL_Flip(superficie);
 }
 
 
 
 void moveri(SDL_Rect *personaje) // Ver prototipo
{
            if(personaje->x>10)personaje->x-=10;
     SDL_FillRect(superficie,personaje,0xFF0000);
     SDL_Flip(superficie);
 }
 
 
 
 
 
 
 
 
 
 //Restaura la superficie prinicipal
 void restaurar(SDL_Surface *superficie,SDL_Rect *rectangulo,int cds)
 {
      superficie=SDL_SetVideoMode(ANCHO,LARGO,24,NULL);
      sueloo(rectangulo,cds);
      SDL_Flip(superficie);
  }
 
 
 
 
  //Salto             -CORREGIR BUGUEADO.-
 
 
 
 
  void salto(SDL_Rect *personaje)
 {
       for(int i=7;i>0;i--)
       {
               if(personaje->x>390-7*8)
             
             
               {
                 
               
                   bandera=1;
                   SDL_Delay(50);
                 SDL_FillRect(superficie,personaje,0xFF0000);
                 SDL_Flip(superficie);
               }
               else
               {
                   
                                       
                                     restaurar(superficie,&suelo,cds);
                                     personaje->y-=10;
               personaje->x+=8;
               SDL_FillRect(superficie,personaje,0xFF0000);
           
                  SDL_Flip(superficie);
                     SDL_Delay(50);
                 
               }
               }
               
               
               if(bandera==0)
               {
                             if(personaje->x<390-7*8)
                for(int i=0;i<7;i++)
    {
                restaurar(superficie,&suelo,cds);
            personaje->y+=10;
            personaje->x+=8;
             SDL_FillRect(superficie,personaje,0xFF0000);
            SDL_Flip(superficie);
            SDL_Delay(50);
         
            }
            }else
            {
           
                 SDL_Delay(50);
                 SDL_FillRect(superficie,personaje,0xFF0000);
                 SDL_Flip(superficie);
           
            }
            bandera=0;
            }
       



void salto2(SDL_Rect *personaje)
{
   
       for(int i=7;i>0;i--)
       {
               if(personaje->x<1+7*8)
             
             
               {
                 
               
                   bandera=1;
                   SDL_Delay(50);
                 SDL_FillRect(superficie,personaje,0xFF0000);
                 SDL_Flip(superficie);
               }
               else
               {
                   
                                       
                                     restaurar(superficie,&suelo,cds);
                                     personaje->y-=10;
               personaje->x-=8;
               SDL_FillRect(superficie,personaje,0xFF0000);
           
                  SDL_Flip(superficie);
                     SDL_Delay(50);
                 
               }
               }
               
               
               if(bandera==0)
               {
                           // if(personaje->x<1+7*8)
                for(int i=0;i<7;i++)
    {
                restaurar(superficie,&suelo,cds);
            personaje->y+=10;
            personaje->x-=8;
             SDL_FillRect(superficie,personaje,0xFF0000);
            SDL_Flip(superficie);
            SDL_Delay(50);
         
            }
            }else
            {
           
                 SDL_Delay(50);
                 SDL_FillRect(superficie,personaje,0xFF0000);
                 SDL_Flip(superficie);
           
            }
            bandera=0;
            }
       


El error se proboca en la funcion salto 1 y salto 2 , para cualquiera que lo compile se va a dar cuenta que puede saltar en las partes del eje, pero no en los extremos, cuando salta en los extremos la cordenada x se buguea y puedes saltar por toda la superficie. un saludo gracias a todos.


Cuando hago los saltos , sin moverme con las flechitas (right y left),salta correctamente y no salta de más ni de menos, pero cuando me muevo en las cordenadas con las fechas cuando realizo el salto se ve que se en parte del eje x se buguea, debe de ser porque escribi mal las comprobaciones de los saltos, ya que el salto va de 8 en x y 1 en 1 , esto repetido 7 veces para completar el salto y para la bajada va desde 8 en x y disminuyendo 1 en 1.


Gracias a todos , son muy amables.

Almapa

Pero, una pregunta, quieres que salte en los límites la misma altitud tropezando contra el límite de la ventana y baje en vertical? He comprobado que cuando estás cerca de los límites se queda en una cierta altura y puedes seguir subiendo. Pero no entiendo exactamente que es lo que quieres hacer.

Almapa

#4
Me he dado cuenta que hay veces que cuando saltas puedes llegar a pasarte el límite de la superficie quedando el cuadrado cortado. No se si te referías a este fallo, pero se resuelve fácilmente añadiendo la siguiente comprobación:

if(personaje->x>=390)personaje->x=390;  

en la función de movimiento hacia adelante y

if(personaje->x<10)personaje->x=0;

en la función de movimiento hacia atrás limitando de este modo las coordenadas si ha habido algún error en las coordenadas de las x en algún momento, que parece estar en el salto.

El error del cálculo de la coordenada x puede ser que lo calcules como incrementos de +-8 (adelante/atrás respectivamente), esto hará que al final quede un número que no será múltiple de 10 y por ello se puede dar el caso de que sobrepase los límites de la superficie.

ThePinkPanther

muchas gracias..ya lo resolvi ...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL/SDL.h>
#define ANCHO 400
#define LARGO 400

//Variables globales
SDL_Surface *superficie,*icono; //Superficie principal.
SDL_Rect cuadrado,suelo; //Rectangulos
SDL_Event userevent; //Para registrar los eventos del usuario.
int cds=10*35; //Cordenadas del suelo
int bandera=0; //Esta bandera indica , si el salto se pudo realizar o no.


//--
//Prototipos
void modtam(SDL_Rect *,int , int); //Prototipo de la funcion modtam , que cambia el tamaño de un rect.Ancho y alto.
void modcor(SDL_Rect *,int , int);  //Prototipo de funcion que cambia las cordenadas de un rectangulo.
void sueloo(SDL_Rect *,int); //Prototipo de funcion , que crea el suelo.
void moverd(SDL_Rect *);
void moveri(SDL_Rect *) ; //Mueve el personaje o cuadrado en el eje x.( Simulacion de la accion caminar)(hacia la izquierda);
void restaurar(SDL_Surface *,SDL_Rect *,int ); //Restaura fondo original.
void salto(SDL_Rect *);
void salto2(SDL_Rect *);
// --




int main (int argc, char *argv[])
{
   
    //Inicio de sistemas, creacion de superficie principal,cambio de titulo.
    //Carga de las imagenes.
SDL_Init(SDL_INIT_VIDEO);
superficie=SDL_SetVideoMode(ANCHO,LARGO,24,0);
SDL_WM_SetCaption("Salto",NULL);

//



//Codigo general
//Crea el suelo,ajusta el tamaño del cuadrado(objeto), pone objetos en pantalla.
sueloo(&suelo,cds);
modtam(&cuadrado,10,10);
modcor(&cuadrado,1,cds-10);

//--------
//Variable que indica el final del programa
int final=1;
//--

//Comienza lectura de eventos..

do
{
      while (SDL_PollEvent(&userevent)) //Mientras aya eventos por parte del usuario -->
    {
           
           
           
            //Cambiamos el valor de final, si se registra el evento de cierre de pantalla.
            if(userevent.type==SDL_QUIT)final=0; //Cuando se lee el evento de cierre de ventana ( se cierra)
            if(userevent.type==SDL_KEYDOWN)
            {
            restaurar(superficie,&suelo,cds);
             if(userevent.key.keysym.sym==SDLK_RIGHT)moverd(&cuadrado);
             if(userevent.key.keysym.sym==SDLK_LEFT)moveri(&cuadrado);
             if(userevent.key.keysym.sym==SDLK_SPACE)salto(&cuadrado);
             if(userevent.key.keysym.sym==SDLK_d)salto(&cuadrado); //Salto hacia la derecha
             if(userevent.key.keysym.sym==SDLK_a)salto2(&cuadrado); //Salto hacia la izquierda
             }
             }
                                       
           
           
           
           
           
           
           
           
   
           
            SDL_Flip(superficie);
           
           
            }while(final);  //Mientras final sea igual a 1 se repite..






//Finaliza lecturas de eventos..





//Final del programa..


    return 0;
}
//





















//Codigo de las funciones..

//Modifica las cordenadas de un rectangulo.
void modcor(SDL_Rect *rectangulo,int x , int y) //Ver prototipo.
{
     rectangulo->x=x;
     rectangulo->y=y;
     SDL_FillRect(superficie,rectangulo,0xFF0000);
     
}

//Crea el suelo ( piso ) .
void sueloo(SDL_Rect *rectangulo,int cds) //Ver prototipo
{
      rectangulo->w=1;
      rectangulo->h=1;
      rectangulo->y=cds;
      for(int i=0;i<400;i++)
{
rectangulo->x=i;       
SDL_FillRect(superficie,rectangulo,0xFFFFFF);
}
     
  }
 
  //Modifica el tamaño de un rectangulo.
  void modtam(SDL_Rect *rectangulo,int w, int h) //Ver prototipo.
 
  {
       rectangulo->w=w;
       rectangulo->h=h;
       
   }
   
   
   
   
   //Mueve un rectango..
void moverd(SDL_Rect *personaje) // Ver prototipo
  {
      if(personaje->x<390)personaje->x+=10;
      SDL_FillRect(superficie,personaje,0xFF0000);
      SDL_Flip(superficie);
  }
 
 
 
  void moveri(SDL_Rect *personaje) // Ver prototipo
{
             if(personaje->x>10)personaje->x-=10;
      SDL_FillRect(superficie,personaje,0xFF0000);
      SDL_Flip(superficie);
  }
 
 
 
 
 
 
 
 
 
  //Restaura la superficie prinicipal
  void restaurar(SDL_Surface *superficie,SDL_Rect *rectangulo,int cds)
  {
       superficie=SDL_SetVideoMode(ANCHO,LARGO,24,NULL);
       sueloo(rectangulo,cds);
       SDL_Flip(superficie);
   }
   
   
   
   
   //Salto             -CORREGIR BUGUEADO.-
   
   
   
   
   void salto(SDL_Rect *personaje)
  {

                if(personaje->x>390 - (14 *8))
                {
                    bandera=1;
                    SDL_Delay(50);
                  SDL_FillRect(superficie,personaje,0xFF0000);
                  SDL_Flip(superficie);
                }
                else
                {
                     
                for(int i=7;i>0;i--)
                      {                       
                restaurar(superficie,&suelo,cds);
                personaje->y-=10;
                personaje->x+=8;
                SDL_FillRect(superficie,personaje,0xFF0000);
             
                   SDL_Flip(superficie);

                   
                }
                }
               
               
                if(bandera==0)
                {
                              if(personaje->x<390-7*8)
                 for(int i=0;i<7;i++)
     {
                 restaurar(superficie,&suelo,cds);
             personaje->y+=10;
             personaje->x+=8;
              SDL_FillRect(superficie,personaje,0xFF0000);
             SDL_Flip(superficie);

           
             
             }
             }else
             {
             
                  SDL_FillRect(superficie,personaje,0xFF0000);
                  SDL_Flip(superficie);
             
             }
             bandera=0;
             }
       



void salto2(SDL_Rect *personaje)
{
     
                if(personaje->x<1+14*8)
               
               
                {
                   
                 
                    bandera=1;
               
                  SDL_FillRect(superficie,personaje,0xFF0000);
                  SDL_Flip(superficie);
                }
                else
                {
                for(int i=7;i>0;i--)
                            {
                                       
                                      restaurar(superficie,&suelo,cds);
                                      personaje->y-=10;
                personaje->x-=8;
                SDL_FillRect(superficie,personaje,0xFF0000);
             
                   SDL_Flip(superficie);
                   
                }
                }
               
               
                if(bandera==0)
                {
                            // if(personaje->x<1+7*8)
                 for(int i=0;i<7;i++)
     {
                 restaurar(superficie,&suelo,cds);
             personaje->y+=10;
             personaje->x-=8;
              SDL_FillRect(superficie,personaje,0xFF0000);
             SDL_Flip(superficie);
           
             }
             }else
             {
             
                  SDL_FillRect(superficie,personaje,0xFF0000);
                  SDL_Flip(superficie);
             
             }
             bandera=0;
             }
       



saludos..