Startmenü

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Serdon

Betreff: Startmenü

BeitragMo, Sep 20, 2010 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Mein Name ist Max, und ich bin wirklich ein neuling.
Ich hab mir ein Buch über Spiele Programmierung mit BB gekauft, bei der auch eine Demo-Version
CD dabei war.
Die einfache 2D-Spieleprogrammierung hab ich relativ schnell begriffen, und habe dann auch
relativ schnell ein paarkleine Games programmiert.
Nun möchte ich mir die Vollversion von BB 2D kaufen.
Allerdings, wurde in dem Buch, nichts davon geklärt, wie man einen anständigen Menü-Bildschirm
erstellt.
Da ich es nicht besonders orginell finde, dass man sobald man das Spiel startet im aktiven Spiel
befindet, wollte ich fragen, wie man einen guten Menü-Bildschirm erstellt.
Ungefähr so:

-Start
-Optionen
-Beenden

Also nichts besonderes.
Ich freue mich auf jede Antwort.

Raiden93

BeitragMo, Sep 20, 2010 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Max,
Ich habe mir das Buch auch gekauft aber allerdings die Vollversion zum Geburtstag bekommen Wink

Also es ist so das du am besten eine Variable erstellst die die verschiedenen Menüs später anzeigt und auch wieder verschwinden lässt.
z.b
Code: [AUSKLAPPEN]
Menu_Show = 1   <----

Ich nehme extra immer 1 und nicht 0 für das Hauptmenü,weil 0 ExitScreen 1Hauptmenu 2Game

Dan erstellst du in einer Funktion oder in der Hauptschleife eine IF Bedinung.
Code: [AUSKLAPPEN]
If Menu_Show = 0
   ;~~~EXIT MENU SACHEN
ElseIf MenuShow = 1
   ;~~~~HAUPTMENU SACHEN.wo die buttons hintergrund bilder und so drinne sind
ElseIf MenuShow = 2
   ;Deine Spiel sachen.
End If


Oder ich glaube es gibt auch noch ein simples Programm das BlitzGUI heißt aber das nutze ich nicht mache lieber alles selber.

empet

BeitragMo, Sep 20, 2010 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
such doch mal im forum, ich hab etwa 7 seiten gefunden... da ist sicher was für dich Smile
 

CO2

ehemals "SirMO"

BeitragMo, Sep 20, 2010 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun ja,
also ich habe es so gelernt, dass man erstmal für jeden Button (Start, Optionen, Beenden) eine Variable anlegt (na gut, 2... einmal das Bild was angezeigt werden soll, danach die "Zustand"-Variable). Ich habe mir zu einem älteren Projekt dazu folgenden Code gebastelt:

Code: [AUSKLAPPEN]


;Buttons, etc. laden...

Global background = LoadImage("data\gfx\b.gfx") ;Hintergrund

Global mouse = LoadImage("data\gfx\mouse.gfx") ;Maus

Global beenden = LoadImage("data\gfx\be.gfx") ;Beenden-Button normal
Global beenden2 = LoadImage("data\gfx\beo.gfx") ;Beenden-Button wird von Maus berührt
Global beenden3 = LoadImage("data\gfx\bep.gfx") ;beenden-Button wird gedrückt

Global credits = LoadImage("data\gfx\cr.gfx") ;s.o.
Global credits2 = LoadImage("data\gfx\cro.gfx")
Global credits3 = LoadImage("data\gfx\crp.gfx")

Global laden = LoadImage("data\gfx\la.gfx") ;s.o.
Global laden2 = LoadImage("data\gfx\lao.gfx")
Global laden3 = LoadImage("data\gfx\lap.gfx")

Global neuesspiel = LoadImage("data\gfx\ns.gfx") ;s.o.
Global neuesspiel2 = LoadImage("data\gfx\nso.gfx")
Global neuesspiel3 = LoadImage("data\gfx\nsp.gfx")

;Variablen anlegen

Global mx
Global my

Global menu = 0
Global game = 1 
Global namenseingabe = 0

Global FPS = CreateTimer(60)

;Hauptschleife

