[PSP] Ayuda portando juego SDL

EDITO el primer post para postear avances y añadir adjuntos:
ADJUNTO ACTUAL: ejemplo en el q vibra sin el eboot y el ejemplo q se ve el cursor con eboot ya compilado (aun no se puede usar el home y hay q apagar la PSP)
EDITO a las 9:02
He conseguido que muestre las 2 imagenes en el lugar que corresponde (y q feliz q me he sentido)
PEEERO... debo haber puesto mal pspdebugscreeninit o algo o el pause scekernelsleepthread (con las mayúsculas bien puestas en el codigo claro) porque el avión del jugador se "agita" y no deja moverlo y además el color rojo no desaparece... sigo intentándolo pero con más ánimo. Seguiré informando.
PD: le he hecho una foto con el movil x si qreis verlo
http://slaughtergames.atspace.com/Photo-0306.jpg (boton derecho... guardar destino como) los d atspace no dejan ver la foto sin pasar x la principal xo haciendo eso se puede guardar (asi no hago SPAM al no obligar a nadie a entrar en mi pagina)
(en el foro no se como ponerla más pequeña y se petaba el foro)



EDITO a las 10:55
Toqueteando el código y borrando el código que ponía un cuadro negro donde estaba el avión y cambiando de posición las funciones de salida (q aun se resisten) he conseguido que la pantalla no refresque y muestra los dos aviones Y se puede ver claramente en la esquina superior izquierda UN CURSOR como el de windows pero con los colores invertidos (borde blanco, relleno negro) y los controles siguen sin responder.
EDITO de nuevo:el cursor sale en la versión para windows ahora hay que encontrar el problema y eliminarlo.

A ver si consigo (o alguien me ayuda a) encontrar qué parte del código provoca esto y como quitarlo.

Sigo probando.









MENSAJE INICIAL:


Bueno, ya que no hay subforo de programación... aún, pongo aquí una de mis muchísimas dudas.

