Autor
|
Tema: Problema semicirculo para realizar un salto en video juego. (Leído 3,431 veces)
|
ThePinkPanther
Desconectado
Mensajes: 82
|
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
Mensajes: 1.314
|
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: 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
Mensajes: 82
|
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.
|
|
« Última modificación: 14 Marzo 2013, 05:59 am por ThePinkPanther »
|
En línea
|
|
|
|
Almapa
Desconectado
Mensajes: 111
|
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
Mensajes: 111
|
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
Mensajes: 82
|
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..
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema en salto pidiendo computer name
« 1 2 »
Ingeniería Inversa
|
DemSpeed
|
10
|
4,766
|
25 Junio 2011, 03:14 am
por apuromafo CLS
|
|
|
problema para realizar este programa
Programación C/C++
|
tuinkinho
|
1
|
2,540
|
8 Abril 2012, 21:14 pm
por durasno
|
|
|
Intento de realizar un juego
Programación C/C++
|
Blaster
|
0
|
1,850
|
7 Octubre 2012, 15:09 pm
por Blaster
|
|
|
Necesito realizar un algoritmo del juego blackjack
Programación General
|
uffje_15
|
2
|
5,625
|
7 Marzo 2013, 16:56 pm
por 1mpuls0
|
|
|
Programar salto juego de plataformas
Programación C/C++
|
erickgracia
|
2
|
4,027
|
10 Abril 2015, 16:15 pm
por ivancea96
|
|