Sábado, 21/Dic/2024, 7:07 AM
                          Inicio

Registrarse

Entrada
Le saludo Huésped | RSS
[ Mensajes nuevos · Participantes · Reglas del foro · Búsqueda · RSS ]
  • Página 1 de 1
  • 1
Menu con Imagenes [graphics.h]
sting18Fecha: Viernes, 09/Sep/2011, 7:34 PM | Mensaje # 1
Generalísimo
Grupo: Administradores
Mensajes: 26
Reputación: 32767
Estatus: Offline
Ahora veremos como hacer un menu con imagenes, para las imagenes como vimos anteriormente, usaremos la libreia "graphics.h" para cargar imagenes.

Archivos necesarios : http://www.megaupload.com/?d=NROJK7E8 (aqui viene todo las imagenes librerias el compilador solo para que le des compilar te salga el eboot y metas el eboot que te salio y la carpeta imagenes en una carpeta y lo pongas en la carpeta GAME de tu psp si no te compila tienes mal tu compilador)

Lo primero que tenemos que incluir son las librias necesarias y usaremos estas.

Code
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <pspaudio.h>
#include <pspaudiolib.h>
#include <psppower.h>
#include "graphics.h"


Si se dan cuanta pusimos una libreria nueva que es la de "psppower.h" y esta la usaremos para poner nuestra psp a 333 esto para mejor funcionamiento de codigo y es indispensable para reproducir sonidos en nuestra psp(eso lo veremos un poco mas adelante).

Ponemos la informacion de nuestro hombrew (visto anteriormente)

Code
PSP_MODULE_INFO("Menu_Imagenes",0, 1, 0);
PSP_HEAP_SIZE_KB(20480);


Ahora añadi una linea mas a la informacion que es para modo usuario pero para una version especifica que es la 3.XX o 4.XX con esto aremos que nuestro hombre pueda ser firmado, tambien tenemos que modificar una linea de el makefile que veremos mas adelante(esto para que a la hora de firmar el hombrew no nos marke error).

Despues pondremos las imagenes que usaremos(visto en el tuto mostrar imagen).

Code
Image*menu1,*menu2,*menu3,*menu4;


Como ahora tenemos mas de una imagen, tenemos que poner despues de cada imagen una coma "," para no tener que poner muchos "Image", que si queremos lo podemos hacer y seria practicamente lo mismo pero se veria asi...

Image*menu1;
Image*menu2;
Image*menu3;
Image*menu4;

Yo en lo personal prefiero de la otra forma con comas.

Ahora pondremos unas vareables para guardar los numeros enteros que usaremos.

Code
int arriba=1,abajo=1,seleccionar=1;


A lo mismo que con "Image" para en esta ocacion no usar muchos "int" separamos con comas vean que el punto y coma ";" solo va al final y solo es uno de la otra forma como vimos en las imagenes tendriamos que poner un punto y coma ";" para cada "int" que agamos, usamos tres enteros con nombres de "arriba,abajo,seleccionar" y estos los usaremos en los controles para tener un mejor control del menu.

Luego cargamos las vareables de nuestros controles.

Code
SceCtrlData currentPad, lastPad, pad;


Algo importante para poder salir del hombrew con el boton HOME(visto anteriormente).

