Hilfe beim erstellen eines Menüs

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Julz

Betreff: Hilfe beim erstellen eines Menüs

BeitragDo, Jan 08, 2004 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 08, 2004 11:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 08, 2004 11:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 08, 2004 12:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Embarassed

Jan_

Ehemaliger Admin

BeitragDo, Jan 08, 2004 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 08, 2004 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 08, 2004 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hä?

Die wird bei der quelltext datei einfach als erstes aufgerufen!
between angels and insects

Julz

BeitragDo, Jan 08, 2004 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub ich bin zu blöd Embarassed wir lassen das lieber

sorry das ich dich die ganze zeit genervt hab

Jolinah

BeitragDo, Jan 08, 2004 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 08, 2004 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 08, 2004 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Julz

BeitragDo, Jan 08, 2004 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 08, 2004 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 08, 2004 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Jan 08, 2004 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 08, 2004 15:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Jan 08, 2004 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 08, 2004 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Confused

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Jan 08, 2004 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

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
und Debugger einschalten nicht vergessen sonst hängt das Spiel
[BB2D | BB3D | BB+]

Julz

BeitragDo, Jan 08, 2004 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
en fehler kommt ja nicht aber ich habs trotzdem noch mal nach deiner methode versucht geht immer noch nicht der zeigt nix an

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group