En esta entrega vamos a aprender como crear un menú con imagenes para que nuestra aplicación casera tenga un entorno gráfico más agradable. Esto es esencial. Cualquier coder que se precie debe tener una aplicación con una interfaz gráfica agradable, comoda y organizada. Vamos a utilizar la misma librería de antes, graphics.h, que se vuelve a incluir en una descarga del paquete necesario para hacer este tuto. Como siempre, descargas al final del tuto.
Autor: sting18.
Incluimos las librerías necesarias, que son estas:
#include <pspkernel.h> #include <pspdebug.h> #include <pspctrl.h> #include <pspaudio.h> #include <pspaudiolib.h> #include <psppower.h> #include "graphics.h"
¡Tenemos nueva lib! Esta vez se trata de psppower.h, cuya función es aumentar la CPU de la PSP a 333 (máximo). Esto es indispensable para tareas duras, como reproducir sonidos (que veremos más adelante).
Continuamos:
PSP_MODULE_INFO("Menu_Imagenes",0, 1, 0); PSP_HEAP_SIZE_KB(20480);
Hemos añadido una linea nueva, que nos servirá para poder firmar nuestra app (más adelante) y otra linea tambien en el makefile para que no nos marque error.
Asignamos las imagenes que usaremos:
Image*menu1,*menu2,*menu3,*menu4;
Ahora designamos variables para guardar los numeros enteros que usaremos:
int arriba=1,abajo=1,seleccionar=1;
Cargamos las variables de los controles:
SceCtrlData currentPad, lastPad, pad;
Continuamos. Botón HOME:
/* Llamada de salida */ 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; }
Vamos con lo siguiente (prestad atención a esto):
void jugar() {arriba = 1;abajo = 1;seleccionar = 1; blitAlphaImageToScreen(0 ,0 ,480,272,menu1, 0,0);flipScreen();} void controles(){arriba = 2;abajo = 2;seleccionar = 2; blitAlphaImageToScreen(0 ,0 ,480,272,menu2, 0,0);flipScreen();} void creditos() {arriba = 3;abajo = 3;seleccionar = 3; blitAlphaImageToScreen(0 ,0 ,480,272,menu3, 0,0);flipScreen();} void salir() {arriba = 4;abajo = 4;seleccionar = 4; blitAlphaImageToScreen(0 ,0 ,480,272,menu4, 0,0);flipScreen();}
"Void" designa una función, pero que no recibe variables o parametros, sino que esta "vacía". Para los que programan en Lua les resultará facil. Es, traducido a Lua, como "function" a secas. Si no lo entiendes ahora, no tiene importancia, ya lo entenderás.
Vamos con la principal.
int main() {
Listo. Ahora usemos toda la potencia de la PSP poniendo la CPU a 333.
scePowerSetClockFrequency (333, 333, 166);
Iniciamos los gráficos y la salida con HOME.
initGraphics(); SetupCallbacks();
Y cargamos las imágenes.
menu1 = loadImage("Imagenes/menu1.png"); menu2 = loadImage("Imagenes/menu2.png"); menu3 = loadImage("Imagenes/menu3.png"); menu4 = loadImage("Imagenes/menu4.png");
Ahora cargamos los controles (fuera del bucle infinito):
sceCtrlReadBufferPositive(&lastPad, 1);
Ahora iniciamos la función designada anteriormente para que empiece la fiesta =D
jugar();
Y comenzamos un bucle infinito:
while(1) {
Cargamos los controles:
sceCtrlReadBufferPositive(¤tPad,1);
Ahora veremos una función nueva, llamada switch, ¿que hace esto? Pues es una sentencia de selección. Permite seleccionar las acciones a realizar dependiendo del valor de una variable. Mira el code:
if( currentPad.Buttons != lastPad.Buttons ) { lastPad = currentPad; if(currentPad.Buttons & PSP_CTRL_DOWN) {switch(abajo){ case 1:controles();break; case 2:creditos();break; case 3:salir();break; case 4:jugar();break; } } if(currentPad.Buttons & PSP_CTRL_UP) {switch(arriba){ case 1:salir();break; case 2:jugar();break; case 3:controles();break; case 4:creditos();break; } } /* if(currentPad.Buttons & PSP_CTRL_CROSS) {switch(seleccionar){ case 1: case 2: case 3: case 4: } }*/ }
El lastPad sirve para que no se repita una opción si se deja pulsado el boton, solo una vez. El switch de despues determina el valor de la variable, y dependiendo de cual sea muestra una imagen diferente que asignes.
Tambien en el switch pusimos las variables que es la que marca el "case" en el que estamos. Hemos puesto codigo entre /* y */ para que se tome como comentario, pues todavía no tenemos ningun "case" para cuando se pulse X. Esto es util para ir desarrollando un programa por partes si quieres ser organizado sin perder tus ideas por el camino.
Cerramos el main:
} return 0; }
Creamos el makefile:
TARGET = Menu_Imagenes OBJS = main.o graphics.o framebuffer.o CFLAGS = -O2 -G0 -Wall CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti ASFLAGS = $(CFLAGS) BUILD_PRX = 1 PSP_FW_VERSION = 371 LIBDIR = #Aqui incluiremos libs necesarias LIBS = -lpspgu -lpng -lz -lm -lmad -lpsppower LDFLAGS = EXTRA_TARGETS = EBOOT.PBP PSP_EBOOT_TITLE = Menu-Imagenes PSPSDK=$(shell psp-config --pspsdk-path) include $(PSPSDK)/lib/build.mak
Este makefile está adaptado para correr nuestra aplicación en CUALQUIER PSP, CUALQUIER OFW hasta la fecha, sin tener que usar un CFW ni nada por el estilo. Esto es muy util para muchos y sin duda, hará ganar muchos más usuarios que usen el homebrew que si no estuviera firmado (Signed).
Esto ha sido todo en esta entrega, espero que os resulte útil. ¡Hasta la próxima entrega!
Descargar Archivos Necesarios (Sólo Usuarios Registrados).
Comentarios
Oye!!!
oye me gustan tus tutoriales!!!
cuando vas a empeser los de poner sonidos y me prguntaa si ias a ser uno de sprites gracia
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"
No se si los ponga aqui pero
No se si los ponga aqui pero en la pagina oficial oficial de teammex se actualiza cada mes con los tutos mios y de klozz , ya klozz tiene de sprites con oslib y varias cosas mas.
.
¿ Y estas dos libs para que sirven ? ¿ algo relacionado con el audio ?
#include <pspaudio.h> #include <pspaudiolib.h>Están de más... No es
Están de más... No es necesario que las incluyas.
Haber si alguien se anima ha hacer un tuto sobre audio en PSP que no sea con OSLib. Ahí queda :p
Ok solo espera a que suban un
Ok solo espera a que suban un HB que hice en portada y pongo el tuto de audio.
Oye sting18!!! :)
cuando vas a poner sobre el audio?????
aaaa y megustaria que hicieras uno de sprites para hacer un juego gracias!!! :)
OK. Por mi parte te lo
OK. Por mi parte te lo agradecería mucho, ya que en OSLib es muy sencillo pero da errores MUYMUY raros a la hora de ejecutar el programa cuando muestro imágenes... errores que el compilador no marca ni como "error" ni como "warning".
Yo soi partidario de utilizar las librerías que ya bienen con el SDK.
Saludos sting18.
Si perfecto ;), solo eso si
Si perfecto ;), solo eso si te digo reproducir en varios canales es todo un show xD no are el tuto de muchos canales ya que tardaria mucho y seria una paginota de tuto jajaja pero ve aprendiendo las estructuras de los threder ;).
Fiuuu....
Madre..... si solo con ver el code da espasmo, xD
Sep
Sep
pues a mi no me funciona esto
pues a mi no me funciona esto del menu... cuando pongo el hombrew en la psp y lo inicio, se me queda colgada y se apaga... alguien sabe por que???
gracias
.
Es porque a la hora de cargar las imagenes esta mal especificado :
tienes que poner "Imagenes/menu1.png"
y no "Imagenes/menu/menu1.png"
PD: En el tutorial esta bien... pero en el main.c de la descarga no
-> Creaciones <-
Os invito a probar el lol xD
http://signup.leagueoflegends.com/?ref=50814a20894be236637679
MMMM es raro , a mi me
MMMM es raro , a mi me funciona perfecto puede ser que un detalle se te alla pasado o tal vez el CF que utilizas.
Hola, para q se inicializa
Hola, para q se inicializa pad?
Veo donde se usa currentPad y lastPad, pero no pad... e interpreto a pesar del error en la web (creo q esta corregido en el archivo descargable main) que "pad" es sustituido por currentPad.
Tampoco entendi bien (a pesar de q lo comentas) el xq se carga sceCtrlReadBufferPositive(&lastPad,1); fuera del bucle principal y despues dentro se carga el currentPad, para comprobar si estan ambos en 1 y sino ponerlos a 1.
Que pasa si desde fuera se usase solo lastPad para todo? forzandolo a 1 dentro del principal tambien?
Gracias
Eso se usa para control de
Eso se usa para control de botones ya que si no ol pones arriba no lo leera correctamente porque no los habras cargado anteriormente y como en lo de el bucle infinito pasa demaciado rapido las lecturas de los controles no se hacen correctamente o te marcarian errores de cursores o movimientos bruscos a la hora de las pulsaciones asi las tengas de solo una vez precionar.
no pasaria nada ya que al poner muchos carga de controles lo unico que haces sobre cargar tu hombrew con cosas inecesarias y lo arias mas lento o menos funcional tu hombrew y si usas muchas funciones no te serviria de nada ya que tendria que poner muchos mas a cada "void" que hicieras he imaginate cuanta carga inecesaria arias.
PD:puedes probar tus propias cosas ya que no todos los programadores programamos igual ejemplo: prueba tu lo de los botones que dices y comenta si te fue bien o mal y asi todos aprendemos de todos saludos.
una pregunta
a lo mejor es un poco estupida, pero con el lenguaje C se pueden crear entornos de ventanas tipo NEXTSHELL o FISHELL?
Claro ;), asta lo podrias
Claro ;), asta lo podrias hacer mejor y con mas cosas (cosas que no se pueden usar en LUA).
a mi me gustaria
apreder desde cero...nadie nace sabiendo ¿no?.Pero no hay nada sobre lo que empezar...supongo que tendras mas tutoriales.Si es asi¿tienes algun "menu" de todos o algo? asi seria mas facil ir aprendiendo cada vez mas desde menos hasta poder crear un juego o aplicacion...vamos digo yo...gracias.
By Aitor
Sinceramente te recomiendo que empieces aprendiendo C para PC no para PSP así después te será más facil, o al menos a mi me lo ha sido.
PS: Hay tutos de C para PC en Scenebeta.com, son de Tanos.
Sígueme en Twitter: @Aitor_db
Claro que hay y se iran
Claro que hay y se iran añadiendo aun mas, solo ten pasiencia que ya los iran poniendo yo estoy enseñando como aqui veo que todos aprenden LUA con ejemplos ya que si pongo derivados o funcionamientos exactos no les pondran mucha atencion , porque? no se pero aqui es asi aqui, de cualquier modo klozz anda haciendo eso que te digo poner los funcionamientos de cada cosa yo solo voy a agregando lo que vamos necesitando saludos y ya estan los tutoriales anteriores a este solo mira aqui:
http://psp.scenebeta.com/tutorial/nueva-serie-de-tutoriales-para-aprender-c-desde-0
Hay que buscar
Hay varios tutoriales para aprender desde cero.
http://psp.scenebeta.com/tutorial/nueva-serie-de-tutoriales-...
http://psp.scenebeta.com/tutorial/programacion-c-para-psp-de...
http://www.scenebeta.com/tutorial/aprender-c-desde-0
Y hay otros más...
\\:..://
muy buien tuto sting18 me dejas {O_O} viva la (+[__]·:·) gracias a ti estoy aprendiendo abstante sobre la programacion
Canal de Youtube De "Trabajo": http://www.youtube.com/user/DiegoDark256
Canal de Youtube para divertirse ;D :http://www.youtube.com/user/Trollsofthelife
Twitter Personal: https://twitter.com/DiegoDark256
Twitter del Canal: https://twitter.com/TrollsOfTheLife
Que bueno que aprendas diego
Que bueno que aprendas diego , diario se aprenden cosas nuevas de hecho hoy tu me enseñaste algo nuevo :D, y es como hacer un psp con simbolos mira (+[__]·:·) jajaja esta curada xD.
LA (+[__]·:·)
yo ay en paginas que veo cosas asi (la primera que vi era una nds) asi que hice la psp porque nadie la abia echo xD y si alguien la abia echo pues no lo habia visto
Canal de Youtube De "Trabajo": http://www.youtube.com/user/DiegoDark256
Canal de Youtube para divertirse ;D :http://www.youtube.com/user/Trollsofthelife
Twitter Personal: https://twitter.com/DiegoDark256
Twitter del Canal: https://twitter.com/TrollsOfTheLife
la verdad es que me interesa
mas saber colocar un color al texto que saber poner imagenes como menu. Haber cuando haceis alguno.
printTextScreen(x,y,"Texto"
Eso te servirá ;)(viene en graphics.h)
By AItor
Para cambiar el color del texto solo pon esto:
pspDebugScreenSetTextColor(Aquí el código del color);
PS: Esoty haciendo una tabla con los códigos de los colores, mientras usa el metodo que te dije.
Sígueme en Twitter: @Aitor_db
te doy la razon y te la quito
porque deverian poner lo del color pero tambien saber hacer algo asi sirbe
Mucha razón
Este tipo de cosas sirVen mucho :) Lastima que no tengo una psp.. si no, ya estuviera aprendiendo esto...