elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema semicirculo para realizar un salto en video juego.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema semicirculo para realizar un salto en video juego.  (Leído 3,431 veces)
ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Problema semicirculo para realizar un salto en video juego.
« en: 14 Marzo 2013, 00:07 am »

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.


« Última modificación: 14 Marzo 2013, 00:15 am por ThePinkPanther » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema semicirculo para realizar un salto en video juego.
« Respuesta #1 en: 14 Marzo 2013, 04:08 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!. ...


« Última modificación: 14 Marzo 2013, 07:16 am por leosansan » En línea

ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Problema semicirculo para realizar un salto en video juego.
« Respuesta #2 en: 14 Marzo 2013, 05:51 am »

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..

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <SDL/SDL.h>
  5. #define ANCHO 400
  6. #define LARGO 400
  7.  
  8. //Variables globales
  9. SDL_Surface *superficie,*icono; //Superficie principal.
  10. SDL_Rect cuadrado,suelo; //Rectangulos
  11. SDL_Event userevent; //Para registrar los eventos del usuario.
  12. int cds=10*35; //Cordenadas del suelo
  13. int bandera=0; //Esta bandera indica , si el salto se pudo realizar o no.
  14.  
  15.  
  16. //--
  17. //Prototipos
  18. void modtam(SDL_Rect *,int , int); //Prototipo de la funcion modtam , que cambia el tamaño de un rect.Ancho y alto.
  19. void modcor(SDL_Rect *,int , int);  //Prototipo de funcion que cambia las cordenadas de un rectangulo.
  20. void sueloo(SDL_Rect *,int); //Prototipo de funcion , que crea el suelo.
  21. void moverd(SDL_Rect *);//Mueve el personaje o cuadrado en el eje x.( Simulacion de la accion caminar)(hacia la derecha);
  22. void moveri(SDL_Rect *) ; //Mueve el personaje o cuadrado en el eje x.( Simulacion de la accion caminar)(hacia la izquierda);
  23. void restaurar(SDL_Surface *,SDL_Rect *,int ); //Restaura fondo original.
  24. void salto(SDL_Rect *);
  25. void salto2(SDL_Rect *);
  26. // --
  27.  
  28.  
  29.  
  30.  
  31. int main (int argc, char *argv[])
  32. {
  33.  
  34.    //Inicio de sistemas, creacion de superficie principal,cambio de titulo.
  35.    //Carga de las imagenes.
  36. SDL_Init(SDL_INIT_VIDEO);
  37. superficie=SDL_SetVideoMode(ANCHO,LARGO,24,0);
  38. SDL_WM_SetCaption("Salto",NULL);
  39.  
  40. //
  41.  
  42.  
  43.  
  44. //Codigo general
  45. //Crea el suelo,ajusta el tamaño del cuadrado(objeto), pone objetos en pantalla.
  46. sueloo(&suelo,cds);
  47. modtam(&cuadrado,10,10);
  48. modcor(&cuadrado,1,cds-10);
  49. SDL_Flip(superficie);
  50. //--------
  51. //Variable que indica el final del programa
  52. int final=1;
  53. //--
  54.  
  55. //Comienza lectura de eventos..
  56.  
  57. do
  58. {
  59.      while (SDL_PollEvent(&userevent)) //Mientras aya eventos por parte del usuario -->
  60.    {
  61.  
  62.  
  63.  
  64.            //Cambiamos el valor de final, si se registra el evento de cierre de pantalla.
  65.            if(userevent.type==SDL_QUIT)final=0; //Cuando se lee el evento de cierre de ventana ( se cierra)
  66.            if(userevent.type==SDL_KEYDOWN)
  67.            {
  68.            restaurar(superficie,&suelo,cds);
  69.             if(userevent.key.keysym.sym==SDLK_RIGHT)moverd(&cuadrado); //mueve hacia la derecha el cuadrado
  70.             if(userevent.key.keysym.sym==SDLK_LEFT)moveri(&cuadrado); //mueve hacia la izquierda el cuadrado
  71.             if(userevent.key.keysym.sym==SDLK_SPACE)salto(&cuadrado);
  72.             if(userevent.key.keysym.sym==SDLK_d)salto(&cuadrado); //Salto hacia la derecha
  73.             if(userevent.key.keysym.sym==SDLK_a)salto2(&cuadrado); //Salto hacia la izquierda
  74.             }
  75.             }
  76.  
  77.  
  78.  
  79.            }while(final);  //Mientras final sea igual a 1 se repite..
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86. //Finaliza lecturas de eventos..
  87.  
  88.  
  89.  
  90.  
  91.  
  92. //Final del programa..
  93.  
  94.  
  95.    return 0;
  96. }
  97. //
  98.  
  99.  
  100. //Codigo de las funciones..
  101.  
  102. //Modifica las cordenadas de un rectangulo.
  103. void modcor(SDL_Rect *rectangulo,int x , int y) //Ver prototipo.
  104. {
  105.     rectangulo->x=x;
  106.     rectangulo->y=y;
  107.     SDL_FillRect(superficie,rectangulo,0xFF0000);
  108.  
  109. }
  110.  
  111. //Crea el suelo ( piso ) .
  112. void sueloo(SDL_Rect *rectangulo,int cds) //Ver prototipo
  113. {
  114.      rectangulo->w=1;
  115.      rectangulo->h=1;
  116.      rectangulo->y=cds;
  117.      for(int i=0;i<400;i++)
  118. {
  119. rectangulo->x=i;      
  120. SDL_FillRect(superficie,rectangulo,0xFFFFFF);
  121. }
  122.  
  123.  }
  124.  
  125.  //Modifica el tamaño de un rectangulo.
  126.  void modtam(SDL_Rect *rectangulo,int w, int h) //Ver prototipo.
  127.  
  128.  {
  129.       rectangulo->w=w;
  130.       rectangulo->h=h;
  131.  
  132.   }
  133.  
  134.  
  135.  
  136.  
  137.   //Mueve un rectango..
  138. void moverd(SDL_Rect *personaje) // Ver prototipo
  139.  {
  140.      if(personaje->x<390)personaje->x+=10;
  141.      SDL_FillRect(superficie,personaje,0xFF0000);
  142.      SDL_Flip(superficie);
  143.  }
  144.  
  145.  
  146.  
  147.  void moveri(SDL_Rect *personaje) // Ver prototipo
  148. {
  149.             if(personaje->x>10)personaje->x-=10;
  150.      SDL_FillRect(superficie,personaje,0xFF0000);
  151.      SDL_Flip(superficie);
  152.  }
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  //Restaura la superficie prinicipal
  163.  void restaurar(SDL_Surface *superficie,SDL_Rect *rectangulo,int cds)
  164.  {
  165.       superficie=SDL_SetVideoMode(ANCHO,LARGO,24,NULL);
  166.       sueloo(rectangulo,cds);
  167.       SDL_Flip(superficie);
  168.   }
  169.  
  170.  
  171.  
  172.  
  173.   //Salto             -CORREGIR BUGUEADO.-
  174.  
  175.  
  176.  
  177.  
  178.   void salto(SDL_Rect *personaje)
  179.  {
  180.        for(int i=7;i>0;i--)
  181.        {
  182.                if(personaje->x>390-7*8)
  183.  
  184.  
  185.                {
  186.  
  187.  
  188.                    bandera=1;
  189.                    SDL_Delay(50);
  190.                  SDL_FillRect(superficie,personaje,0xFF0000);
  191.                  SDL_Flip(superficie);
  192.                }
  193.                else
  194.                {
  195.  
  196.  
  197.                                      restaurar(superficie,&suelo,cds);
  198.                                      personaje->y-=10;
  199.                personaje->x+=8;
  200.                SDL_FillRect(superficie,personaje,0xFF0000);
  201.  
  202.                   SDL_Flip(superficie);
  203.                      SDL_Delay(50);
  204.  
  205.                }
  206.                }
  207.  
  208.  
  209.                if(bandera==0)
  210.                {
  211.                              if(personaje->x<390-7*8)
  212.                 for(int i=0;i<7;i++)
  213.     {
  214.                 restaurar(superficie,&suelo,cds);
  215.             personaje->y+=10;
  216.             personaje->x+=8;
  217.              SDL_FillRect(superficie,personaje,0xFF0000);
  218.             SDL_Flip(superficie);
  219.             SDL_Delay(50);
  220.  
  221.             }
  222.             }else
  223.             {
  224.  
  225.                  SDL_Delay(50);
  226.                  SDL_FillRect(superficie,personaje,0xFF0000);
  227.                  SDL_Flip(superficie);
  228.  
  229.             }
  230.             bandera=0;
  231.             }
  232.  
  233.  
  234.  
  235.  
  236. void salto2(SDL_Rect *personaje)
  237. {
  238.  
  239.        for(int i=7;i>0;i--)
  240.        {
  241.                if(personaje->x<1+7*8)
  242.  
  243.  
  244.                {
  245.  
  246.  
  247.                    bandera=1;
  248.                    SDL_Delay(50);
  249.                  SDL_FillRect(superficie,personaje,0xFF0000);
  250.                  SDL_Flip(superficie);
  251.                }
  252.                else
  253.                {
  254.  
  255.  
  256.                                      restaurar(superficie,&suelo,cds);
  257.                                      personaje->y-=10;
  258.                personaje->x-=8;
  259.                SDL_FillRect(superficie,personaje,0xFF0000);
  260.  
  261.                   SDL_Flip(superficie);
  262.                      SDL_Delay(50);
  263.  
  264.                }
  265.                }
  266.  
  267.  
  268.                if(bandera==0)
  269.                {
  270.                            // if(personaje->x<1+7*8)
  271.                 for(int i=0;i<7;i++)
  272.     {
  273.                 restaurar(superficie,&suelo,cds);
  274.             personaje->y+=10;
  275.             personaje->x-=8;
  276.              SDL_FillRect(superficie,personaje,0xFF0000);
  277.             SDL_Flip(superficie);
  278.             SDL_Delay(50);
  279.  
  280.             }
  281.             }else
  282.             {
  283.  
  284.                  SDL_Delay(50);
  285.                  SDL_FillRect(superficie,personaje,0xFF0000);
  286.                  SDL_Flip(superficie);
  287.  
  288.             }
  289.             bandera=0;
  290.             }
  291.  

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.
« Última modificación: 14 Marzo 2013, 05:59 am por ThePinkPanther » En línea

