Anuncios Google

Aprendiendo el control de botones.

Tutoriales Avanzados Homebrewes

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.

Procedimiento

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):

printf("Pulsa algun boton\n\n");
printf("Aplicacion gracias a sting18\n\n");

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!

4.51724
Tu voto: Ninguno Votos totales: 4.5 (58 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Ricx-Dark

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"

Imagen de sting18

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

Imagen de sisinio

.

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

 

Imagen de sting18

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.


Imagen de clizana

.

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/

Imagen de magicblack2009

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

Imagen de jaet1402

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

Imagen de sting18

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.


Imagen de roilivethelife

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

Imagen de sting18

No he usado suspender, pero

No he usado suspender, pero prueba con este a ver que tal te funciona y nos comentas.

Imagen de luisadniel

eres es autor, o es klozz

eres es autor, o es klozz

Imagen de sting18

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

Imagen de sting18

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.


Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.