Anuncios Google

Creando un menú con imágenes.

Tutoriales Avanzados Homebrewes

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.

Procedimiento

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!

Descarga

Descargar Archivos Necesarios (Sólo Usuarios Registrados).

4.35
Tu voto: Ninguno Votos totales: 4.4 (60 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

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"

Imagen de sting18

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.


Imagen de sisinio

.

¿ Y estas dos libs para que sirven ? ¿ algo relacionado con el audio ?

#include <pspaudio.h> #include <pspaudiolib.h>

Imagen de User170294

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


Imagen de sting18

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.

Imagen de Ricx-Dark

Oye sting18!!! :)

cuando vas a poner sobre el audio?????

aaaa y megustaria que hicieras uno de sprites para hacer un juego gracias!!! :)

Imagen de User170294

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.


Imagen de 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 ;).


Imagen de Dioni0396

Fiuuu....

Madre..... si solo con ver el code da espasmo, xD

Imagen de Dioni0396

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

Imagen de sisinio

.

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

 

Imagen de sting18

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

Imagen de sting18

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.


Imagen de hbjpro

una pregunta

a lo mejor es un poco estupida, pero con el lenguaje C se pueden crear entornos de ventanas tipo NEXTSHELL o FISHELL? 

Imagen de sting18

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.

Imagen de AitorDB

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

Imagen de sting18

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


Imagen de Diego_Dark_256

\\:..://

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


 

Imagen de sting18

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.


Imagen de Diego_Dark_256

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


 

Imagen de Dioni0396

la verdad es que me interesa

mas saber colocar un color al texto que saber poner imagenes como menu. Haber cuando haceis alguno.

Imagen de barney77

  printTextScreen(x,y,"Texto"

 

printTextScreen(x,y,"Texto",colorenhexadecimal);
flipScreen(); //Para mostrarlo

Eso te servirá ;)(viene en graphics.h)

Imagen de AitorDB

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

Imagen de Diego_Dark_256

te doy la razon y te la quito

porque deverian poner lo del color pero tambien saber hacer algo asi sirbe

Imagen de auroszxmm

Mucha razón

Este tipo de cosas sirVen mucho :) Lastima que no tengo una psp.. si no, ya estuviera aprendiendo esto...

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.