Almapa

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Problema semicirculo para realizar un salto en video juego.
« Respuesta #3 en: 14 Marzo 2013, 13:32 pm »

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.
En línea

Almapa

Desconectado Desconectado

Mensajes: 111


Ver Perfil
Re: Problema semicirculo para realizar un salto en video juego.
« Respuesta #4 en: 14 Marzo 2013, 13:53 pm »

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.
« Última modificación: 14 Marzo 2013, 14:10 pm por Almapa » En línea

ThePinkPanther

Desconectado Desconectado

Mensajes: 82



Ver Perfil
Re: Problema semicirculo para realizar un salto en video juego.
« Respuesta #5 en: 14 Marzo 2013, 17:17 pm »

muchas gracias..ya lo resolvi ...

Código:
#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..
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema en salto pidiendo computer name « 1 2 »
Ingeniería Inversa
DemSpeed 10 4,766 Último mensaje 25 Junio 2011, 03:14 am
por apuromafo CLS
problema para realizar este programa
Programación C/C++
tuinkinho 1 2,540 Último mensaje 8 Abril 2012, 21:14 pm
por durasno
Intento de realizar un juego
Programación C/C++
Blaster 0 1,850 Último mensaje 7 Octubre 2012, 15:09 pm
por Blaster
Necesito realizar un algoritmo del juego blackjack
Programación General
uffje_15 2 5,625 Último mensaje 7 Marzo 2013, 16:56 pm
por 1mpuls0
Programar salto juego de plataformas
Programación C/C++
erickgracia 2 4,027 Último mensaje 10 Abril 2015, 16:15 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines