› Foros › Multiplataforma › Desarrollo
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspctrl.h>
#include <pspkerneltypes.h>
PSP_MODULE_INFO("Pyronhell", 0x1000, 1, 1);
PSP_MAIN_THREAD_ATTR(0);
#define printf pspDebugScreenPrintf
void clearscreen() {
sceDisplayWaitVblankStart();
pspDebugScreenClear();
}
/* Llamada de salida */
int menu = 1;
int submenu = 1;
int posiciones = 4;
int posicion = 1;
int en_menu = 1;
int pulsada = 0;
typedef int fichero;
SceCtrlData controles;
/*
int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}
int CallbackThread(SceSize args, void *argp) {
int cbid;
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
int SetupCallbacks(void) {
int thid = 0;
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
return thid;
}
*/
void show_menu() {
en_menu = 1;
clearscreen();
if (menu==1) {
if (submenu==1) {
printf("[");
if (posicion==1) { printf("X"); } else { printf(" "); }
printf("] Gestion de ficheros\n");
printf("[");
if (posicion==2) { printf("X"); } else { printf(" "); }
printf("] Lanzar un EBOOT\n");
printf("[");
if (posicion==3) { printf("X"); } else { printf(" "); }
printf("] Ver botones\n");
printf("[");
if (posicion==4) { printf("X"); } else { printf(" "); }
printf("] Salir");
}
}
if (menu==2) {
if (submenu==1) {
printf("[");
if (posicion==1) { printf("X"); } else { printf(" "); }
printf("] Comprobar config.txt\n");
printf("[");
if (posicion==2) { printf("X"); } else { printf(" "); }
printf("] Borrar config.txt\n");
printf("[");
if (posicion==3) { printf("X"); } else { printf(" "); }
printf("] Crear config.txt\n");
printf("[");
if (posicion==4) { printf("X"); } else { printf(" "); }
printf("] Volver al menu principal");
}
}
}
void launch() {
en_menu = 0;
if (menu==1) {
if (submenu==1) {
if (posicion==1) {
menu = 2;
submenu = 1;
posiciones = 4;
show_menu();
}
if (posicion==4) {
sceKernelExitGame();
}
}
}
if (menu==2) {
if (submenu==1) {
if (posicion==1) {
clearscreen();
en_menu = 0;
printf("Comprobando que exista ms0:/config.txt...\n");
if (!sceIoOpen("ms0:/config.txt", PSP_O_RDONLY, 0777)) {
printf("El archivo ms0:/config.txt NO existe!!\n");
printf("Pulsa O para continuar...");
while(1) {
sceCtrlReadBufferPositive(&controles, 1);
if (controles.Buttons & PSP_CTRL_CIRCLE) {
break;
}
}
} else {
printf("El archivo ms0:/config.txt existe\n");
printf("Pulsa O para continuar...");
while(1) {
sceCtrlReadBufferPositive(&controles, 1);
if (controles.Buttons & PSP_CTRL_CIRCLE) {
break;
}
}
}
en_menu = 1;
show_menu();
}
if (posicion==2) {
menu = 1;
submenu = 1;
posiciones = 4;
show_menu();
}
if (posicion==3) {
menu = 1;
submenu = 1;
posiciones = 4;
show_menu();
}
if (posicion==4) {
menu = 1;
submenu = 1;
posiciones = 4;
show_menu();
}
}
}
}
int main() {
pspDebugScreenInit();
show_menu();
for (;;) {
if (en_menu) {
while(1) {
sceCtrlReadBufferPositive(&controles, 1);
if (controles.Buttons & PSP_CTRL_DOWN) {
posicion++;
if (posicion > posiciones) { posicion = posiciones; }
pulsada = 1;
show_menu();
}
if (controles.Buttons & PSP_CTRL_UP) {
posicion--;
if (posicion < 1) { posicion = 1; }
pulsada = 1;
show_menu();
}
if (controles.Buttons & PSP_CTRL_CROSS) {
pulsada = 1;
launch();
}
}
}
}
sceKernelSleepThread();
return 0;
}
saulotmalo escribió:parece que está bastante bien algo simple pero bien, te acosejaría el uso de swicht( ) y case: por lo demás si es lo que querías conseguir te vale
switch($variable) {
case(opcion):
// cosas de la opción
break;
default:
// cosas de la opción por defecto
break;
}
switch(variable) {
case(valor):
// cosas de la opción
break;
default:
// cosas de la opción por defecto
break;
}
Zor escribió:Un año programando en c++ y no me entero de nada
Lo que hace la educación pública...
if (controles.Buttons & PSP_CTRL_DOWN) {
posicion++;
if (posicion > posiciones) { posicion = posiciones; }
pulsada = 1;
show_menu();
}
if (controles.Buttons & PSP_CTRL_DOWN) {
posicion = posicion % posiciones +1;
pulsada = 1;
show_menu();
}
if (controles.Buttons & PSP_CTRL_DOWN) {
if (posicion < posiciones)
posicion++;
pulsada = 1;
show_menu();
}
printf("Pulsa O para continuar...");
while(1) {
sceCtrlReadBufferPositive(&controles, 1);
if (controles.Buttons & PSP_CTRL_CIRCLE) {
break;
}
printf("Pulsa O para continuar...");
do
sceCtrlReadBufferPositive(&controles, 1);
while( ! (controles.Buttons & PSP_CTRL_CIRCLE) );
if (posicion==2) {
menu = 1;
submenu = 1;
posiciones = 4;
show_menu();
}
if (posicion==3) {
menu = 1;
submenu = 1;
posiciones = 4;
show_menu();
}
if (posicion==4) {
menu = 1;
submenu = 1;
posiciones = 4;
show_menu();
}
}
if (posicion==2 || posicion == 3 || posicion == 4) {
menu = 1;
submenu = 1;
posiciones = 4;
show_menu();
}
if (posicion > 4) {
menu = 1;
submenu = 1;
posiciones = 4;
show_menu();
}
if (menu==1) {
if (submenu==1) {
if (menu && submenu) {
BlackSith escribió:Como ya t han dixo, abusas d los condicionales, x ejemplo:
Aunq ese es d 2, he llegado a ver d hasta 3 o 4 niveles xD.
Y la mayoria los podrias solucionar con un:
(este es a partir dl q he citado antes)
Salu2
saulotmalo escribió:creo que como tu propones no tiene sentido( si es como yo lo entiendo ) ya que hay siempre te dirá que si porque trataría igual menu(valiendo 1 ) que menu (valiendo 2 ) ya que en los dos es true y creo que el lo hace para diferenciar los distintos casos, lo que tu has hecho se suele hacer para comprobar una condicion de que se cumple algo
#include <pspkernel.h>
#include <pspiofilemgr.h>
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspctrl.h>
#include <pspkerneltypes.h>
PSP_MODULE_INFO("Pyronhell", 0x1000, 1, 1);
PSP_MAIN_THREAD_ATTR(0);
#define printf pspDebugScreenPrintf
void clearscreen() {
sceDisplayWaitVblankStart();
pspDebugScreenClear();
}
/* Llamada de salida */
int menu = 1;
int submenu = 1;
int posiciones = 4;
int posicion = 1;
int en_menu = 1;
int pulsada = 0;
typedef int fichero;
SceCtrlData controles;
/*
int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}
int CallbackThread(SceSize args, void *argp) {
int cbid;
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
int SetupCallbacks(void) {
int thid = 0;
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
return thid;
}
*/
void show_menu() {
en_menu = 1;
clearscreen();
printf(" .__ .__ .__ \n");
printf("______ ___.__._______ ____ ____ | |__ ____ | | | | \n");
printf("\\____ < | |\\_ __ \\/ _ \\ / \\| | \\_/ __ \\| | | | \n");
printf("| |_> >___ | | | \\( <_> ) | \\ Y \\ ___/| |_| |__\n");
printf("| __// ____| |__| \\____/|___| /___| /\\___ >____/____/\n");
printf("|__| \\/ \\/ \\/ \\/ \n\n\n");
switch(menu) {
case(1):
if (submenu==1) {
printf("[");
if (posicion==1) { printf("X"); } else { printf(" "); }
printf("] Gestion de ficheros ->\n");
printf("[");
if (posicion==2) { printf("X"); } else { printf(" "); }
printf("] Lanzar un EBOOT (PSP/GAME/holamundo/EBOOT.PBP)\n");
printf("[");
if (posicion==3) { printf("X"); } else { printf(" "); }
printf("] Ver botones\n");
printf("[");
if (posicion==4) { printf("X"); } else { printf(" "); }
printf("] Salir");
}
break;
case(2):
if (submenu==1) {
printf("[");
if (posicion==1) { printf("X"); } else { printf(" "); }
printf("] Comprobar config.txt\n");
printf("[");
if (posicion==2) { printf("X"); } else { printf(" "); }
printf("] Borrar config.txt\n");
printf("[");
if (posicion==3) { printf("X"); } else { printf(" "); }
printf("] Crear config.txt\n");
printf("[");
if (posicion==4) { printf("X"); } else { printf(" "); }
printf("] <- Volver al menu principal");
}
break;
}
}
void launch() {
sceKernelDelayThread(180000);
en_menu = 0;
switch(menu) {
case(1):
switch(submenu) {
case(1):
if (posicion==1) {
menu = 2;
submenu = 1;
posiciones = 4;
show_menu();
}
if (posicion==2) {
sceKernelLoadExec("ms0:/PSP/GAME/holamundo/EBOOT.PBP", 0);
}
if (posicion==4) {
sceKernelExitGame();
}
}
break;
case(2):
switch(submenu) {
case(1):
if (posicion==1) {
clearscreen();
en_menu = 0;
printf("Comprobando que exista ms0:/config.txt...\n");
if (!sceIoOpen("ms0:/config.txt", PSP_O_RDONLY, 0777)) {
printf("El archivo ms0:/config.txt NO existe!!\n");
} else {
printf("El archivo ms0:/config.txt existe\n");
}
//sceIoClose(fichero);
printf("Pulsa O para continuar...");
while(1) {
sceCtrlReadBufferPositive(&controles, 1);
if (controles.Buttons & PSP_CTRL_CIRCLE) {
break;
}
}
en_menu = 1;
show_menu();
}
if (posicion==3) {
clearscreen();
en_menu = 0;
printf("Procediendo a crear ms0:/config.txt...\n");
if(sceIoOpen("ms0:/config.txt", PSP_O_WRONLY|PSP_O_CREAT, 0777)) {
printf("El archivo fue creado :)");
} else {
printf("El archivo no pudo ser creado\n");
}
//sceIoClose(fichero);
printf("Pulsa O para continuar...");
while(1) {
sceCtrlReadBufferPositive(&controles, 1);
if (controles.Buttons & PSP_CTRL_CIRCLE) {
break;
}
}
en_menu = 1;
show_menu();
}
if (posicion==4) {
menu = 1;
submenu = 1;
posiciones = 4;
show_menu();
}
}
break;
}
}
int main() {
pspDebugScreenInit();
show_menu();
for (;;) {
if (en_menu) {
while(1) {
sceCtrlReadBufferPositive(&controles, 1);
if (controles.Buttons & PSP_CTRL_DOWN) {
posicion++;
if (posicion > posiciones) { posicion = 1; }
show_menu();
sceKernelDelayThread(180000);
}
if (controles.Buttons & PSP_CTRL_UP) {
posicion--;
if (posicion < 1) { posicion = posiciones; }
show_menu();
sceKernelDelayThread(180000);
}
if (controles.Buttons & PSP_CTRL_CROSS) {
launch();
sceKernelDelayThread(180000);
}
}
}
}
sceKernelSleepThread();
return 0;
}
killer-x escribió:Puedes usar el syscall sceKernelDelayThread()
Le tienes que pasar un entero, que creo que es en milisegundos, conseguiras que vaya mas lento con el boton pulsado. Prueba con 180000.
Pyronhell escribió:Y no consigo que funcione tampoco lo de ejecutar un eboot (que tampoco estoy seguro de como hay que hacerlo ya que el los docs no veo nada).
sceKernelLoadExec("ms0:/PSP/GAME/holamundo/EBOOT.PBP", 0);
Pyronhell escribió:Uso esa función, pero me manda al XMB, supongo que habrá que introducir algún parámetro con sceKernelSetArg() o algo así, pero ni idea y como ya he dicho en los docs poco viene
#define PROGRAMA "ms0:/cualquier/EBOOT.PBP"
struct SceKernelLoadExecParam param;
param.size = sizeof(param);
param.argp = PROGRAMA;
param.args = strlen(PROGRAMA) + 1;
param.key = "game";
sceKernelLoadExec(PROGRAMA, ¶m);
#define programa "ms0:/PSP/GAME/holamundo/EBOOT.PBP"
struct sceKernelLoadExecParam parametros;
parametros.argp = programa;
parametros.args = strlen(programa) + 1;
parametros.key = "GAME";
parametros.size = sizeof(parametros);
Pyronhell escribió:Por cierto... los documentos dicen que Key es la clave de encriptacion :S
Pyronhell escribió:parametros.args pone que es el tamaño de los argumentos, no seria strlen(parametros) ¿?
#include <pspkernel.h>
#include <pspiofilemgr.h>
#include <psploadexec.h>
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspctrl.h>
#include <pspkerneltypes.h>
PSP_MODULE_INFO("Pyronhell", 0x1000, 1, 1);
PSP_MAIN_THREAD_ATTR(0);
#define printf pspDebugScreenPrintf
#define programa "ms0:/PSP/GAME/holamundo/EBOOT.PBP"
struct sceKernelLoadExecParam parametros;
parametros.argp = programa;
parametros.args = strlen(programa) + 1;
parametros.key = "GAME";
parametros.size = sizeof(parametros);
TARGET = menu
OBJS = main.o
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Pyronhell - Menu
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
Pyronhell escribió:#include
#include
#include
#include
#include
#include
#include
PSP_MODULE_INFO("Pyronhell", 0x1000, 1, 1);
PSP_MAIN_THREAD_ATTR(0);
#define printf pspDebugScreenPrintf
#define programa "ms0:/PSP/GAME/holamundo/EBOOT.PBP"
struct sceKernelLoadExecParam parametros;
parametros.argp = programa;
parametros.args = strlen(programa) + 1;
parametros.key = "GAME";
parametros.size = sizeof(parametros);
void cargaeboot(char *programa) {
struct sceKernelLoadExecParam parametros;
const u32 peso = strlen(programa)+1;
parametros.args = peso;
parametros.argp = programa;
parametros.key = NULL;
parametros.size = sizeof(parametros) + peso;
sceKernelLoadExec(programa, ¶metros);
}
Lo primero, si es cierto q solo hace dos dias q usas el lenguaje C, es felicitar-te; creo q esta muy bien lo q has echo aunque es ciero que la instruccion switch te facilitaria mucho el echo de los menus. Llevo 6 anyos programando en C, i la verdard es que es un lenguaje muy complejo.Mi objetivo mas inmediato es la programacion de un programa que cree i resuelva sudocus; lo intetare programar para el pc i luego pasarlo a la psp. Espero no pillarme los dedos en ello.Si teneis alguna sujerencia sera bienvenida.
Pyronhell escribió:parametros.size = sizeof(parametros) + peso;
Pyronhell escribió:const u32 peso = strlen(programa)+1;
#include <pspkernel.h>
#include <pspdebug.h>
#include <string.h>
#include <psploadexec.h>
PSP_MODULE_INFO("PROGRAMILLA", 0x1000, 1, 1);
PSP_MAIN_THREAD_ATTR (0);
void cargareboot(const char *pbpath)
{
const u32 pbplen = strlen(pbpath)+1;
struct SceKernelLoadExecParam eboot;
eboot.args = pbplen;
eboot.argp = pbpath;
eboot.key = NULL;
eboot.size = sizeof(eboot) + pbplen;
sceKernelLoadExec(pbpath,&eboot)
}
int main()
{
pspDebugScreenInit();
cargareboot("ms0:/PSP/GAME/holamundo/EBOOT.PBP")
}
kYp escribió:Yo tampoco logro cargar ningun eboot ni siguiendo la logica que pone en la libreria psploadexec.h ni como lo hacen por los foros adelante ( y ademas en ingles que menos me entero )
#include <pspkernel.h>
#include <pspdebug.h>
#include <string.h>
#include <psploadexec.h>
PSP_MODULE_INFO("PROGRAMILLA", 0x1000, 1, 1);
PSP_MAIN_THREAD_ATTR (0);
void cargareboot(const char *pbpath)
{
const u32 pbplen = strlen(pbpath)+1;
struct SceKernelLoadExecParam eboot;
eboot.args = pbplen;
eboot.argp = pbpath;
eboot.key = NULL;
eboot.size = sizeof(eboot) + pbplen;
sceKernelLoadExec(pbpath,&eboot);
}
int main()
{
pspDebugScreenInit();
cargareboot("ms0:/PSP/GAME/holamundo/EBOOT.PBP");
}
struct SceKernelLoadExecParam {
/** Size of the structure */
SceSize size;
/** Size of the arg string */
SceSize args;
/** Pointer to the arg string */
void * argp;
/** Encryption key ? */
const char * key;
};
void cargaeboot(char *programa) {
struct SceKernelLoadExecParam parametros;
parametros.args = strlen(programa)+1;
parametros.argp = programa;
parametros.key = NULL;
parametros.size = sizeof(parametros);
if (sceKernelLoadExec(programa,¶metros)<0) {
pspDebugScreenPrintf("Cara de eboot fallida.\n");
printf("Pulsa O para volver al XMB...");
while(1) {
sceCtrlReadBufferPositive(&controles, 1);
if (controles.Buttons & PSP_CTRL_CIRCLE) {
break;
}
}
}
}
if (en_menu) {
while(1) {
sceCtrlReadBufferPositive(&controles, 1);
if (controles.Buttons & PSP_CTRL_DOWN) {
posicion++;
if (posicion > posiciones) { posicion = 1; }
show_menu();
sceKernelDelayThread(180000);
}
if (controles.Buttons & PSP_CTRL_UP) {
posicion--;
if (posicion < 1) { posicion = posiciones; }
show_menu();
sceKernelDelayThread(180000);
}
if (controles.Buttons & PSP_CTRL_CROSS) {
launch();
sceKernelDelayThread(180000);
}
}
.....
if ((controles.Buttons & PSP_CTRL_DOWN) && ((HoraActual()-HoraUltimaPulsacion)>TIEMPO_DE_REPETICION))
{
posicion++;
if (posicion > posiciones) { posicion = 1; }
show_menu();
HoraUltimaPulsacion=HoraActual();
}
.....
Warrick escribió:Veamos he visto que se ha aceptado generalmente la solucion del sceKernelDelayThread para el menu. Bien eso realmente para el programa en seco. Ahora imaginemos que tenemos un menu grafico mejorado y que mientras se muestra el menu tambien tenemos una animacion o estamos moviendo el fondo, o lo que sea, pasara que cada vez que se pulse una tecla el sceKernelDelayThread parara tambien la animacion.
Warrick escribió:Ante todo un saludo a todos, y en especial a melado y gusvo ;).
Veamos he visto que se ha aceptado generalmente la solucion del sceKernelDelayThread para el menu. Bien eso realmente para el programa en seco. Ahora imaginemos que tenemos un menu grafico mejorado y que mientras se muestra el menu tambien tenemos una animacion o estamos moviendo el fondo, o lo que sea, pasara que cada vez que se pulse una tecla el sceKernelDelayThread parara tambien la animacion. Para que esto no ocurra podemos utilizar el tiempo de repeticion. Se pulsa una tecla, se toma a la hora que se ha tomado, cuando se pulsa otra si no ha pasado el tiempo de repeticion pues no la tengo en cuenta pero el programa no para.
Tu codigo es asi:if (en_menu) {
while(1) {
sceCtrlReadBufferPositive(&controles, 1);
if (controles.Buttons & PSP_CTRL_DOWN) {
posicion++;
if (posicion > posiciones) { posicion = 1; }
show_menu();
sceKernelDelayThread(180000);
}
if (controles.Buttons & PSP_CTRL_UP) {
posicion--;
if (posicion < 1) { posicion = posiciones; }
show_menu();
sceKernelDelayThread(180000);
}
if (controles.Buttons & PSP_CTRL_CROSS) {
launch();
sceKernelDelayThread(180000);
}
}
Ahora imagina que despues de cerrar el ultimo if vas moviendo una particula por la pantalla. Si pulsamos el movimiento de esta se veria afectada asi que deberiamos hacer algo asi:.....
if ((controles.Buttons & PSP_CTRL_DOWN) && ((HoraActual()-HoraUltimaPulsacion)>TIEMPO_DE_REPETICION))
{
posicion++;
if (posicion > posiciones) { posicion = 1; }
show_menu();
HoraUltimaPulsacion=HoraActual();
}
.....
Haciendo cada if de este modo, tendrias tus pausas en el menu pero el thread no lo paras no es necesario. Defines arriba cual es tu tiempo_de_repeticion ideal y ya esta.
Saludos,
Warrick.
size_t fread(void *puntero, size_t tamanyo, size_t nmemb, FILE *stream);
La función fread recibe, en el array apuntado por puntero, hasta nmemb de [b]elementos[b] cuyo tamaño es especificado por tamanyo, desde el stream apuntado por stream. El indicador de posición de ficheros para el stream (si está definido) es avanzado por el número de caracteres leídos correctamente. Si existe un error, el valor resultante del indicador de posición de ficheros para el stream es indeterminado. Si un elemento es parcialmente leído, entonces su valor es indeterminado.