He adaptado el código de un ejemplo de programación sobre SDL de videojuegos que he adaptado para que funcione en la PSP (resoluciony el cygwin me da estos errores:

cygwin escribió:
Jorge@jorge-5dnlzb7ah ~/projects/ejemplo
$ make
psp-g++ -I. -I/usr/local/pspdev/psp/sdk/include -Wall -Wno-long-long -O2 -G0 -DJ
OY_YES -I/usr/local/pspdev/psp/include/SDL -Dmain=SDL_main -c -o main.o main.
cpp
csprite.h:46: error: ISO C++ forbids declaration of 'finalize' with no type
main.cpp: In function 'int SDL_main(int, char**)':
main.cpp:122: warning: too many arguments for format
make: *** [main.o] Error 1


Adjunto el código por si alguien quiere ayudarme, lo revise (es muy corto y simple)

Muchas gracias!

Adjuntos

Lo q t voy a decir lo mismo es una gilipollez enorme (ya q yo d la OOP pokito pokito y d la SDL menos xDD), pero prueba a añadirle "void" delante d la declaracion d la funcion finalize. El error q t da el compilador parece estar relacionado con q no tiene ninguna definicion d tipo esa funcion
Salu2
voy a intentarlo y espero q no sea unag gilipollez y pueda seguir XD

post data: en windows antes d cambiarle la resolucion y los controles rulaba sin errores asi q seara algo q hay q cambiar.

Ahora pongo si rula cambiando eso.

EDITO:
Haciendo lo q dices el cygwin devuelve esto:

cygwin escribió:Jorge@jorge-5dnlzb7ah ~/projects/ejemplo
$ make
psp-g++ -I. -I/usr/local/pspdev/psp/sdk/include -Wall -Wno-long-long -O2 -G0 -DJ
OY_YES -I/usr/local/pspdev/psp/include/SDL -Dmain=SDL_main -c -o main.o main.
cpp
main.cpp: In function 'int SDL_main(int, char**)':
main.cpp:122: warning: too many arguments for format
psp-g++ -I. -I/usr/local/pspdev/psp/sdk/include -Wall -Wno-long-long -O2 -G0 -DJ
OY_YES -I/usr/local/pspdev/psp/include/SDL -Dmain=SDL_main -c -o csprite.o cs
prite.cpp
csprite.cpp:53: error: ISO C++ forbids declaration of 'finalize' with no type
csprite.cpp:53: error: prototype for 'int CSprite::finalize()' does not match an
y in class 'CSprite'
csprite.h:46: error: candidate is: void CSprite::finalize()
csprite.cpp:53: error: 'int CSprite::finalize()' cannot be overloaded
csprite.h:46: error: with 'void CSprite::finalize()'
csprite.cpp: In member function 'int CSprite::finalize()':
csprite.cpp:58: warning: control reaches end of non-void function
make: *** [csprite.o] Error 1


umm a ver si alguien da una solución a mi problema
En el .cpp no lo has cambiado, solo lo has cambiado en el .h... nu se si sera eso
Salu2
en csprite.cpp solo aparece aquí:

CSprite::finalize() {

y ahi x supuesto no le puedo añadir el void


y en el main.cpp aparece aquí
void finaliza() {

// finalizamos los sprites
nave.finalize();
malo.finalize();

// cerramos el joystick
if (SDL_JoystickOpened(0)) {
SDL_JoystickClose(joystick);
}
}

pero ahi ya tendria q pillar la definicion y todo de csprite. Bueno eso es lo q yo pienso
zestt escribió:en csprite.cpp solo aparece aquí:
CSprite::finalize() {
y ahi x supuesto no le puedo añadir el void

Siento ser tan zopenco, pero xq no s podria poner void CSprite::finalize() { ? Ya t digo q d C++ muy pokito xD, prefiero C xD.
Salu2
bueno voy a hacer la prueba q me huelo q me vas a dejar mal...

X cierto yo de C++ tambien bien poco, lo q estoy aprendiendo SDL y se necesita un poco d conocimiento d esto y va dando pequeñas nociones (aunq no dice nada d compatibilidad con otras plataformas asi q poco pillo) Ahora t cuento

Offtopic: Eskema estás x ahi?


EDITO (uy q rapido soy :p ):
a ver... cambiandolo solo en el cpp da el mismo error q sin ponerlo. Ahora bien, al cambiarlo en los dos al mismo tiempo la salida es esta:

cygwin escribió:Jorge@jorge-5dnlzb7ah ~/projects/ejemplo
$ make
psp-g++ -I. -I/usr/local/pspdev/psp/sdk/include -Wall -Wno-long-long -O2 -G0 -DJ
OY_YES -I/usr/local/pspdev/psp/include/SDL -Dmain=SDL_main -c -o main.o main.
cpp
main.cpp: In function 'int SDL_main(int, char**)':
main.cpp:122: warning: too many arguments for format
psp-g++ -I. -I/usr/local/pspdev/psp/sdk/include -Wall -Wno-long-long -O2 -G0 -DJ
OY_YES -I/usr/local/pspdev/psp/include/SDL -Dmain=SDL_main -c -o csprite.o cs
prite.cpp
psp-gcc -I. -I/usr/local/pspdev/psp/sdk/include -Wall -Wno-long-long -O2 -G0 -DJ
OY_YES -I/usr/local/pspdev/psp/include/SDL -Dmain=SDL_main -L. -L/usr/local/psp
dev/psp/sdk/lib main.o csprite.o -lSDL_image -lpng -ljpeg -lz -lstdc++ -lSDL_m
ixer -lvorbisidec -lSDL_gfx -lSDL -L/usr/local/pspdev/psp/lib -lSDLmain -lSDL -l
m -L/usr/local/pspdev/psp/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisp
lay -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lc -lpspuser -lpsputility -lpspkerne
l -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lc -lpspnet -lpspnet_inet
-lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel -o ejemplo.
elf
/usr/local/pspdev/psp/sdk/lib/libSDLmain.a(SDL_psp_main.o): In function `main':
psp/SDL_psp_main.c:178: undefined reference to `SDL_main'
collect2: ld returned 1 exit status
make: *** [ejemplo.elf] Error 1


Creo q vamos x buen camino, a ver si me puedes decir algo de los demás errores q da. gracias BlackSith
El codigo en si, por lo que veo ya esta bien, y d hexo, ya crea los objects sin ningun problema (excceptuando un estupido warning q yo q tu todavia no l haria caso)
El problema s encuentra al añadir la libreria d la sdl (libSDLmain.a), q hace referencia a "SDL_main" (supongo q s trata d una funcion), q no esa definida. Asi q lo mas seguro es q t falte añadirselo en los includes. En esto no t puedo ayudar, ya q no tengo la SDL ni la he usado nunca. Pero q vaya, con una simple busqueda en el disco duro, activando la opcion d buscar dentro d los documentos, y poniendo como busqueda SDL_main, encontraras el .h q debes incluir. Aunq sospecho q sera el sdl.h, q ya tienes incluido :S. En fin, q esto ya es problema d la libreria y no d tu codigo, algo es algo xDD
Salu2
P.D.: Ves, ya m parecia raro q no l pudieras añadir el void [sati] xDDD

Si abrieran un subforo d programacion, yo no seria el unico q t contestaria, pero como no es el caso, este hilo s pierde en un mar d spam
Salu2
buah pos ya he intentado incluirla de mil formas y lo unico en claro que veo es que el problema está aquí:

/usr/local/pspdev/psp/sdk/lib/libSDLmain.a(SDL_psp_main.o): In function `main':
psp/SDL_psp_main.c:178: undefined reference to `SDL_main'
collect2: ld returned 1 exit status
make: *** [ejemplo.elf] Error 1


la libSDLmain.a la he abierto xo salen caracteres extraños mezclados con algunas notas aclaratorias... y el SDL_psp_main.c no lo he encontrado aun para mirarle la linea 178 q esta aqui jodiendo el invento.

Esperemos alguna respuesta en medio de este mar de spam (y mientras esperamos un subforo de programación verdad?)

A ver si Eskema se reconcilia con la PSP y me echa un cable ;)

Enga voy a probar cosas a ver si rula y posteo los avances





EDITO:
Ya he encontrado la librería, que estaba dentro de la carpeta trunk (pensaba que alli estaban solo las librerias al bajarlas d internet antes de compilarlas... :O )

La parte que cita el error es esta:
/* Functions registered with atexit() are called in reverse order, so make
sure that we register sceKernelExitGame() first, so that it's called last. */
atexit(sceKernelExitGame);
/* Make sure that _fini() is called before returning to the OS. */
atexit(_fini);
atexit(cleanup_output);

(void)SDL_main(argc, argv);

/* Delay 2.5 seconds before returning to the OS. */
sceKernelDelayThread(2500000);
return 0;
}


que trata de cuando se sale del juego (ya he probado a quitarle los parentesis y sigue igual).

¿Q hago/cambio/borro/reinstalo para q rule??
Prueba a cambiar esta linea en el makefile:
LIBS = -lSDL_image -lpng -ljpeg -lz -lstdc++ -lSDL_mixer -lvorbisidec -lSDL_gfx -lSDL $(shell $(PSPBIN)/sdl-config --libs)
a
LIBS = -lSDL_main -lSDL_image -lpng -ljpeg -lz -lstdc++ -lSDL_mixer -lvorbisidec -lSDL_gfx -lSDL $(shell $(PSPBIN)/sdl-config --libs)
Salu2
lo acabo d probar, devuelve esto:

Jorge@jorge-5dnlzb7ah ~/projects/ejemplo
$ make
psp-gcc -I. -I/usr/local/pspdev/psp/sdk/include -Wall -Wno-long-long -O2 -G0 -DJ
OY_YES -I/usr/local/pspdev/psp/include/SDL -Dmain=SDL_main -L. -L/usr/local/psp
dev/psp/sdk/lib main.o csprite.o -lSDL_main -lSDL_image -lpng -ljpeg -lz -lstd
c++ -lSDL_mixer -lvorbisidec -lSDL_gfx -lSDL -L/usr/local/pspdev/psp/lib -lSDLma
in -lSDL -lm -L/usr/local/pspdev/psp/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspg
e -lpspdisplay -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lc -lpspuser -lpsputility
-lpspkernel -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lc -lpspnet -lp
spnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel -
o ejemplo.elf
/usr/local/pspdev/lib/gcc/psp/4.0.2/../../../../psp/bin/ld: cannot find -lSDL_ma
in
collect2: ld returned 1 exit status
make: *** [ejemplo.elf] Error 1


¿Esta mal instalada o algo?
preguntale a sautlomalo seguro puede ayudarte , esta "haciendo" un juego.. y por lo que leo sabe mucho.. suerte :D
Y a Eskematico, q controla bien la SDL
Salu2
Bueno te cuento, yo lo he conseguido compilar, tienes mal lo siguiente:
  • Finalize sin tipo en .h y .cpp --> ponerle void antes
  • printf en linea 122 del main.cpp mal formateada falta el %s --> printf("No se puede inicializar el modo gráfico: %s\n", SDL_GetError());
  • Cambio los include por aunque puede que a tí si te compile así, depende de la configuración.
  • No has añadido la info del modulo en main.cpp:

    #include
    PSP_MODULE_INFO("ejemplo", 0, 1, 1);
  • Tambien deberías meter esto en el main.cpp para que funcione el botón home:
    int exit_callback(int arg1, int arg2, void *common) {
       sceKernelExitGame();
       return 0;
    }

    int CallbackThread(SceSize args, void *argp) {
       int cbid;
       cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
       sceKernelRegisterExitCallback(cbid);
       sceKernelSleepThreadCB();
       return 0;
    }

    int SetupCallbacks(void) {
       int thid = 0;
       thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11,
       0xFA0, 0, 0);
       if(thid >= 0) {
          sceKernelStartThread(thid, 0, 0);
       }
       return thid;
    }

Por ultimo he desechado tu makefile por este otro:
TARGET = ejemplo
PSPSDK = $(shell psp-config --pspsdk-path)

OBJS = csprite.o main.o

CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti

LIBS = -lstdc++ -lSDLmain -lSDL_image -lpng -ljpeg -lz -lSDL_ttf -lfreetype -lSDL_gfx -lm -lSDL -lpspvfpu -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lc -lpspuser -lpsputility -lpspkernel

ASFLAGS = $(CFLAGS)

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = ejemplo

include $(PSPSDK)/lib/build.mak


Y pon al principio del main() una llama a la función SetupCallbacks();

Espero que te sea de ayuda ZzzZZ
tio, ERES UN CRACK, ya me ha compilado!

llevaba unos dias buscando como incorporarle lo del home y ahora me ha quedado claro.

La mayoría de los fallos los había corregido en un programa igual escrito totalmente x mi, pero como no compilaba (supongo q por lo del home o algun descuido) hoy he cogido la fuente para win32 y la he convertido para PSP y no se en q pensaba xo me he olvidado del pspkernel :-| , lo he revisado un montón de veces y no me he dado cuenta xq pensando en el d ayer pensaba q ya estaba puesto.

X cierto me ha compilado solo con añadir el pspkernel y lo del home, ahora he corregido el resto de fallos para q rule bien.

Muchísimas gracias!! no sabes del atasco q me has sacado, casi reinstalo el psptoolchain...

t pondré en los créditos d mi juego x ayudarme en mis primeros pasos XD voy a probarlo en la PSP




EDITO:
en la psp no rula, al abrilo sale un pantallazo negro y a los 15 segundos se apaga, como si estubiera brickeada [uzi]

A ti en la PSP te funciona? si es asi ponme aquí el main.cpp por si he añadido mal el código q me has puesto.


Gracias!!
No funca, pero he encontrado algunos fallos más:
  • La resolución de video está mal:

    //screen = SDL_SetVideoMode(640,480,24,SDL_HWSURFACE);
    screen = SDL_SetVideoMode(480, 272, 32, SDL_HWSURFACE);
  • Para poder hacer los printf necesitas esto al principio del main.cpp, la función propia de C no funciona.

    #include
    #define printf pspDebugScreenPrintf

    y llama a pspDebugScreenInit(); al inicio del main();
  • Esto es para detener la ejecución del programa y ver que pasa en ese instante por la pantalla.
    #define pause sceKernelSleepThread
    y usa la función pause() donde la necesites, normalmente al final del main();
  • Acuerdate de meter las imagenes que usas también.

Haciendo todo esto se sigue viendo la pantalla en negro pero la psp no se bloquea como antes. (funciona el home)

Te recomiendo que como ya puedes compilar, hagas un ejemplo más sencillo y ve complicandolo, porque viendolo por encima no sabría decirte donde falla.
dreamk joer te as adelantado... :'( aqui esta callendo la del pulpo unos rayos ara a parao... emmm por cierto yo tb iba a decir lo de que le faltaban inicializar las callback de la psp ;)

edit: lo del pantallazo negro y que luego se apague suele ser una violación de segmento... has introducido las dependencias del juego ( si tiene porque no he mirao el código )
Joder Me siento mal leyendo este tipo de posts ... cuanto sabeis y yo aki sin saber C del todo :(... aver si vuelvo a sacar el libro de la biblioteca y me lo acabo q tube q dejarlo xD

Saulotmalo he visto los bocetos del juego y tal y tio ... eso promete
espero que sigas con la programación es algo que mola mucho (genial otra piraña en el acuario xD) en serio mola que la gente se interese por algo así.

lo del juego... si... tiene wena pinta a ver si puedo tener el subsistema de historia la semana que biene... entonces ya tendrá mejor pinta ;)
Si es q este zestt quiere correr mucho y empezar la casa por el tejado xD, esta noche q tendre la tool operativa ya le doy un vistazo a ver q mas cosas tienes mal por ahi
Eskema no me digas eso tio XD jeje era sencillamente una prueba, el codigo no es mio como ya habia dicho, es de un ejemplo de un libro de programación en SDL pero como no me compilaba ninguno escrito por mi, intenté adaptarlo para verlo en psp. Así me aseguraba q el código funcionaba y veia las diferencias entre la SDL de PC y la d psp.
Lo de la resolución lo arreglé justo después de subirlo a la web y no edite el adjunto [tomaaa] en el q t pase a ti Eskema estba corregido ya creo.
Lo de printf gracias por postearlo q no me acordaba d que librería era. Voy a cambiar todo eso q al menos aprenderé a hacer q me deje usar el home correctamente y luego me reviso todo el código a ver si consgo q eche a andar.

Luego me meto con un ejemplo más sencillo, pero me interesaba éste por el uso de la librería csprite.

Ahora edito el mensaje si consigo sacar algo, muchas gracias a todos

EDITO a las 9:02
He conseguido que muestre las 2 imagenes en el lugar que corresponde (y q feliz q me he sentido)
PEEERO... debo haber puesto mal pspdebugscreeninit o algo o el pause scekernelsleepthread (con las mayúsculas bien puestas en el codigo claro) porque el avión del jugador se "agita" y no deja moverlo y además el color rojo no desaparece... sigo intentándolo pero con más ánimo. Seguiré informando.
PD: le he hecho una foto con el movil x si qreis verlo
http://slaughtergames.atspace.com/Photo-0306.jpg (boton derecho... guardar destino como) los d atspace no dejan ver la foto sin pasar x la principal xo haciendo eso se puede guardar (asi no hago SPAM al no obligar a nadie a entrar en mi pagina)
(en el foro no se como ponerla más pequeña y se petaba el foro)



EDITO a las 10:55
Toqueteando el código y borrando el código que ponía un cuadro negro donde estaba el avión y cambiando de posición las funciones de salida (q aun se resisten) he conseguido que la pantalla no refresque y muestra los dos aviones Y se puede ver claramente en la esquina superior izquierda UN CURSOR como el de windows pero con los colores invertidos (borde blanco, relleno negro) y los controles siguen sin responder.
EDITO de nuevo:el cursor sale en la versión para windows ahora hay que encontrar el problema y eliminarlo.

A ver si consigo (o alguien me ayuda a) encontrar qué parte del código provoca esto y como quitarlo.

Sigo probando.
Aqui te dejo el main con todas las modificaciones, ahora deberia funcionar por webs, pruebalo y me dices algo


// Inicializamos estados
void inicializa() {
    //se me paso poner la iniciacion del joystick, es normal q no funcionara
    joystick=SDL_JoystickOpen(0);
    //ahora con esto deberia funcionar
   jugador.x=300;
   jugador.y=200;
   enemigo.x=100;
   enemigo.y=100;
}


void finaliza() {

   // finalizamos los sprites
   nave.finalize();
   malo.finalize();

   // cerramos el joystick
   if (SDL_JoystickOpened(0)) {
      SDL_JoystickClose(joystick);
   }
}



// Preparamos los esprites
int InitSprites() {

   fnave.load("minave.bmp");
   nave.addframe(fnave);

   fmalo.load("nave.bmp");
   malo.addframe(fmalo);

   return 0;
}


int exit_callback(int arg1, int arg2, void *common) {
   sceKernelExitGame();
   return 0;
}

int CallbackThread(SceSize args, void *argp) {
   int cbid;
   cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
   sceKernelRegisterExitCallback(cbid);
   sceKernelSleepThreadCB();
   return 0;
}

int SetupCallbacks(void) {
   int thid = 0;
   thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11,
   0xFA0, 0, 0);
   if(thid >= 0) {
      sceKernelStartThread(thid, 0, 0);
   }
   return thid;
}


