Hilfe beim erstellen eines Menüs
Übersicht

![]() |
JulzBetreff: Hilfe beim erstellen eines Menüs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also einfach gesagt ich bräuchte hilfe beim erstellen eines menüs, ich hab mir schon das beispiel auf renes buch angeschaut aber, mein ganzes spiel ist in functionen eingeteilt und wenn ich jetzt z.B:
graphics 640,480 setbuffer backbuffer() repeat Menü blabla eingabe = input(Was tun ???) if eingabe = 1then start() elseif eingabe = 2 2player() elseif eingabe = 3 then end endif flip until keyhit(1) function start() end function so i der art sah das bei mir aus aber in der funcktion start kann ich ja jetzt nicht wieder noch 10 weitere funktionen aufrufen....wie macht man das dann ??? |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Alend, ne Frage zum Menü aufruf, das hasse ich jedesmal bei meinen eigen Projekten!
Mache es am besten so, 3 functionen zum Löschen: delPics() delsounds() delVariablen() Ne Menü function menu() Und die Level erstell functionen Loaddate() Loadsounds() loadpics() createStartVariablen() usw. Nun machst du es so, Game.bb: Code: [AUSKLAPPEN] S=Menu()
if s=Start then Loaddate() Loadsounds() loadpics() createStartVariablen() end if if s=Neustart then delPics() delsounds() delVariablen() end if if s=end then end if s =0 then runtimeerror("Fehler") end Achtung, Quelltext functioniert nicht! Nun machst du beim Menü einen Rückgabe wert, was angeklickt wurde. vergesse aber nicht, alle medien vom Menü wieder zu löschen! |
||
between angels and insects |
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aber denke doch bitte mal über ein anderes Menü Konzept nach!
Hier ein Beispiel mit schlechter Grafik und langsamer Nvigation, sollte aber zeigen, das man nicht input verwenden sollte. http://people.freenet.de/chopper/Menue.part1.rar (490kb) http://people.freenet.de/chopper/Menue.part2.rar (490kb) http://people.freenet.de/chopper/Menue.part3.rar (160kb) OK, verstanden? Bei besonderen Wünschen gibst auch ein bisschen Quelltext! |
||
between angels and insects |
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also soll ich direkt alle funcktionen die für das spiel benötigt werden direkt im menü aufrufen ???
aber ich hab das nciht so ganz verstanden wenn ich das so mache dann fragt der direkt wenn ich auf 1 (um das spiel dann im menü zu starten)gehe dann fragt der direkt wieder ab was ich machen will.... muss ich dann um die funktionen fürs spiel wieder ne eigene spielschleife machen oder was ???? Code: [AUSKLAPPEN] graphics 640,480 setbuffer backbuffer() repeat Menü eingabe = input(Was tun ???) if eingabe = 1then repeat cls funktionenaufrufe fürs spiel .............. until keydown(1) elseif eingabe = 3 then end endif flip until keyhit(1) funcktionen fürs spiel kann ich das so machen ???? weil irgendwie klappt das alles nicht so und ich hab dein beispiel nicht so ganz verstanden ![]() |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, das menü ist eine Eigene Function! mit rückgabe wert!
Code: [AUSKLAPPEN] Function menu() graphics 640,480 setbuffer backbuffer() repeat Menü eingabe = input(Was tun ???) Return eingabe flip until keyhit(1) end function Code: [AUSKLAPPEN] s=menu() if s= 0 then end if s=>3 then end if s= 1 then 1 player usw... Wenn du es so machst, kannst du später das Menu wieder besser aufrufen! |
||
between angels and insects |
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja und wann wird die funktion menü aufgerufen ???
und dann wie ist das wenn player1 aufgerufen wird muss ich das ganze noch mal in eine eigene spielschleife packen ???? |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hä?
Die wird bei der quelltext datei einfach als erstes aufgerufen! |
||
between angels and insects |
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaub ich bin zu blöd ![]() sorry das ich dich die ganze zeit genervt hab |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich hab das Problem bei mir so gelöst:
Code: [AUSKLAPPEN] Graphics3d 1024,768,1,32 SetBuffer BackBuffer() Const SHOW_MENU = 1 Const SHOW_SPIEL = 2 Const SHOW_GAMEOVER = 3 Const SHOW_EXIT = 4 Global anzeige = SHOW_MENU Global prev_anzeige = 0 Global load_data = 1 Global free_data = 0 Global bild ;Die Bilder und sounds die man verwendet global setzen. Global sound ;geladen werden sie dann in einer Funktion. Global exit_prog = 0 ;Wir benötigt zum beenden des Programms usw... das sind die verschiedenen Sachen die angezeigt werden können. Immer nur eins zur gleichen Zeit. Welches gerade angezeigt wird speichert man in ner Variable, in meinem Fall "anzeige". load_data gibt an ob in diesem Schleifendurchgang etwas geladen werden muss und free_data ob etwas aus dem Speicher entfernt werden muss. SHOW_EXIT ist eine Ausnahme. Es bewirkt das das Programm beendet wird. Code: [AUSKLAPPEN] Repeat Cls Load() Show3d() UpdateWorld() RenderWorld() Show2d() Free() Flip Until exit_prog = 1 End Das ist dann die Hauptschleife, und das ganze Spiel läuft eigentlich in Funktionen ab. Die Funktion Load() lädt alle Bilder, Sounds usw. und setzt Variablen. Müssen halt alle Global sein weil das Spiel eben in einer Funktion läuft. Auch die Bilder und Sounds usw. Die Funktion Show3d() macht alles was mit 3d zu tun hat. Die Funktion Show2d() alles was mit 2d zu tun hat. Die Funktion Free() entfernt Sachen aus dem Speicher. Code: [AUSKLAPPEN] Function Load() If load_data = 1 ;Nur etwas laden wenn es auch nötig ist ;) Select anzeige Case SHOW_MENU ..... ;Alles was fürs Menü geladen werden muss, bilder etc. Case SHOW_SPIEL ..... ;Alles was fürs Spiel ist laden. Case SHOW_GAMEOVER ..... ;Alles was für Gameover screen benötigt wird laden End Select load_data = 0 ;Daten beim nächsten Schleifendurchgang nicht nochmal laden Endif End Function Function Free() If free_data = 1 ;Nur löschen wenn es nötig ist. Select prev_anzeige Case SHOW_MENU .... ;alles aus speicher löschen das das Menü benutzte. Case SHOW_SPIEL .... ;alles für spiel entfernen Case SHOW_GAMEOVER .... ;alles für gameover entfernen End Select If anzeige = SHOW_EXIT .... ; Spezielle sachen beim beenden des Programms Endif free_data = 0 ;Beim nächsten Durchgang nicht nochmal versuchen zu löschen Endif End Function Load ladet dann je nachdem was gerade angezeigt werden soll/wird die benötigten Sachen. Free() entfernt die sachen wieder. Man beachte das ich bei Free prev_anzeige abgefragt habe statt anzeige. Aus welchem Grund? Ganz einfach. Während dem Spiel ändert man die anzeige. Wenn man anzeige abfragen würde, dann würde das falsche versucht aus dem Speicher zu löschen. Wir wollen zwar was neues anzeigen, aber löschen muss man das Alte. Dazu muss man noch ne Funktion machen die die Anzeige wechselt. Die aktuelle anzeige wird dann in prev_anzeige gespeichert und anzeige auf das neu gewünschte gesetzt. SHOW_EXIT ist eine Ausnahme. Bei SHOW_EXIT prüfe ich nicht die vorherige Anzeige sondern die aktuelle Anzeige. Denn wenn man das Programm beenden will kommt ja kein nächster Schleifendurchgang mehr. Und dort kann man dann spezielles einfügen das evtl. benötigt wird beim beenden des Programms. Code: [AUSKLAPPEN] Function Show3d() Select anzeige case SHOW_MENU Menu3d() ;Menu ausführen (3d grafik) case SHOW_SPIEL Spiel3d() ;Spiel 3d grafik case SHOW_GAMEOVER GameOver3d() ;GameOver 3d End Select End Function Function Show2d() Select anzeige case SHOW_MENU Menu() ;Menu 2d grafik case SHOW_SPIEL Spiel() ;Spiel 2d grafik case SHOW_GAMEOVER GameOver() ; Gameover 2d grafik End Select End Function Das selbe Prinzip wie bei Load() auch wieder beim Zeichnen. Es wird abgefragt was gerade angezeigt werden soll, und je nachdem die Richtige Funktion ausgeführt. Code: [AUSKLAPPEN] Function change_anzeige(show) prev_anzeige = anzeige ;Speichern der aktuellen anzeige anzeige = show ;Neue anzeige setzen. load_data = 1 ;Es sollen neue Daten geladen werden, weil wir ja wechseln free_data = 1 ;Und die alten sollen gelöscht werden. If anzeige = SHOW_EXIT load_data = 0 ;Wenn das Programm beendet werden soll ist es nicht nötig zu laden exit_prog = 1 ;Damit das Programm schlussendlich auch wirklich beendet wird Endif End Function Dann kann man ganz einfach sagen: Code: [AUSKLAPPEN] Function Menu() ... If eingabe = 1 change_anzeige(SHOW_SPIEL) ;Spiel beginnt Elseif eingabe = 2 change_anzeige(SHOW_EXIT) ;Programm wird beendet Endif ... End Function Letztlich muss man dann natürlich nur noch die Funktionen schreiben wo das eigentliche Menu,Spiel,Gameover screen drin läuft. Jeweils eine für 3d und eine für 2d. Und wenn man kein 3d macht kann man einfach die Show3d() funktion rausnehmen und natürlich auch keine 3d funktionen machen. Hoffe ich konnte dir weiterhelfen. |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn ich in einer funktion in dem fall load() eine variable global deffinieren will dann kommt bei mir die meldung:
'Global' can only appear in main program oder mach ich da was falsch ??? |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Alles was Global ist muss man vorher schon als Global definieren. Bei Load() dann nur noch setzen.
Also: Global variable In der schleife dann: variable = LoadImage(...) etc. [edit] Und beim löschen in der Free() FreeImage variable : variable = 0 [/edit] Hab ich versucht in dem Beispiel oben auch mit kommentaren zu erklären ![]() |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
axo ahhhhh......das hab ich jetzt verstanden...aber noch ne letzte frage
in der funktion spiel() ist dann das spiel drin aber mein spiel besteht ungefähr aus 10 funktionen -bewegung -schießen u.s.w...soll ich die dann alle weg machen und alles in die eine funktion packen ???? |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein brauchst du nicht. Funktionen kann man ja so oft verschachteln wie man will.
Code: [AUSKLAPPEN] Function Spiel() Bewegung() Schiessen() .... End Function Function Bewegung() ... End Function Function Schiessen() ... End Function Gibt halt nen recht grossen Code und sehr viele Funktionen. Aber so kann man ohne Probleme immer mehr Abschnitte des Programms einfügen, einfach neue Const definieren. Und weitere Einträge in der Load() Free() Show3d() Show2d() und dann nochmal 2 neue funktionen eine für 3d, die andere für 2d |
||
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also gut ich habs so halb verstanden ich muss es erst ma ausprobieren danke aber schon mal für die geduld danke auch an Jan_ für die geduld ![]() |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
hi,
hier ist meine Version: und zwar sollte der Aufbau des Spiels folgendermaßen sein um ein Optionsmenue nachträglich einzubauen 1 Grafik einschalten globale Variablen definieren und Constanten dann stellst du deine werte ein! zb spieleranzahl = 1 und so weiter diese variablen kannste dann von hand erstmal einstellen um zu testen ob das programm geht, da es ja mit 2 Spielern zum teil anderer code ist, bzw erweiterter code die werte die du vor spielbeginn eingestellts werden dann im options Menue eingestellt jetzt wird das optionsmenue eingebaut als selbstständiges Programm bzw eigene schleife anstatt spieleranzahl = 1 machste zB. gosub Optionen irgendwo unten im Code dann .optionen; = Sprungmarke bilderladen und so weiter für das Menue repeat draw irgendwas male Button oder wasweißich um die Spieleranzahl abzufragen wenn die eingabe erledigt ist wert übergeben zb. if input ="1" then spieleranzahl = 1 if input ="2" then spieleranzahl = 2 hier kannste dann auch alles andere einstellen until keyhit(enter) evt. Bilder löschen die nicht mehr benötigt werden return; = wieder zurück, spiel mit diesen werten starten |
||
[BB2D | BB3D | BB+]
|
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich hab das so verstanden
Code: [AUSKLAPPEN] Repeat Cls eingabe = input("Was tun ?") if eingabe = 1 then spiel() elseif eingabe = 2 then end else text 10,10, "Falsche Eingabe" endif Flip Until KeyHit(1) function spiel() repeat drawlevel() moveplayer() drawplayer() randtest() levels() monsterrandtest() randtestschuss() schiessen() schussmalen() gegner() collision() drawenemy() hud() until keydown(1) end function dann kommen vorher halt noch die ganzen variablen und danach noch die funktionen.......aber wenn ich das dann 1 drücke dann bleibt mein bildschirm schwarz, erst wenn ich escape drücke sieht man kurz das spiel und dann geht der ganz raus zurück zu windoof |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
nicht
until keydown(1) sondern until keyhit(1) und nach der ersten Schleife dann end da sonst die zweite bei ESC unbeabsichtigt läuft und mit keydown(ESC) auch sofort abbricht , ist halt sehr schnell das andere sollte eigendlich klappen mit Spiel()Code: [AUSKLAPPEN] Repeat
Cls eingabe = input("Was tun ?") if eingabe = 1 then spiel() elseif eingabe = 2 then end else text 10,10, "Falsche Eingabe" endif Flip Until KeyHit(1) end ;<<<<<<<<<<<<<<<< function spiel() repeat drawlevel() moveplayer() drawplayer() randtest() levels() monsterrandtest() randtestschuss() schiessen() schussmalen() gegner() collision() drawenemy() hud() until keyhit(1) ;<<<<<<<<<<<<<<<< ist besser end function |
||
[BB2D | BB3D | BB+]
|
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
habs jetzt geändert wenn ich jetzt 1 eingebe und dann enter drücke geht der sofort aus dem spiel raus und zurück zu windows ![]() |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
mußte mal mit dem debugger arbeiten
setzt ein stop so etwa und geh in einzelschritten weiter daqnn siehst du doch wo der Fehler liegt so etwaCode: [AUSKLAPPEN] Repeat
und Debugger einschalten nicht vergessen sonst hängt das Spiel
Cls eingabe = input("Was tun ?") if eingabe = 1 then stop ;<<<<<<<<<<< spiel() elseif eingabe = 2 then end else text 10,10, "Falsche Eingabe" endif Flip Until KeyHit(1) end ;<<<<<<<<<<<<<<<< function spiel() repeat drawlevel() moveplayer() drawplayer() randtest() levels() monsterrandtest() randtestschuss() schiessen() schussmalen() gegner() collision() drawenemy() hud() until keyhit(1) ;<<<<<<<<<<<<<<<< ist besser end function |
||
[BB2D | BB3D | BB+]
|
![]() |
Julz |
![]() Antworten mit Zitat ![]() |
---|---|---|
en fehler kommt ja nicht aber ich habs trotzdem noch mal nach deiner methode versucht geht immer noch nicht der zeigt nix an | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group