Ich poste hier mal ein kleines Tutorial von PSP-Hilfe.de
Ihr benötigt:
* PSP mit Customfirmware oder HBL zum Testen
* Entwicklungsumgebung/Compiler
Folgende Headerfiles werden benötigt:
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
int aktivmenu = 0;
int maxmenu = 2;
In der Variable “aktivmenu” wird die aktuelle Menüposition gespeichert.
In der Variable “maxmenu” die Zahl der vorhandenen Menüpunkte, in diesem Fall sind es 3 Menüpunkte, also ist der Wert der Variable 2. Menüpunkt 0, 1 und 2
char menu[3][15] = {"Spiel starten","Spiel laden","Spiel beenden"};
Das ist ein Zweidimensionaler Char Array, seine Größe beträgt 35 Byte (3*15) und es werden 3 Zeiger gesetzt.
Funktion für die Menüausgabe
Jetzt schreiben wir die Funktion mit der wir das Menü auf dem Display ausgeben werden.
void printmenu(){
Eine Void Funktion, da sie keinen Wert per Return zurückgeben muss.
int i;
Diese Variable benötigen wir jetzt in der For Schleife.
for(i=0;i<maxmenu+1;i++)
Mit einer For Schleife kann man eine bestimmte Anzahl an Wiederholungen definieren, sie hat 3 Parameter.
1. Der Variable “i” wird ein Wert zugeteilt, in diesem Fall 0.
2. Die Variable “maxmenu” erhöht um 1 darf nicht größer als i sein, ansonsten wird die Schleife beendet.
3. Bei jedem Durchlauf wird “i” um 1 erhöht.
if(aktivmenu == i)
{
}
Der Inhalt dieser Schleife wird ausgeführt wenn “i” den gleichen Wert wie der aktuelle Menüpunkt hat. Vor das, was hier ausgegeben wird kommt ein Pfeil.
if(aktivmenu == i)
{
pspDebugScreenPrintf("-> %s\n",menu[i]);
}
PspDebugScreenPrintf hat hier 2 Parameter. Mit “-> %s\n” wird ein Pfeil “->”, die Variable im folgenden Parameter und ein Zeilenumbruch geschrieben. Mit “menu[i]” wird der Menüpunkt mit dem Wert von “i” aus dem Array gelesen. Im ersten Durchlauf z.b. “menu[1]” im 2. menu[2] usw.
else
{
pspDebugScreenPrintf(" %s\n",menu[i]);
}
Falls der Menüpunkt nicht markiert ist werden statt dem Pfeil 2 Leerzeichen geschrieben.
}
}
Die For Schleife und die Funktion werden geschlossen.
Hier nocheinmal die komplette Funktion:
void printmenu(){
int i;
for(i=0;i<maxmenu+1;i++)
{
if(aktivmenu == i)
{
pspDebugScreenPrintf("-> %s\n",menu[i]);
}
else
{
pspDebugScreenPrintf(" %s\n",menu[i]);
}
}
}
Wenn wir diese Funktion jetzt aufrufen werden alle Menüpunkte ausgegeben, der aktive Menüpunkt mit Pfeil.
Main Funktion
int main()
{
Die Callbacks und der DebugScreen werden initialisiert:
pspDebugScreenInit();
SetupCallbacks();
Variable für die Tasten:
SceCtrlData pad;
Und in diese Variable setzen wir später auf 1 wenn eine Taste gedrückt ist und wieder auf 0 wenn sie nicht mehr gedrückt ist. Sonst würde die Ausgabe in der gleich folgenden While Schleife knapp 10 mal durchlaufen wenn man einmal nach unten oder nach oben drückt.
int button = 0;
Das Menü muss am Anfang ausgegeben werden auch wenn noch keine Taste gedrückt wurde:
printmenu();
Jetzt die While Schleife. Der Inhalt dieser Schleife wird immer wiederholt, wodurch ständig überprüft wird ob eine Taste gedrückt ist und falls ja das Menü neu ausgegeben.
while(running)
{
Mit folgender Funktion werden die Tasten ausgelesen und in “pad” gespeichert:
sceCtrlReadBufferPositive(&pad, 1);
Und nun kommen wir zu den Abfragen der Tasten:
if((pad.Buttons & PSP_CTRL_DOWN) && (aktivmenu != maxmenu) && (button == 0))
{
aktivmenu++;
pspDebugScreenClear();
printmenu();
}
Die If beinhaltet 3 Bedingungen:
1. Die nach unten Taste muss gedrückt sein
2. “aktivmenu” darf nicht gleich groß sein wie “maxmenu”, weil es ja nur 3 Menüpunkte gibt
3. “button” muss gleich 0 sein.
Wenn die Bedingungen erfüllt werden wird der aktuelle Menüpunkt um 1 erhöht “aktivmenu++;”, der aktuelle Text vom Bildschirm gelöscht und das das neue Menü ausgegeben.
Jetzt nochmal das gleiche nur umgekehrt:
if((pad.Buttons & PSP_CTRL_UP) && (aktivmenu != 0) && (button == 0))
{
aktivmenu-=1;
pspDebugScreenClear();
printmenu();
}
Und jetzt die Abfrage die “button” auf 1 oder wieder auf 0 setzt:
if((pad.Buttons & PSP_CTRL_UP) && (aktivmenu != 0) && (button == 0))
{
aktivmenu-=1;
pspDebugScreenClear();
printmenu();
}
Wenn ein Menüpunkt ausgewählt ist und die X Taste gedrückt wird soll ja auch etwas passieren, dazu ein kleines Beispiel:
if((aktivmenu == 2) && (pad.Buttons & PSP_CTRL_CROSS))
{
sceKernelExitGame();
}
Die Funktion “sceKernelExitGame” beendet das Programm und man landet wieder im XMB
Jetzt müssen wir nur noch die Main Funktion beenden:
return 0;
}
Menüpunkt hinzufügen
Falls ihr einen Menüpunkt hinzufügen wollt müsst ihr nur “maxmenu” um 1 erhöhen und dem Array ein weiteres Element zuteilen. Beispiel:
int maxmenu = 3;
char menu[4][15] = {"Spiel starten","Spiel laden","Einstellungen","Spiel beenden"};
Kompletter Sourcecode
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
PSP_MODULE_INFO("test", 0, 1, 1);
static int running = 1;
int exit_callback(int arg1, int arg2, void *common)
{
running = 0;
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, THREAD_ATTR_USER, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
return thid;
}
int aktivmenu = 0;
int maxmenu = 2;
char menu[3][15] = {"Spiel starten","Spiel laden","Spiel beenden"};
void printmenu(){
int i;
for(i=0;i<maxmenu+1;i++)
{
if(aktivmenu == i)
{
pspDebugScreenPrintf("-> %s\n",menu[i]);
}
else
{
pspDebugScreenPrintf(" %s\n",menu[i]);
}
}
}
int main()
{
pspDebugScreenInit();
SetupCallbacks();
SceCtrlData pad;
int button = 0;
printmenu();
while(running)
{
sceCtrlReadBufferPositive(&pad, 1);
if((pad.Buttons & PSP_CTRL_DOWN) && (aktivmenu != maxmenu) && (button == 0))
{
aktivmenu++;
pspDebugScreenClear();
printmenu();
}
if((pad.Buttons & PSP_CTRL_UP) && (aktivmenu != 0) && (button == 0))
{
aktivmenu-=1;
pspDebugScreenClear();
printmenu();
}
if((pad.Buttons & PSP_CTRL_DOWN) || (pad.Buttons & PSP_CTRL_UP))
{
button = 1;
}
else
{
button = 0;
}
if((aktivmenu == 2) && (pad.Buttons & PSP_CTRL_CROSS))
{
sceKernelExitGame();
}
}
return 0;
}
Ich hoffe euch gefällt das Tutorial