int main(int argc, char *argv[]) {
SDL_Event event;
pspDebugScreenInit();
//Uint8 *keys; tampoco necesitas la variable keys


   if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0) {
      printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
      return 1;
   }
        //te recomiendo (480,272,8, SDL_HWSURFACE | SDL_HWPALETTE);
   screen = SDL_SetVideoMode(480, 272, 8, SDL_HWSURFACE | SDL_HWPALETTE);
   if (screen == NULL) {
      printf("No se puede inicializar el modo gráfico: %s\n",SDL_GetError());
      return 1;
   }

   atexit(SDL_Quit);

   inicializa();

   InitSprites();

   while (done == 0) {

      // dibujamos el frame
      DrawScene(screen);

      // consultamos el estado del teclado
      //no necesitas las teclas
      //keys=SDL_GetKeyState(NULL);

      // consultamos el estado del joystick
       //perfecto updateas el joystick en cada frame asi detectas las pulsaciones :)
      SDL_JoystickUpdate();

      joyx = SDL_JoystickGetAxis(joystick, 0);
      joyy = SDL_JoystickGetAxis(joystick, 1);

        //tan solo consultamos el pad de la psp y sus respectivos botones nada mas
        //analogico
       // if ((SDL_JoystickGetButton(joystick, PSP_BUTTON_UP) || joyy < -10) && (jugador.y > 0)) {jugador.y=jugador.y-(5);}
        //   if ((SDL_JoystickGetButton(joystick, PSP_BUTTON_DOWN) || joyy > 10) && (jugador.y < 230)) {jugador.y=jugador.y+(5);}
        //if ((SDL_JoystickGetButton(joystick, PSP_BUTTON_LEFT) || joyx < -10) && (jugador.x > 0)) {jugador.x=jugador.x-(5);}
       //   if ((SDL_JoystickGetButton(joystick, PSP_BUTTON_RIGHT) || joyx > 10) && (jugador.x < 450)) {jugador.x=jugador.x+(5);}


        if (SDL_JoystickGetButton(joystick, PSP_BUTTON_UP) && (jugador.y > 0)) {jugador.y=jugador.y-(5);}
        if (SDL_JoystickGetButton(joystick, PSP_BUTTON_DOWN) && (jugador.y < 230)) {jugador.y=jugador.y+(5);}
        if (SDL_JoystickGetButton(joystick, PSP_BUTTON_LEFT) && (jugador.x > 0)) {jugador.x=jugador.x-(5);}
        if (SDL_JoystickGetButton(joystick, PSP_BUTTON_RIGHT) && (jugador.x < 450)) {jugador.x=jugador.x+(5);}





      while (SDL_PollEvent(&event)) {

         if (event.type == SDL_QUIT) {done=1;}

             if (event.type == SDL_JOYBUTTONDOWN) {
                if (event.jbutton.button == PSP_BUTTON_START)
                  {
                            done = 1;
                  }

         }

      }
   }



   finaliza();

    SDL_Quit();  //necesitas cerrar la sdl
      sceKernelExitGame();  //y luego hacer q la psp vuelva al menu ;)
   return 0;

}





