Llega una nueva entrega de los nuevos tutos de C. Hoy nos toca aprender el funcionamiento de los botones de la PSP conbinado con el tuto pasado de mostrar texto para que a la hora de pulsar un boton muestre un texto. Espero que os resulte util, pues este paso es esencial en cualquier homebrew que hagais, y como siempre, si teneis dudas, a preguntar sin miedo.
Autor: sting18.
A partir de este tutorial, los pasos son mucho menos explicitos para que no se extienda mucho el tutorial. Si teneis dudas, las comentais. ¡Vamos!
Cargamos las librerias necesarias.
#include <pspkernel.h> #include <pspdebug.h> #include <pspctrl.h>
La ultima libreria es la encargada de los controles.
Procedemos a poner la informacion como el tuto pasado.
PSP_MODULE_INFO("Tester", 0, 1, 1); PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
Ponemos nuestra PSP en modo usuario. Esto sirve para las funciones basicas. Si en cambio queremos realizar cosas como lanzar isos o capturas de pantalla, debemos ponerla en modo kernel.
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
Definimos el print.
#define printf pspDebugScreenPrintf
Ahora el codigo para salir con el boton HOME.
int exit_callback(int arg1, int arg2, void *common) { sceKernelExitGame(); return 0; } /* Llamada thread */ int CallbackThread(SceSize args, void *argp) { int cbid; cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL); sceKernelRegisterExitCallback(cbid); sceKernelSleepThreadCB(); return 0; } /* Configura llamada thread y vuelve a su thread id */ int SetupCallbacks(void) { int thid = 0; thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0); if(thid >= 0) { sceKernelStartThread(thid, 0, 0); } return thid; }
Comenzamos la funcion principal (main).
int main() {
Iniciamos la pantalla y la salida con HOME.
pspDebugScreenInit(); SetupCallbacks();
Ahora viene algo nuevo: la llamada a los botones.
SceCtrlData pad;
Imprimimos algo ("\n\n" sirve para saltar una linea como la tecla ENTER):
Comenzamos un bucle infinito para que el codigo se repita sin fin (tambien conocido como "loop").
while(1) {
Ahora activamos los controles dentro del bucle while.
sceCtrlReadBufferPositive(&pad, 1);
Ahora lo que haremos será decirle a la PSP mediante codigo que cuando se pulse un botón se imprima algo en pantalla (en este caso, imprimiremos el nombre del boton que se pulsa).
if(pad.Buttons & PSP_CTRL_CROSS){ //SI PULSAMOS EQUIS!! pspDebugScreenClear(); //Limpia la pantalla de texto printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n EQUIS"); //imprime EQUIS en pantalla, para decirnos que la hemos pulsado } //cerramos la funcion del if, de si pulsamos X if(pad.Buttons & PSP_CTRL_CIRCLE){ //SI PULSAMOS CIRCULO!! pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n CIRCULO"); } if(pad.Buttons & PSP_CTRL_SQUARE){ //SI PULSAMOS CUADRADO!! pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n CUADRADO"); } if(pad.Buttons & PSP_CTRL_TRIANGLE){ //SI PULSAMOS TRIANGULO pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n TRIANGULO"); } if(pad.Buttons & PSP_CTRL_LTRIGGER){ //SI PULSAMOS L pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n L"); } if(pad.Buttons & PSP_CTRL_RTRIGGER){ //SI PULSAMOS R pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n R"); } if(pad.Buttons & PSP_CTRL_START){ //SI PULSAMOS START pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n START"); } if(pad.Buttons & PSP_CTRL_SELECT){ //SI PULSAMOS SELECT pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n SELECT"); } if(pad.Buttons & PSP_CTRL_UP){ //SI PULSAMOS ARRIBA EN EL PAD pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ARRIBA"); } if(pad.Buttons & PSP_CTRL_DOWN){ //SI PULSAMOS ABAJO EN EL PAD pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ABAJO"); } if(pad.Buttons & PSP_CTRL_LEFT){ //SI PULSAMOS IZQUIERDA EN EL PAD pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n IZQUIERDA"); } if(pad.Buttons & PSP_CTRL_RIGHT){ //SI PULSAMOS DERECHA EN EL PAD pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n DERECHA"); } if(pad.Buttons & PSP_CTRL_HOME){ //SI PULSAMOS HOME pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n HOME"); } if(pad.Buttons & PSP_CTRL_HOLD){ //SI LA PONEMOS EN HOLD pspDebugScreenClear(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n HOLD"); } } // aqui se cierra el bucle principal o loop.
Más adelante aprenderemos a imprimir con coordenadas (x,y) para no estar poniendo constantemente las "\n".
Terminamos la función main.
return 0; }
Creamos el makefile.
TARGET = Testeador OBJS = main.o CFLAGS = -O2 -G0 -Wall CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti ASFLAGS = $(CFLAGS) EXTRA_TARGETS = EBOOT.PBP PSP_EBOOT_TITLE = Testeador PSPSDK=$(shell psp-config --pspsdk-path) include $(PSPSDK)/lib/build.mak
Y ya está.
Espero que os sea util. Si teneis dudas solo comentad. ¡Hasta el proximo tuto!
Comentarios
Creo que es importante decir
Creo que es importante decir que al precionar dos omas botones a la vez se pondria:
if ((pad.Buttons & PSP_CTRL_RTRIGGER) & (pad.Buttons & PSP_CTRL_CROSS)) {
pspDebugScreenClear();
printf("Estas precionando: el boton L y el boton X"); }
almenos yo me pregunte esto y lo averigue ;)
Ricx-Dark
"El conocimiento es poder: no lo malgastes ni un solo dia aprende, aprende, aprende!"
"Para un soldado el arma es su vida pero este da muerte a los demas"
Perfecto ricx gracias por
Perfecto ricx gracias por apuntar tus datos ;)
error
alguien me podria pasar el main.c ya terminado ?? esque no lo puedo compilar
no puedo compilar
me pueden pasar el main.c ya terminadoo
esque no puedo compilar
.
Se me crashea la PSP al salir con el Home :$
Editado: Lo he arreglado quitando el code de que si pulsas Home se muestre en pantalla "Home", sin embargo ¿ alguien me puede explicar el porque se crasheaba ? (estoy aprendiendo C y quiero saber de los errores...)
-> Creaciones <-
Os invito a probar el lol xD
http://signup.leagueoflegends.com/?ref=50814a20894be236637679
Pues depende de muchas de
Pues depende de muchas de muchas cosas una podria ser los plugins como el game category o como se llame ese de ordenar por carpetas xD, otra podria ser la version de CF de tu psp ya que unas estan un poco incompletas, otra podria ser el modelo de tu psp , los programadores tienen que ir probrando sus HB en todos los modelos de psp y verciones de CF ya que no siempre son compatibles con uno u otro, por eso en ocaciones varios HB dicen que no son compatibles con tal modeo o vercion he incluso algunos dicen que solo an sido probados en X version o modelo o que si pruebas en otro CF que avises si funciona o cosas asi.
.
O simplemente podrían debuguear el programa y así revisar por qué se crashea la psp. (No recuerdo el nombre porque hace tiempo que no hago nada en la psp pero solía utilizar algo para debuguear los programas en C o Lua desde el computador conectado con la psp y se ejecutaban los programas sin necesidad de estar compilando y pasandolo a la ms).
Aunque como dicen, seguramente es problema de tu CF. De todas formas si desarrollan en C les recomendaría aprender a debuguear, les ahorrará un montón de tiempo.
Version Actual GoearPSP: Descontinuado
http://dev.cristian.lizana.in/
Buen tuto, estoy aprendiendo
Buen tuto, estoy aprendiendo bastante sobre la programación de PSP en C estos días, a ver si pronto tengo unos pocos más de conocimientos y puedo hacer un hombrew medianamente decente :D.
Salu2!
¿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
Pregunta...
Saludos amigo Sting.. Mi pregunta es la siguiente: siguiendo estos tutoriales se pueden cambiar la configuracion de los botones? Te cuento, tengo una psp 3001, y desde que la compre nunca sale de un juego por el boton "Home" sino por los botones de "pantalla" y "musica". Hay forma de remediar este problema? Gracias
PSP 2001+4Gb+5.03M33-6
PSP 3001+4GB+6.35 Pro Hen
Pues al menos que agas un
Pues al menos que agas un plugin que cambie la configuracion de los botones , asta creo que ya hay uno no estoy seguro pero con este tuto no se puede :S.
cuando hago bucles infinitos
cuando hago bucles infinitos para leer botones, si suspendo la psp en ese bucle se cuelga.
Aunque eso me pasa usando oslib
No he usado suspender, pero
No he usado suspender, pero prueba con este a ver que tal te funciona y nos comentas.
eres es autor, o es klozz
eres es autor, o es klozz
Soy el autor de los demas
Soy el autor de los demas tambien xD klozz hizo el de instalar el entorno de programacion y unos de oslib.
Error de compilación (Solucionado)
hola, a ver si alguien puede decirme a que se debe esto que me dice el compilador.
main.c:104:5 warning: no newline at end of file
main.c: In function 'main':
main.c:104: error: expected declaration or statement at end of input
make: *** [main.o] Error 1
Bueno al final me di cuenta del fallo me faltaba un } al final del primer if, el de cuando apretas la X
Perfecto lo mejor es darce
Perfecto lo mejor es darce cuanta uno mismo de los errores ya que entre mas grande el codigo es mas dificil ayudar a los programadodes con su codigo :D.