Porque cuando pongo gravedad en vez de salirme abajo me sale arriba y luego le doy a la a para que salga el sprite saltando y me sale abajo?
Codigo:
// Includes
#include <PA9.h> // Include for PA_Lib
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"
#include "gfx(2)/all_gfx.c"
#include "gfx(2)/all_gfx.h"
u16 gravedad = 0;
s16 velocidad = 0;
s32 x = 10;
s32 y = 10;
// Function: main()
int main(int argc, char ** argv)
{
PA_Init(); // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL
PA_EasyBgLoad(1,3,dragon);
PA_LoadSpritePal(0,0,(void*)goku_Pal);
PA_CreateSprite(0,0,(void*)goku_Sprite,OBJ_SIZE_32X64,1,0,50,50);
PA_StartSpriteAnim(0,0,0,6,1);
// Infinite loop to keep the program running
while (1)
{
x += Pad.Held.Right - Pad.Held.Left;
velocidad += gravedad;
y += velocidad;
PA_SetSpriteXY(0,0,x,y>>8);
if (y > 192){
gravedad = 0;
velocidad = 0;
}
if (Pad.Held.A){
PA_DeleteSprite(0,0);
PA_LoadSpritePal(0,1,(void*)saltando_Pal);
PA_CreateSprite(0,1,(void*)saltando_Sprite,OBJ_SIZE_32X64,1,1,50,50);
PA_StartSpriteAnim(0,1,0,6,1);
}
PA_WaitForVBL();
}
return 0;
} // End of main()
hola
este codigo tuyo lo he probado y aparece un grafico arriba y al pulsar A baja un poco luego ya no se mueve...
No he hecho ningun juego en que se utilize gravedad pero debes diferenciar en el programa cuando el personaje esta saltando o normal. En el momento que pulses A el jugador debe tener estado SALTANDO, y partir de una fuerza inicial de salto, a medida que el jugador deje el contacto con el suelo, debe ya aplicarse la ley de la gravedad. para eso te recomiendo que utilices la formula de movimiento parabólico o si mueves el jugador hacia los lados la formula de lanzamiento vertical con caida libre de cuerpos. Finalmente, cuando el muñeco llegue al nivel del suelo, debe volver al estado NORMAL.
Para aplicar la formula,
s(t) = so + Vo*t + (1/2)*a*t^2
donde:
s - es la posicion x del muñeco para t(x).
so - es la posicion x inicial.
vo - fuerza de salto inicial.
a - 9.8 es la fuerza de la gravedad en la tierra.
^ significa al cuadrado.
t es el tiempo, en el momento que se pulsa A se debe poner a cero, y a cada scan incrementar esta variable (recuerda que hay 60 scans por segundo por si te sirve...)
Supongo que hay formas mas faciles de hacerlo pero no las he utilizado...
Visita mi blog. Zenit + 5 will win
Uff que difícil como dices
Uff que difícil como dices hay formas más fáciles de hacerlo pero el error si se le puede llamar así porque el realidad la DS hace lo que él dice.
Aver explico al principio creas dos variables de personaje la x y la y mi pregunta es: ¿Para que? si no las vuelves a usar en todo el código.
Tu problema esque usas posiciones fijas para el sprite x=50 y=50 lo que tendrias que hacer al crear el sprite es esto:
PA_CreateSprite(0,0,(void*)goku_Sprite,OBJ_SIZE_32X64,1,0,x,y);
Para que el código de gravedad haga algún efecto.Tienes unos cuantos fallos más uno de ellos es que antes de borrar un sprite que estuviese animado lo tienes que borrar con
PA_StopSpriteAnim
y luego borrarlo porque si no da fallos y luego los PA_LoadSpritePal se ponen arriba todos juntos no antes de que crees el sprite. Bueno creo que esto es todo pruebalo y comenta espero que te haya servido Salu2.Gracias, pero lo he hecho de
Gracias, pero lo he hecho de otra manera y me funciona, pero quiero poner el sprite mas arriba, que debo cambiar?
Codigo:
// Includes#include <PA9.h> // Include for PA_Lib
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"
typedef struct{
s32 x, y;
s32 vy;
} gokutype;
gokutype goku;
#define GRAVITY 48
void Movegoku(void);
// Function: main()
int main(int argc, char ** argv)
{
PA_Init(); // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL
PA_InitText(1, 0);
PA_LoadSpritePal(0, 0, (void*)goku_Pal);
goku.x = 0<<8; goku.y = (192-32)<<8;
goku.vy = 0;
PA_CreateSprite(0, 0,(void*)goku_Sprite, OBJ_SIZE_32X64,1, 0, goku.x>>8, goku.y>>8);
while (1)
{
Movegoku();
PA_SetSpriteXY(0, 0, goku.x>>8, goku.y>>8);
PA_WaitForVBL();
}
return 0;
}
void Movegoku(void){
if(Pad.Newpress.Right) {
PA_StartSpriteAnim(0, 0, 0, 1, 6);
PA_SetSpriteHflip(0, 0, 0);
}
else if(Pad.Newpress.Left) {
PA_StartSpriteAnim(0, 0, 0, 1, 6);
PA_SetSpriteHflip(0, 0, 1);
}
if ((Pad.Newpress.A) && (goku.vy == 0)){
goku.vy = -1000;
}
goku.x += (Pad.Held.Right - Pad.Held.Left)<<8;
goku.vy += GRAVITY;
goku.y += goku.vy;
if (goku.y >= (192-32)<<8) {
goku.y = (192-32)<<8;
goku.vy = 0;
}
if (goku.vy != 0) PA_SetSpriteAnim(0, 0, 2);
else if(!((Pad.Held.Left)||(Pad.Held.Right))) PA_SetSpriteAnim(0, 0, 0);
} // End of main()
Al final usaste el ejemplo de
Al final usaste el ejemplo de C:\devkitPro\palib\examples\Demos\PlatformGame\PlatformGame no te entiendo con lo de poner el sprite más arriba... Si te refieres a que salte más la línea
goku.vy = -1000
sustituye ese valor por valores que se acerquen mas a -∞ Salu2.Yo creo que se refiere a que
Yo creo que se refiere a que el personaje (goku) aparezca más arriba de donde aparece, no tan pegado a la parte de abajo de la pantalla.
El otro día descubrí como hacerlo, pero no me acuerdo xD, así que debes esperar a que alguien te conteste.
EDIT: Debes cambiar esto:
goku.vy += GRAVITY;
goku.y += goku.vy;
if (goku.y >= (192-32)<<8) {
goku.y = (192-32)<<8;
goku.vy = 0;
}
Esos dos 192 los debes cambiar por un número menor para que aparezca más arriba.
Espero serte de ayuda :)
¿Quieres estar totalmente informado sobre el universo 3DS? Visita Magic3DS.
También puedes estar al tanto de toda la actualidad de 3DS en Twitter: @Magic3DS
Ya lo puse, cuando mejore el
Ya lo puse, cuando mejore el homebrew lo posteo :)
Te linkeo
al Día 5, que tiene un apartado dedicado a la gravedad:
http://nds.scenebeta.com/tutorial/palib-b%C3%A1sico-d%C3%AD-5
Salu2