Repeat
       Cls
       Waittimer(FPS)

   mx = MouseX()                 ;mx aktualisieren
   my = MouseY()                 ;my aktualisieren


 If(menu = 1)Then ;Wenn die Variable Menu auf 1 steht, also aktiv ist
       
            DrawImage background, 0, 0 ;Zeichen Background
           
            DrawImage neuesspiel, 350, 200 ;Zeichne Button "Neues Spiel"
           
            DrawImage credits, 350, 300 ;Zeichen Button "Credits"
           
            DrawImage beenden, 350, 400 ;Zeichne Button "Beenden"
           
            DrawImage mouse, mx, my ;Zeichne Maus (Zum Schluss, denn sie soll ja nicht unter anderen Buttons verschwinden.
           
           
            If ImagesOverlap(mouse, mx, my, neuesspiel, 350, 200) Then ;Wenn das Bild "mouse" das Bild "neues Spiel" Überlappt, dann
               
                DrawImage neuesspiel2, 350, 200 ;Zeichne das zweite bild von "Neues Spiel"
               
                DrawImage mouse, mx, my ;Zeichne Maus
               
                Text 0, 0, "Starte ein neues Spiel!" ;Gib den Infotext aus
               
                If MouseHit(1) Then ;wenn auf dem Button die 1.Maustaste gedrückt wurde, dann ändere folgende variablen...
                   
                    menu = 0 ;... menu wird deaktiviert
                    namenseingabe = 1 ;...Namenseingabe wird aktiviert
                   
                EndIf
               
           ElseIf ;nächster Button
       
    EndIf
EndIf

Until game = 0
End


Ja, und das war eigentlich schon der Code... bei ElseIf musst du nur deinen nächsten Button nach dem obigen schema programmiern, danach nochmal genauso den letzten...

Ach ja, wenn man auf "Neues Spiel" geklickt hat, wird die Namenseingabe aktiviert, du kannst dann natürlich auch sofort dein Spiel auusgeben lassen.

So hab ich es zumindest gelernt,
hoffe ich konnte helfen,
Gruß
SirMO
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Xeres

Moderator

BeitragMo, Sep 20, 2010 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist verbesserungsfähig Sirmo.
1) LoadAnimImage statt viele Loadimages ist übersichtlicher und kompackter.
2) Mousehit muss man zwischenspeichern, sonst kommt es zum bekannten Fehler, siehe FAQ.
3) ImagesOverlap ist nicht besonders genau, besser wäre es, die Mauskoordinaten zu verwenden.
4) Die gesamte Aktion Button zeichnen, auf Klick überprüfen usw. packt man in eine Funktion! If Button(...) then Aktionen wäre die übersichtlichste Methode.

Verwende eine Globale Variable für den Status des Programms und Statt zahlen wie Raiden93 verwende Konstanten -> Lesbarkeit!
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Thunder

BeitragMo, Sep 20, 2010 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
(@Raiden93:)
Ich glaube nicht, dass es schön ist, wenn das erste was ich in einer Hauptschleife habe so ein If-Block ist - der bei jedem Durchlauf geprüft werden muss und ich daher Performance verliere.
Ich löse das immer durch Rekursion. Das Menü bekommt eine eigene Schleife und wenn auf den Spiel-Button geklickt wurde, rufe ich eine Funktion Spiel auf, die eine eigene Hauptschleife hat. Wenn ich zurück ins Menü will, nehme ich Return.

Soweit ich das sehe, wurde der Rest bereits gesagt.

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

Serdon

BeitragDi, Sep 21, 2010 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für eure Antworten.

Ich werde das sobald wie möglich ausprobieren.
 

PacMani

BeitragDi, Sep 21, 2010 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Übrigens ist Select / Case viel schöööner Smile

Raiden93

BeitragDi, Sep 21, 2010 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ist schöner aber wenn er nicht viele Zahlen fürs Menü nutzt reicht die If schleife denke ich mal völlig aus^^.
Thunder: Ich habe doch geschrieben das er es auch in eine Function packen kann^^

Thunder

BeitragDi, Sep 21, 2010 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Tut mir Leid wenn ich deinen (wahrscheinlich durch einen ASCII-Schredder geratenen) Text falsch verstanden habe, aber:

Zitat:
Dan erstellst du in einer Funktion oder in der Hauptschleife eine IF Bedinung.


Ich dachte das bedeutet, er soll in der Hauptschleife oder in einer Schleife in einer Funktion eine If-Bedingung haben, was auf solche Schleifen hinauslaufen würde:
BlitzBasic: [AUSKLAPPEN]
Repeat
If Menu_Show = 0
...
ElseIf MenuShow = 1
...
ElseIf MenuShow = 2
...
EndIf
Until ...