Saludos,
zestt no uses el mobil para exar fotos a la psp... si abres el homebrew con el irshell podrás capturar una imagen solo pulsando la tecla de sonido.

eskema tas metido en todos los fregaos xDD

ara mismo no sé si será el calor pero porque has puesto esto?

jugador.y=jugador.y-(5);

creo que (5) es == 5 en fin... si es por alguna causa comentalo
El (5) lo he puesto asi pq ya lo tenia en su codigo y no lo he tocado xD, de hecho segun el tutorial q esta siguiendo zestt lo pone asi yo habria puesto x+=5 pero bueno, mientras al chaval le funcione y vaya aprendiendo....
jeje ya te digo el += es más rápido aunque si lo compilas con el o2 seguramente ya se dé cuenta el compilador ... o no.... por si acaso yo pondría tb += soy un genio de la optimización algún dia veras tu biohazard rulando en mi mobil si consigo las fuentes... weno no que mi mobil tiene poca memoria y es para mejores juegos :P
A ver si te pillo por el msn y me das consejos para optimizar el trasto este, seguro q se puede hacer alguna cosilla para mejorar los bucles for q tengo y los switch
Pero coño, toda la programación para PSP es básicamente POO?
No me he metido en el rollo pk me daba un palo de cojones (estoy demasiado metido con Java y C/C++). Queria incarle un poco el diente a Borland en general (y sus metodos mas "personalizados") y mirar por encima Python, por su sencillez. Nada, solo para distraert un poco la mente.
La PSP me tenia "con la mosca en la nariz", pero al final lo deje estar hasta tener mas tiempo. De todas maneras... mi vena de programador se pone a 1000 cuando leo estos posts y me entran unas ganas que "paké"! xD

