|
Verfasser |
Nachricht |
_Kai_
be linux
Beiträge: 2.680
Gruppe: Programmierung
Registriert seit: Nov 2009
Status:
Abwesend
Danke erhalten: 2809
|
[TUT] Einfaches Menü in C
Hi,
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.
Eine Void Funktion, da sie keinen Wert per Return zurückgeben muss.
Diese Variable benötigen wir jetzt in der For Schleife.
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.
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
Die Callbacks und der DebugScreen werden initialisiert:
pspDebugScreenInit();
SetupCallbacks();
Variable für die Tasten:
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.
Das Menü muss am Anfang ausgegeben werden auch wenn noch keine Taste gedrückt wurde:
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.
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:
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;
}
Das ganze sieht auf der PSP dann so aus:
Ich hoffe euch gefällt das Tutorial
PSVita mit 16gb Memorystick und PlayStation+
+ Uncharted + Army Corps of Hell + Assassins Creed
+ NFS Most Wanted + COD Black Ops + Resistance
+ Everybodys Golf + Modnation Racers
Für PSN ID => PN
Dieser Beitrag wurde zuletzt bearbeitet: 08.01.2011 20:59 von _Kai_.
|
|
26.11.2010 17:48 |
|
Folgende User bedanken sich: Junkstarr (Oct-26-2011), Vault_11 (Aug-28-2011), alper98 (Aug-27-2011), Suicide_Diamond (Aug-25-2011), Mikedaburner09 (Jul-27-2011), michi_95 (Jun-17-2011), BAM (TZX) (Jun-16-2011), fener98 (May-24-2011), Yata (Mar-15-2011), ~Hook~ (Mar-9-2011), greenieZ (Feb-19-2011), ToXXiN (Feb-19-2011), dark-awesome (Feb-19-2011), Cor7eZ (Jan-24-2011), eMKayWe (Jan-22-2011), Tim2001 (Jan-8-2011), Fixie (Jan-8-2011), nerbert (Jan-7-2011), Storm (Dec-3-2010), Littlefighter19 (Dec-3-2010), Leon54321hn (Dec-3-2010), Unbekannt (Nov-30-2010), alexking (Nov-29-2010), Peda1996 (Nov-26-2010), Amnezia (Nov-26-2010), xxx_knoppix_xxx (Nov-26-2010), Cha0z (Nov-26-2010), Musik_Arab (Nov-26-2010), PSP-ELITE (Nov-26-2010), pspbricker (Nov-26-2010), Axiom_Pwns (Nov-26-2010), WinterFrost (Nov-26-2010) |
|
WinterFrost
Moderator a.D.
Beiträge: 2.667
Gruppe: Mod a.D.
Registriert seit: Aug 2010
Status:
Offline
Danke erhalten: 3152
|
RE: [TUT] Einfaches Menü in C
Gefällt mir gut, habe es mal angepinnt.
|
|
26.11.2010 17:54 |
|
Folgende User bedanken sich: |
|
PSP-ELITE
Banned
Beiträge: 424
Gruppe: Banned
Registriert seit: Oct 2010
Status:
Offline
Danke erhalten: 111
|
RE: [TUT] Einfaches Menü in C
Muss schon sagen,es wurde sehr gut erklärt und hat mir auch was gebracht,denn ich will C leren.Danke!!!
Mfg
|
|
26.11.2010 18:28 |
|
|
|
Cha0z
Banned
Beiträge: 1.501
Gruppe: Banned
Registriert seit: Oct 2010
Status:
Abwesend
Danke erhalten: 436
|
RE: [TUT] Einfaches Menü in C
Das TuuuuT ist auch auf PSP-Hilfe.de
Dort sind alle TuTs von ihm, die meisten sind auch gut :bravo:
Alter Nick: Co$m0
Was für ein Lügner! Der Bearbeitet ein Bild mit schönen Paint -.-
|
|
26.11.2010 19:23 |
|
|
|
XiaDao
Android Vogel
Beiträge: 2.798
Gruppe: User
Registriert seit: May 2009
Status:
Abwesend
Danke erhalten: 1287
|
RE: [TUT] Einfaches Menü in C
Das TuuuuT ist auch auf PSP-Hilfe.de
Dort sind alle TuTs von ihm, die meisten sind auch gut :bravo:
Mann...
Das steht doch da:
Ich poste hier mal ein kleines Tutorial von PSP-Hilfe.de
@ PSP-Hilfe:
gutes TUT, aber es wäre ein wenig sinnvoller Begriffe wie
Das ist ein Zweidimensionaler Char Array, seine Größe beträgt 35 Byte (3*15) und es werden 3 Zeiger gesetzt.
für Noobss genauer zu erläutern!
..
|
|
26.11.2010 19:31 |
|
Folgende User bedanken sich: |
|
Cha0z
Banned
Beiträge: 1.501
Gruppe: Banned
Registriert seit: Oct 2010
Status:
Abwesend
Danke erhalten: 436
|
RE: [TUT] Einfaches Menü in C
Alter Nick: Co$m0
Was für ein Lügner! Der Bearbeitet ein Bild mit schönen Paint -.-
|
|
26.11.2010 19:42 |
|
|
|
_Kai_
be linux
Beiträge: 2.680
Gruppe: Programmierung
Registriert seit: Nov 2009
Status:
Abwesend
Danke erhalten: 2809
|
RE: [TUT] Einfaches Menü in C
Das TuuuuT ist auch auf PSP-Hilfe.de
Dort sind alle TuTs von ihm, die meisten sind auch gut :bravo:
Ja stimmt steht ja auch oben Würde mich freuen wenn ihr auch den ein oder anderen Artikel dort schreiben würdet :D
@ PSP-Hilfe:
gutes TUT, aber es wäre ein wenig sinnvoller Begriffe wie
Das ist ein Zweidimensionaler Char Array, seine Größe beträgt 35 Byte (3*15) und es werden 3 Zeiger gesetzt.
für Noobss genauer zu erläutern!
Naja ich wüsste nicht wie ich das besser beschreiben sollte.
Setz plz. den Kompletten Source Code im Spoiler, da der Text sonst zu lange ist
Ist gemacht
PSVita mit 16gb Memorystick und PlayStation+
+ Uncharted + Army Corps of Hell + Assassins Creed
+ NFS Most Wanted + COD Black Ops + Resistance
+ Everybodys Golf + Modnation Racers
Für PSN ID => PN
|
|
26.11.2010 20:04 |
|
Folgende User bedanken sich: |
|
XiaDao
Android Vogel
Beiträge: 2.798
Gruppe: User
Registriert seit: May 2009
Status:
Abwesend
Danke erhalten: 1287
|
RE: [TUT] Einfaches Menü in C
Das TuuuuT ist auch auf PSP-Hilfe.de
Dort sind alle TuTs von ihm, die meisten sind auch gut :bravo:
Ja stimmt steht ja auch oben Würde mich freuen wenn ihr auch den ein oder anderen Artikel dort schreiben würdet :D
@ PSP-Hilfe:
gutes TUT, aber es wäre ein wenig sinnvoller Begriffe wie
Das ist ein Zweidimensionaler Char Array, seine Größe beträgt 35 Byte (3*15) und es werden 3 Zeiger gesetzt.
für Noobss genauer zu erläutern!
Naja ich wüsste nicht wie ich das besser beschreiben sollte.
Setz plz. den Kompletten Source Code im Spoiler, da der Text sonst zu lange ist
Ist gemacht
z.B. beschreibn was ein Char Array ist. Das TUT is ja für Anfämger gedacht oder?
..
|
|
26.11.2010 20:06 |
|
|
|
pspbricker
Mod a.D.
Beiträge: 3.428
Gruppe: User
Registriert seit: May 2008
Status:
Offline
Danke erhalten: 1641
|
RE: [TUT] Einfaches Menü in C
Array kann man sich vorstellen wie Tabellen im. Sie bestehen aus einer bestimmten Anzahl von Feldern des selben Types, also:
char test[2];
test[0] = 'a';
test[1] = 'b';
Wir weiesen also den ersten Feld unser Char Array den Buchstaben a und zweiten Feld den Buchstaben b zu. Die Zählung der Felder beginnt in C mit 0, bei der initialiesirung muss aber darauf geachtet werden, dass die Anazhl der Feldern (von 1 angefangen zu zählen) angeben wird:
char test[1];
test[0] = 'a';
//richtig
char test[2];
test[0] = 'a';
test[1] = 'a';
test[2] = 'a';
//falsch, da nur 2 Felder deklariert worden sind
Strings also Zeichenketten sind in C nichts anderes als Char Arrays, deswegen wird bei dem Menü die Menüpunkte auch in einer solchen abgespeichert.
Meine PS3 Games : Warhawk , NFS: Pro Street, Motorstorm ,Midnight Club LA, LittleBigPlanet, GTA4, Uncharted 2, Overlord, Killzone2, PES10, Battlefield ´43, Socom: Confrontation,
Forum Regeln Beachten! KEIN ISO Talk! KEINE Beleidigungen! KEINE illegalen Links!
|
|
26.11.2010 20:47 |
|
Folgende User bedanken sich: |
|
HacKmaN
Ex-Developer
Beiträge: 2.423
Gruppe: User
Registriert seit: Oct 2009
Status:
Offline
Danke erhalten: 3319
|
RE: [TUT] Einfaches Menü in C
@PSP-Hilfe: Sehr gutes Tutorial, wird Anfängern sicherlich helfen einfache Menüs zu coden (wenn ich daran denke was ich damals als ich mit C angefangen hab für Menüs gecodet hab... allein wenn ich an diese Ideen denke würd ich jetzt nen Herzinfakt bekommen ).
Ja, also n' NooB würde da kaum ein Wort verstehen, sondern gleich den Kompletten Src. abschreiben
1. Man sollte C gut können bevor man mit der PSP anfängt
Fachbegriffe müssen daher IMHO in solchen Tutorials nicht erklärt werden.
2. Du redest anscheinend über dich selber... du machst ja auch nichts anderes als Sources zu kopieren ohne sie zu verstehen -.-
Dieser Beitrag wurde zuletzt bearbeitet: 26.11.2010 20:56 von HacKmaN.
|
|
26.11.2010 20:56 |
|
Folgende User bedanken sich: |
|
~ferra~
Experte
Beiträge: 583
Gruppe: User
Registriert seit: Apr 2010
Status:
Offline
Danke erhalten: 461
|
RE: [TUT] Einfaches Menü in C
@ PSP-Hilfe:
gutes TUT, aber es wäre ein wenig sinnvoller Begriffe wie
Das ist ein Zweidimensionaler Char Array, seine Größe beträgt 35 Byte (3*15) und es werden 3 Zeiger gesetzt.
für Noobss genauer zu erläutern!
Ein Array ist ein Datentyp. Diesen gibt es in 3 verschiedenen Formen.
Einmal als Feld, danach als Tabelle und als räumliches Array. PSP-Hilfe verwendet ein zweidimensionales Array, das bedeutet, das es einer Tabelle ähnelt.
Ein Array ist also eine Sammlung mehrer Datenwerte in einem. Jedoch müssen sie alle den selben Datentyp haben. Hier also Char.
Vorstellen kann man sich das so:
Normalerweise müsste man jetzt für jeden Wert eine neue Variable definieren. Mit einem Array fällt sowas weg. Man bestimmt am Anfang wie groß ein Array sein soll, also wie viele Werte reinpassen. Danach kann man einfach darauf zugreifen.
Pseudocode:
arrayname[Index]
Wenn man vorher also ein Array mit einer Größe von 32 Speicherbereichen definiert hat, stehen einem also von der 0 bis zur 31 alle Werte einfach zur Verfügung, indem man sie einfach mit arrayname[1] oder arrayname[21] aufruft.
Bei einem zweidimensionalen stehen jedem ersten Wert zwei weitere zur Verfügung. So ruft man es also folgender maßen auf:
arrayname[Index1,Index2].
Demzufolge hätte man 2 Speicherplätze, da arrayname[1,1] und arrayname[1,2] zur Verfügung stehen.
Danach geht es weiter mit arrayname[2,1] und arrayname[2,2]...
Bei einem dreidimensionalen Array geht es eben mit 3 Ebenen weiter.
MfG ferra
|
|
26.11.2010 21:06 |
|
Folgende User bedanken sich: |
|
_Kai_
be linux
Beiträge: 2.680
Gruppe: Programmierung
Registriert seit: Nov 2009
Status:
Abwesend
Danke erhalten: 2809
|
RE: [TUT] Einfaches Menü in C
z.B. beschreibn was ein Char Array ist. Das TUT is ja für Anfämger gedacht oder?
Also was Char für ein Datentyp ist und was ein Array ist sollte man schon wissen. Wenn ich alle diese Kleinigkeiten erklären würde wäre das Tutorial schon 3 Seiten lang bevor es überhaupt an das Menü geht Trotzdem Danke dass ihr die beiden Begriffe so ausführlich erklärt habt
(wenn ich daran denke was ich damals als ich mit C angefangen hab für Menüs gecodet hab... allein wenn ich an diese Ideen denke würd ich jetzt nen Herzinfakt bekommen ).
Lass mich raten, kein bisschen dynamisch und für jeden ausgewählten Menüpunkt hast du alle neu manuell ausgegeben mit dem Pfeil an der richtigen Stelle so dass alle Menüpunkte 5 mal vorkommen im Code ? Sowas hab ich paar mal gesehen desswegen hab ich auch das Tutorial geschrieben ^^
1. Man sollte C gut können bevor man mit der PSP anfängt
Fachbegriffe müssen daher IMHO in solchen Tutorials nicht erklärt werden.
Naja ich muss gestehen ich hab mich nie großartig mit C beschäftigt bringe aber schon etwas Erfahrung aus diversen Websprachen mit
PSVita mit 16gb Memorystick und PlayStation+
+ Uncharted + Army Corps of Hell + Assassins Creed
+ NFS Most Wanted + COD Black Ops + Resistance
+ Everybodys Golf + Modnation Racers
Für PSN ID => PN
Dieser Beitrag wurde zuletzt bearbeitet: 26.11.2010 21:46 von _Kai_.
|
|
26.11.2010 21:44 |
|
|
|
Unbekannt
Holiday News-Writer
Beiträge: 1.600
Gruppe: User
Registriert seit: Mar 2010
Status:
Offline
Danke erhalten: 4404
|
RE: [TUT] Einfaches Menü in C
Tolles Tutorial.
Für Farben geht doch auch:
Interessiere mich seit meine PSP kaputt ist nichtmehr so an C für Psp .
Ab Sofort werden alle unnötigen PNs nicht mehr beantwortet. Ich bin wieder mal weg von PSPKing und unterstütze eine andere Seite da ich hier nicht mehr erwünscht bin. Danke an PSP-Hilfe und den Moderatoren und all die anderen User die nicht so viel Dummeszeug labern.
|
|
30.11.2010 23:42 |
|
|
|
_Kai_
be linux
Beiträge: 2.680
Gruppe: Programmierung
Registriert seit: Nov 2009
Status:
Abwesend
Danke erhalten: 2809
|
RE: [TUT] Einfaches Menü in C
Tolles Tutorial.
Für Farben geht doch auch:
Interessiere mich seit meine PSP kaputt ist nichtmehr so an C für Psp .
Wenn dann mit pspDebugScreenSetTextColor() das ist ja kein Konsolenapp ^^
PSVita mit 16gb Memorystick und PlayStation+
+ Uncharted + Army Corps of Hell + Assassins Creed
+ NFS Most Wanted + COD Black Ops + Resistance
+ Everybodys Golf + Modnation Racers
Für PSN ID => PN
|
|
01.12.2010 00:06 |
|
Folgende User bedanken sich: |
|
Unbekannt
Holiday News-Writer
Beiträge: 1.600
Gruppe: User
Registriert seit: Mar 2010
Status:
Offline
Danke erhalten: 4404
|
RE: [TUT] Einfaches Menü in C
Und wie definiere ich die Farbe ?
Ab Sofort werden alle unnötigen PNs nicht mehr beantwortet. Ich bin wieder mal weg von PSPKing und unterstütze eine andere Seite da ich hier nicht mehr erwünscht bin. Danke an PSP-Hilfe und den Moderatoren und all die anderen User die nicht so viel Dummeszeug labern.
|
|
01.12.2010 16:34 |
|
|
|
|