Das ist unschön und nicht performant, weswegen ich meinen Tipp abgegeben habe, das nicht zu machen, sondern eine eigene Schleife für das Menü anzulegen aus der dann per Funktionsaufruf die Funktion aufgerufen wird, die die angeforderte Aktion ausführt. In den Schleifen dieser, braucht man keine If-Bedingung.

mfg Thunder

PS: "If-Schleife" -> *kotz*
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Xeres

Moderator

BeitragDi, Sep 21, 2010 20:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Select Case finde ich auch sinniger - aber was ist daran nicht performant?
Rekursion & mehrere Hauptschleifen würde ich für fehleranfälliger halten... muss jeder selber Wissen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Thunder

BeitragDi, Sep 21, 2010 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
ähm, vielleicht habe ich das komplett falsch verstanden, aber so wie ich das verstanden habe ist das einfach nicht sinnvoll:

BlitzBasic: [AUSKLAPPEN]
Repeat
Select MenuVar
Case 1
; Hier wird das Menü gezeichnet
Case 2
; Hier ist der Code für das Spiel
EndSelect
Until KeyHit(1)


Normalerweise habe ich den Code für das Spiel nicht in einer grundlegenden If-Bedingung, die prüft ob das Spiel oder das Menü gezeichnet werden soll.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Xeres

Moderator

BeitragDi, Sep 21, 2010 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Da kommt kein Code direkt, aber eine Funktion (Run_Game(), Run_Options() usw...) - in der Hauptschleife mit cls, Flip, Waittimer.

Code: [AUSKLAPPEN]
Repeat
    Cls
    ms = MilliSecs()
    mx = MouseX()
    my = MouseY()
    mh1 = MouseHit(1)
   
    Select GameState
        Case GS_MENU ; FGS_MENU()
        Case GS_PLAY ; FGS_PLAY()
        Case GS_HIGH ; FGS_HIGH()
        Case GS_INPU ; FGS_INPU()
    End Select
   
    Flip(0)
    Ftimer.wait()
Forever

(aus einem BCC Beitrag...)
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Thunder

BeitragDi, Sep 21, 2010 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau und wenn diese Funktionen jeweils eigene Hauptschleifen haben, sind wir bei dem, was ich gesagt habe.
Wenn nicht, ist es doppelt inperformant wegen dem Funktionsaufruf.
Aber, jeder wie er will.

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Xeres

Moderator

BeitragDi, Sep 21, 2010 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nicht wirklich, wo du das Problem siehst - also Performance-technisch.
In einem Spiel hat man hunderte Bedingungen und Funktionen; wenn das Spiel nicht rund läuft, wird's ganz als letztes an der Bedingung in der Hauptschleife liegen.
Man kapselt auch wenige Zeilen in Funktionen für einen geordneten Code, da kommt die Übersicht auch vor Performance. Ich kann mir kein Fall vorstellen, wo ein beachtenswerter Nachteil entstünde.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Thunder

BeitragDi, Sep 21, 2010 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub wir sind wirklich an einem Punkt, wo es darauf ankommt, was man lieber sieht.
Mir ist es lieber, wenn die Spiel-Funktion solange läuft, wie das Spiel läuft und dann zurückgesprungen wird in die Menüfunktion. Damit spar ich mir quasi eine Variable -> Grund 1.
Grund 2: ist der Funktionsaufruf, der am Anfang (mindestens) eine Speicheroperation und eine Registeroperation durchführt und am Ende eine Speicheroperation und eine Registeroperation. Außerdem ist die Abfrage da, die _immer_ getestet wird (was bei meiner Version vollkommen unnötig ist). Das braucht auch Zeit.
Ich weiß, dass es sich (besonders bei schnelleren PCs) nicht mehr lohnt auf soetwas zu achten, aber ich tue das (ist ja schließlich meine "Pflicht", wenn ich die ganze Zeit davon predige, dass Software-Firmen ihre Pakete immer weniger auf Performance trimmen)

Deshalb mach ich das so - aber immernoch: es wird auf den eigenen Geschmack ankommen.

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

PacMani

BeitragMi, Sep 22, 2010 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Wäre mir neu, dass Select / Case langsamer ist. Kann bei Blitz aber schon anders sein... aber der Codeordnung zuliebe gehören diese zahlreichen (und damit meine ich 5+) If-Abfragen einer gleichen Variable verboten.

Thunder

BeitragDo, Sep 23, 2010 8:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Wer hat gesagt, dass Select-Case langsamer ist, als If-Abfragen?
(ich kann es mir zwar vorstellen, aber soweit ich weiß, hat das hier niemand behauptet)
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group