Como entorno usais el Cygwin? No me gusta demasiado pero...
Sabeis de algun otro entorno mas a lo "Eclipse" para hacerlo clasico, clasico? No me gusta el modo consola o modo bash...
Pero si no hay mas remedio... Me he acomodado demasiado! xDD

El material basico (los SDK) para PSP vienen en un paquete? Pim, PAM y lo demas es empezar a programar? Pk entonces quizas si que me meta a ello...
Tampoco soporto compilar en modo consola, prefiero usar un optimizador, pero bueno... Makefile tampoco es tan "malo"... Solo que el debugger me recuerda demasiado a los antiguos y me gusta mas verlo "on screen" con sus formatos corregidos y sin demasiadas gilipolleces... ^^

Saludos!
eskema acabo d llegar a casa, ahora voy a probar este nuevo código, pero decirte q parte del problema está en el makefile xq el q hay aquí colgado no tiene el JOY = YES q ayer no me lo cogist en el msn
Ahora pondré si rula, ayer al final lo q conseguí fue q se fuera el color rojo de los aviones xo sigue bloqueándose, así q... ahora pruebo tus modificaciones Eskema.


saulotmalo, aunque no te lo creas... aún no he probado el IRShell... y eso q tengo la PSP desde hace mucho... justo me bajé el 2.1 para ponerlo al fin y antes d ponerlo miro y acaban d sacar el 2.2 y entonces volví a aplazar su instalación (ahora estaba esperando a la 2.2 modificada para cargar desde la carpeta GAME y en español pero bueno, ya lo instaaalo) :P