Code
/* 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;
}


Ahora vamos a hacer una funciones "void" que son las funciones void? La palabra reservada void define en C++ el concepto de no existencia o no atribución de un tipo en una variable o declaración. Como tal, puede ser usada para destacar que una función no recibe parámetros(para los que saben lua es como poner "function" y se utiliza igual solo que en vez de poner "function" pones "void").

Code
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();}


Dentro cada funcion pusimos los parametros de cada opcion tales como "arriba,abajo,seleccinar" y dependiendo de la opcion de la imagen muestre un numero diferente para poder ser cambiado despues con las pulsaciones y tiene el "flipScreen();" dentro de cada funcion para ser mostrada a cada pulsacion.

Comensaremos con nuestro main principal(recuerden que "main" es lo primero que se lee a la hora de iniciar el hombrew).

Code
int main()
{


Ya que habrimos el main principal pondremos la CPU a 333 para que el juego sea mas fluido, y eso lo hacemos con este code.

Code
scePowerSetClockFrequency (333, 333, 166);


Se puede cambiar cuando uno quiera cambiarlo pero si asi se queda mejor.

Iniciamos los graficos y la llamada a salida.

Code
initGraphics(); SetupCallbacks();


Y despues cargamos las imagenes.

Code
menu1 = loadImage("Imagenes/menu1.png");
menu2 = loadImage("Imagenes/menu2.png");
menu3 = loadImage("Imagenes/menu3.png");
menu4 = loadImage("Imagenes/menu4.png");


Recuerden que la Direccion que pongamos dentro los parentecis en la string es apartir de el EBOOT.PBP que vamos a crear si queremos agarrar una imagen que este fuera de donde este el EBOOT temenos que poner al comienzo "ms0:/" y la direccion donde este la imagen en caso de PSP GO ponemos "ef0:/" (gracias a csar.ale por la info)

Como yo puse "menu1 = loadImage("Imagenes/menu1.png");" esto quiere decir que junto al EBOOT pondre una carpeta llamada "Imagenes" y dentro de esa carpeta metere mis 4 imagenes que carge porque en las cuatro le di la misma direccion esto lo ago para tener un mejor control.(cosas basicas de LUA que muchoas ya saben).

Ahora cargaremos los controles fuera de el bucle infinito.

Code
sceCtrlReadBufferPositive(&lastPad, 1);


Cargaremos la vareable de el primer menu para que muestre la imagen de lo contrario apareceria negro aunque a la hora de cambiar si mostraria ya todo bien no comensaria mostrando imagen ya que las bariables que pusimos se leen una sola vez.

Code
jugar();


Y comenzamos nuestro bucle infinito para que todo el tiempo pueda leer las pulsaciones.

Code
while(1)
         {


Recuerden cargar los controles dentro de el bucle si no no puncionaran las pulsaciones.

Code
sceCtrlReadBufferPositive(¤tPad,1);


Ahora les pondre el codigo de los controles usando "switch" pero que es switch? La sentencia switch() en Lenguaje C es una sentencia de selección. Esta sentencia permite seleccionar las acciones a realizar de acuerdo al valor que tome una variable. veremos una muestra de el uso de switch.

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:
      }
     }*/
   


Como vemos en las pulsaciones ponemos que no se repita la pulsacion (es como controls.press("boton") en lua dev) y dentro de la pulsacion esta el switch y a cada caso le decimos que nos habra la vareable deseada y ya sabemos que cada vareable que hicimos muetra una imagen difernte dependiendo de el numero que sea.

Tambien dentro de switch() pusimos las vareables que es la que marca el "case" en el que estamos. Si nos damos cuenta hay un pedaso de codigo que tiene "/*" esto hace que el codigo no sea leido asta donde pongamos "*/" para terminar el pedaso de codigo que no queremos que lea en nuestro caso no quisimos que leyera las pulsaciones de el boton "X" porque no tiene caso que las activemos asta que tengamos las otras partes del codigo pero esto ara que vallas a la opcion deseada para continuar con nuesrtro codigo.

Ya solo nos falta cerrar nuestro main y nuestro bucle infinito y listo tendremos el main.c completo.

Code
}    
return 0;
}


Ahora nuetro makefile.

Code
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


Notan algo diferente en este makefile? es porque recuerden que lo adaptamos para que pueda ser firmado sin problemas y asi poder usar nuestro hombrew en cualquier psp asta la fecha de hoy, la linea que cambia es "PSP_FW_VERSION = 371" ya que es la que nos dice la version i aparte agregamos "-lpsppower " a la linea de librerias "LIBS = -lpspgu -lpng -lz -lm -lmad" porque pusimos la libreria "psppower.h" para poner nuestro cpu a 333.

Algo Extra...

Mas sobre las funciones void:

Aunque la tendencia actual es la de no colocar la palabra "void".
Además se utiliza para determinar que una función no retorna un valor, como en:

Code
void funcion (int parametro);


Cabe destacar que void no es un tipo. Una función como la declarada anteriormente no puede retornar un valor por medio de return: la palabra clave va sola. No es posible una declaración del tipo:

Code
void t; //Está mal


En este sentido, void se comporta de forma ligeramente diferente a como lo hace en C, especialmente en cuanto a su significado en declaraciones y prototipos de funciones.Sin embargo, la forma especial void * indica que el tipo de datos es un puntero. Por ejemplo:

Code
void *memoria;


Indica que memoria es un puntero a alguna parte, donde se guarda información de algún tipo. El programador es responsable de definir estos "algún", eliminando toda ambigüedad. Una ventaja de la declaración "void *" es que puede representar a la vez varios tipos de datos, dependiendo de la operación de cast escogida. La memoria que hemos apuntado en alguna parte, en el ejemplo anterior, bien podría almacenar un entero, un flotante, una cadena de texto o un programa, o combinaciones de éstos. Es responsabilidad del programador recordar qué tipo de datos hay y garantizar el acceso adecuado.

Mas sobre uso de switch:

Modo de uso:

Code
switch(variable)
{
  case valor_1:
   //acciones
   break;
  case valor_2:
   //acciones
   break;
   .
   .
   .
  case valor_n:
   //acciones
   break;
  defalut:
   //acciones
   break;
}


Espero lea sirva saludos a todos.
 
  • Página 1 de 1
  • 1
Búscar:

Copyright MyCorp © 2024 Hacer un sitio web gratis con uCoz