Startmenü
Übersicht

SerdonBetreff: Startmenü |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Max,
Ich habe mir das Buch auch gekauft aber allerdings die Vollversion zum Geburtstag bekommen ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
such doch mal im forum, ich hab etwa 7 seiten gefunden... da ist sicher was für dich ![]() |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ist verbesserungsfähig Sirmo.
1) LoadAnimImage ![]() 2) Mousehit ![]() 3) ImagesOverlap ![]() 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
(@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für eure Antworten.
Ich werde das sobald wie möglich ausprobieren. |
||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Übrigens ist Select![]() ![]() ![]() |
||
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
ähm, vielleicht habe ich das komplett falsch verstanden, aber so wie ich das verstanden habe ist das einfach nicht sinnvoll:
BlitzBasic: [AUSKLAPPEN] Repeat 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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group