Lightworker, el SDK se puede instalar en Eclipse pero los tutoriales q hay por ahi para instalarlo tienen los links petados... si esq estube buscándolo días XD en el emule tmb hay un pdf con el tuto xo los links tmb petados... asi q nos conformaremos cn el cygwin (si t sacas como instalarlo en Eclipse t hago una estatua tio).

Enga voy a probar cn l nuevo código del tito Eskema [rtfm] ahora posteo si hay mejora


EDITO:
con el nuevo codigo no se ve nada en pantalla y se sigue bloqueando

main.cpp escribió:/***************************************************************************
Ejemplo5_1
(C) 2003 by Alberto Garcia Serrano
Programación de videojuegos con SDL
***************************************************************************/

#include
#include
#include
#include "csprite.h"
#include "defines.h"
#include
PSP_MODULE_INFO("ejemplo", 0, 1, 1);
#include
#define printf pspDebugScreenPrintf

SDL_Surface *screen;
CFrame fnave;
CFrame fmalo;
CSprite nave(1);
CSprite malo(1);
SDL_Rect rectangulo;
SDL_Joystick *joystick;
int joyx, joyy;
int done=0;


// estructura que contiene la información
// de nuestro avión
struct minave {
int x,y;
} jugador;


// Estructura que contiene información
// del avión enemigo
struct naveenemiga {
int x,y;
} enemigo;




