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..
(http://imageshack.us/scaled/landing/515/movimientoi.jpg)
Gracias de antemano y un saludo.
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
(http://i1280.photobucket.com/albums/a497/leosansan/parabola_zpsd2090fb1.jpg)
Saluditos!. ...(http://i1280.photobucket.com/albums/a497/leosansan/emoticonos37_zpsc49d66ee.gif)
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.
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.
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.
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..