// Dibuja los esprites en la pantalla
void DrawScene(SDL_Surface *screen) {



// dibuja avión
nave.setx(jugador.x);
nave.sety(jugador.y);
nave.draw(screen);


// Dibuja enemigo
malo.setx(enemigo.x);
malo.sety(enemigo.y);
malo.draw(screen);

// ¿ha colisionado con la nave?
if (malo.colision(nave) == TRUE) {
done=1;
}

// Mostramos todo el frame
SDL_Flip(screen);
}


// Inicializamos estados
void inicializa() {
//se me paso poner la iniciacion del joystick, es normal q no funcionara
joystick=SDL_JoystickOpen(0);
//ahora con esto deberia funcionar
jugador.x=300;
jugador.y=200;
enemigo.x=100;
enemigo.y=100;
}


void finaliza() {

// finalizamos los sprites
nave.finalize();
malo.finalize();

// cerramos el joystick
if (SDL_JoystickOpened(0)) {
SDL_JoystickClose(joystick);
}
}



// Preparamos los esprites
int InitSprites() {

fnave.load("minave.bmp");
nave.addframe(fnave);

fmalo.load("nave.bmp");
malo.addframe(fmalo);

return 0;
}


int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}

int CallbackThread(SceSize args, void *argp) {
int cbid;
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}

int SetupCallbacks(void) {
int thid = 0;
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11,
0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
return thid;
}


int main(int argc, char *argv[]) {
SDL_Event event;
pspDebugScreenInit();
//Uint8 *keys; tampoco necesitas la variable keys


if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0) {
printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
return 1;
}
//te recomiendo (480,272,8, SDL_HWSURFACE | SDL_HWPALETTE);
screen = SDL_SetVideoMode(480, 272, 8, SDL_HWSURFACE | SDL_HWPALETTE);
if (screen == NULL) {
printf("No se puede inicializar el modo gráfico: %s\n",SDL_GetError());
return 1;
}

atexit(SDL_Quit);

inicializa();

InitSprites();

while (done == 0) {

// dibujamos el frame
DrawScene(screen);

// consultamos el estado del teclado
//no necesitas las teclas
//keys=SDL_GetKeyState(NULL);

// consultamos el estado del joystick
//perfecto updateas el joystick en cada frame asi detectas las pulsaciones
SDL_JoystickUpdate();

joyx = SDL_JoystickGetAxis(joystick, 0);
joyy = SDL_JoystickGetAxis(joystick, 1);

//tan solo consultamos el pad de la psp y sus respectivos botones nada mas
//analogico
// if ((SDL_JoystickGetButton(joystick, PSP_BUTTON_UP) || joyy < -10) && (jugador.y > 0)) {jugador.y=jugador.y-(5);}
// if ((SDL_JoystickGetButton(joystick, PSP_BUTTON_DOWN) || joyy > 10) && (jugador.y < 230)) {jugador.y=jugador.y+(5);}
//if ((SDL_JoystickGetButton(joystick, PSP_BUTTON_LEFT) || joyx < -10) && (jugador.x > 0)) {jugador.x=jugador.x-(5);}
// if ((SDL_JoystickGetButton(joystick, PSP_BUTTON_RIGHT) || joyx > 10) && (jugador.x < 450)) {jugador.x=jugador.x+(5);}


if (SDL_JoystickGetButton(joystick, PSP_BUTTON_UP) && (jugador.y > 0)) {jugador.y=jugador.y-(5);}
if (SDL_JoystickGetButton(joystick, PSP_BUTTON_DOWN) && (jugador.y < 230)) {jugador.y=jugador.y+(5);}
if (SDL_JoystickGetButton(joystick, PSP_BUTTON_LEFT) && (jugador.x > 0)) {jugador.x=jugador.x-(5);}
if (SDL_JoystickGetButton(joystick, PSP_BUTTON_RIGHT) && (jugador.x < 450)) {jugador.x=jugador.x+(5);}





while (SDL_PollEvent(&event)) {

if (event.type == SDL_QUIT) {done=1;}

if (event.type == SDL_JOYBUTTONDOWN) {
if (event.jbutton.button == PSP_BUTTON_START)
{
done = 1;
}

}

}
}



finaliza();

SDL_Quit(); //necesitas cerrar la sdl
sceKernelExitGame(); //y luego hacer q la psp vuelva al menu
return 0;

}



makefile escribió:TARGET = ejemplo
PSPSDK = $(shell psp-config --pspsdk-path)

OBJS = csprite.o main.o

JOY = YES
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti

LIBS = -lstdc++ -lSDLmain -lSDL_image -lpng -ljpeg -lz -lSDL_ttf -lfreetype -lSDL_gfx -lm -lSDL -lpspvfpu -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lc -lpspuser -lpsputility -lpspkernel

ASFLAGS = $(CFLAGS)

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = ejemplo

include $(PSPSDK)/lib/build.mak


EDITO de nuevo, cambiandole el mode de resolución a 24 (que es el de las imagenes) funciona perfectamente, excepto q no va el botón home y q el cursor sigue ahí arriba a la izquierda... riendose d mi XD. BIEN! se puede salir del juego chocando un avión contra el otro.

Por cierto va bastante lento, ahora miraré de optimizarlo y usar imagenes a 8 bits a ver si mejora.

OTRO EDIT XD:
ni con imagenes de 256 colores funciona el modo 8 bits... habra que quedarse ne 24.
De este ejemplo me gustaría simplemente
27 respuestas