Aufbau und Strukturierung eines spiels
Übersicht

![]() |
Suco-XBetreff: Aufbau und Strukturierung eines spiels |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Blitzer.
Ich melde mich mal mit einem neuen Tutorial zum Thema "Aufbau und Strukturierung eines spiels". Besonders in den Anfangszeiten stand sicher jeder vor der Frage, wie bringe ich Menü,Pause,Spiel etc. unter einen Hut. Und das ohne GoTo und dazu noch übersichtlich. Wie immer ist zu empfehlen die Tutorials von mir sorgsam zu lesen. Hin und wieder verstecken sich wichtige Hinweise/Ratschläge/Tipps. Viel Spaß. Das Prinzip unseres Spielaufbaus Das ganze ist einfacher als es auf den ersten Blick aussieht. Als erstes eine von mir erstellte Grafik. ![]() Hier wird gezeigt das jedes Spiel einen kleinen Kreislauf hat. Ausgehend von der Hauptschleife. Die Hauptschleife ist der Baum wo alle Äste hängen werden. Wie z.b die Spielpause, das Menü, oder das eigentliche Spiel. Die Äste können sich natürlich auch mit Hilfe der Hauptschleife untereinander unterhalten. Die Hauptschleife ist also eine Schleife die nur dazu da ist die Äste zu verwalten. Die Äste besitzen aber auch jeweils eine Schleife.Die Schleifen der Äste werden aber zur Grafikdarstellung etc genutzt. Halt für alle nötigen Spielelemente. Jetzt aber genug der Theorie. Jetzt wird das Puzzle zusammengesetzt. Ich setze immmer ein paar Zeilen Code und darunter erkläre ich alles. Am ende des Tutorials gibt es nochmal den ganzen Code für die Copy&Paster unter euch. Der Spielaufbau Code: [AUSKLAPPEN] Graphics 1024,768,16,2 SetBuffer BackBuffer() SetFont(LoadFont("Comic Sans MS",30,1)) Const game_pause = 1 Const game_menue = 2 Const game_haupt = 3 Const game_over = 4 Global game_zustand = game_menue Unser vorbereitung. Wir setzen die Auflösung und laden einen 0815 xyz Font. game_pause,game_menue sind unsere Spielzustände. Ist übersichtlicher als nur die zahlen abzufragen. In der Globalen Variable game_zustand speichern wir immer den aktuellen Zustand. Das ist eine der wichtigsten Variablen im Spiel. Und jedes Spiel fängt bekanntlich beim Menü an. Deshalb setzen wir den Game Zustand auf Menü. Code: [AUSKLAPPEN] ;Wichtig. Hauptschleife. Hier wird das ganze Spiel verwaltet. Repeat Select game_zustand Case game_menue GameMenue() Case game_haupt GameHaupt() Case game_pause GamePause() End Select Until game_zustand = game_over End Die Hauptschleife. Sie verwaltet wie besprochen alle Spielzustände. Für die einzelnen Spielteile habe ich Funktionen benutzt. Mit einer Select..case Abfrage fragen wir unseren Spielzustand ab und rufen demnach die passenden Funktionen auf. Das meiste erklärt sich hier aber selbst.Kommen wir zu den Funktionen. Code: [AUSKLAPPEN] Function GameMenue() Local temp_zustand = game_zustand FlushMouse() FlushKeys() Repeat ClsColor 0,0,0 Cls Color 0,0,255 Text GraphicsWidth()/2,100,"ICH BIN DAS MENUE!!!",1,1 Color 255,255,255 Text GraphicsWidth()/2,400,"START" Color 255,255,255 Text GraphicsWidth()/2,500,"ENDE" If MouseHit(1) If RectsOverlap(MouseX(),MouseY(),1,1,GraphicsWidth()/2,400,StringWidth("START"),StringHeight("START")) game_zustand = game_haupt ElseIf RectsOverlap(MouseX(),MouseY(),1,1,GraphicsWidth()/2,500,StringWidth("ENDE"),StringHeight("ENDE")) game_zustand = game_over EndIf EndIf If KeyHit(1) End EndIf Flip Until game_zustand<>temp_zustand End Function Unser Spielmenü. Wie oben erwähnt hat jeder Ast seine Schleife. In temp_zustand wird der Aktuelle Zustand zwischengespeichert. Die SChleife wird beendet wenn ein neuer zustand eingetretten ist. Zuerst werden die Maus und Tastaturdaten gelöscht. Damit Tastendaten von anderen Ästen nicht übernommen werden. Dann eine normale Schleife mit einem kleinen Menü. Die Erklärrung zu diesme Code spar ich mir aber, der interessiert in diesem Fall nicht. Wenn die linke Maustaste gedrückt wird und der Benutzer sich über dem Start/Ende Menüpunkt befindet, wird der Spielzustand gewechselt. Damit auch die Schleife von diesem Ast. Wenn game_zustand geändert wird, landen wir wieder in der Hauptschleife und der Spielzustand endscheidet was als nächstes dran kommt. In diesem Fall entweder das Hauptspiel oder das Ende des Spiels. Code: [AUSKLAPPEN] Function GameHaupt() Local temp_zustand = game_zustand Local x = GraphicsWidth()/2 Local y = GraphicsHeight()/2 Local h = 0 FlushKeys() FlushMouse() Repeat ClsColor 200,200,200 Cls h = (h+1) Mod 360 Color 0,0,255 Text x+Sin(h)*50,y-Cos(h)*100,"ICH BIN DAS SPIEL!! Escape Taste für Menue/Space für Pause",1,1 If KeyHit(57) game_zustand = game_pause EndIf If KeyHit(1) game_zustand = game_menue EndIf Flip Until game_zustand<>temp_zustand End Function Ein bischen Grafik und Bewegung. Hier findet das Spiel statt. Wird Space gedrückt, wird die Spielpause eingeleitet. Bei Escape kommt man wieder zurück zum Menü. In beiden fällen wir jedenfalls der Ast wieder verlassen und in der Hauptschleife wird dem Zustand nach wieder neu endschieden was passiert. Code: [AUSKLAPPEN] Function GamePause() Local temp_zustand = game_zustand FlushKeys() FlushMouse() Repeat ClsColor 255,0,0 Cls Color 0,0,255 Text GraphicsWidth()/2,GraphicsHeight()/2,"ICH BIN DIE PAUSE!!!",1,1 If KeyHit(57) game_zustand = game_haupt EndIf Flip Until game_zustand<>temp_zustand End Function Die Funktion für die Spielpause. Eine Schleife wird gestartet und es kommt solange der Text bis der Benutzer wieder Space drückt. Hier kann man Spielerreien für die Pause einbauen. Oder nur einen einfachen Text. Das wars auch schon. Das alles ist ausbaufähig. Die Ordnung stimmt auch. Das Spiel kann nun beginnen. Ich hoffe ich habe hier keine wichtigen Dinge vergessen. Hier nochmal der ganze Code. Code: [AUSKLAPPEN] Graphics 1024,768,16,2 SetBuffer BackBuffer() SetFont(LoadFont("Comic Sans MS",30,1)) Const game_pause = 1 Const game_menue = 2 Const game_haupt = 3 Const game_over = 4 Global game_zustand = game_menue ;Wichtig. Hauptschleife. Hier wird das ganze Spiel verwaltet. Repeat Select game_zustand Case game_menue GameMenue() Case game_haupt GameHaupt() Case game_pause GamePause() End Select Until game_zustand = game_over End Function GameMenue() Local temp_zustand = game_zustand FlushMouse() FlushKeys() Repeat ClsColor 0,0,0 Cls Color 0,0,255 Text GraphicsWidth()/2,100,"ICH BIN DAS MENUE!!!",1,1 Color 255,255,255 Text GraphicsWidth()/2,400,"START" Color 255,255,255 Text GraphicsWidth()/2,500,"ENDE" If MouseHit(1) If RectsOverlap(MouseX(),MouseY(),1,1,GraphicsWidth()/2,400,StringWidth("START"),StringHeight("START")) game_zustand = game_haupt ElseIf RectsOverlap(MouseX(),MouseY(),1,1,GraphicsWidth()/2,500,StringWidth("ENDE"),StringHeight("ENDE")) game_zustand = game_over EndIf EndIf If KeyHit(1) End EndIf Flip Until game_zustand<>temp_zustand End Function Function GameHaupt() Local temp_zustand = game_zustand Local x = GraphicsWidth()/2 Local y = GraphicsHeight()/2 Local h = 0 FlushKeys() FlushMouse() Repeat ClsColor 200,200,200 Cls h = (h+1) Mod 360 Color 0,0,255 Text x+Sin(h)*50,y-Cos(h)*100,"ICH BIN DAS SPIEL!! Escape Taste für Menue/Space für Pause",1,1 If KeyHit(57) game_zustand = game_pause EndIf If KeyHit(1) game_zustand = game_menue EndIf Flip Until game_zustand<>temp_zustand End Function Function GamePause() Local temp_zustand = game_zustand FlushKeys() FlushMouse() Repeat ClsColor 255,0,0 Cls Color 0,0,255 Text GraphicsWidth()/2,GraphicsHeight()/2,"ICH BIN DIE PAUSE!!!",1,1 If KeyHit(57) game_zustand = game_haupt EndIf Flip Until game_zustand<>temp_zustand End Function Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
na es ist ja auch für anfänger gedacht...
drum *Spitze* ![]() |
||
biegl |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
gut erklärt,guter code,gute gestaltet..
darum von mir : Note 1++ super gemacht.. einfach spitze.. mfg biegl (TheTrigger) |
||
zocker2150 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi,
erstmal ein lob an dich für den Tut. Das "Funktionen" Prinzip hab ich auch nur kommt damit auch ein weiteres Problem. Denn wenn der Spieler tot ist sollten ja die ganzen Variablen in der "Main_Function" gelöscht werden. Nur wie? Muss ich alle Typs durchgehen und auf 0 setzten oder gehts eleganter? thx zocker2150 |
||
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kannst dir ja ne funktion schreiben, die alle Variablen zurücksetzt. | ||
zocker2150 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja stimmt - man kann einfach
Code: [AUSKLAPPEN] Delete Each XXXTYPE
schreiben |
||
azureuz |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich steig da noch nciht durch. wie soll der anfangs code sein wenn ich statt text nen image habe? immer wenn ich dann auf das image klicke passiert nichts? | ||
![]() |
Suco-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
@azureuz : Ich versteh nicht ganz!? | ||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
azureuz |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich möchte gerne statt dem text nen button von mir haben. wie soll ich das erklären...bei dir im beispiel hast du die 'buttons' ja als text gemacht. ich hätte gerne grafiken as buttons. das hab ich ja auch hinbekommen, aber immer wenn ich auf den button klicke passiert nichts, außer ich klick GENAU in die mitte, ka warum.
wenn du willst kann ich ja mal nen kleinen ausschnitt von mir hier einfügen. |
||
![]() |
Suco-XBetreff: ........ |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ahso, du meinst das Menü. Sag es doch direkt. Kann ich ja schlecht raten.
Da hast du wohl einen Fehler in der Kollision. Für die fehlerhafte Erweiterung ist dieser Thread aber nicht da. Also den fehlerhaften Code lieber in die dafür vorgesehene Forum Sektion eintragen(Beginner oder 2D). Dort helfe ich dir auch gerne. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
nX^ |
![]() Antworten mit Zitat ![]() |
---|---|---|
also ich bin zwar kein anfänger mehr aba auch kein pro
was ich nicht verstehe wenn ich etwas hier rein packe passiert nichts Code: [AUSKLAPPEN] Global game_zustand = game_menue
;Wichtig. Hauptschleife. Hier wird das ganze Spiel verwaltet. Repeat |
||
![]() |
robotx |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du müsstest dein Problem schon etwas besser beschreiben.
Außerdem ist das hier das falsche Forum um über Probleme zu reden. ![]() Zitat: Also den fehlerhaften Code lieber in die dafür vorgesehene Forum Sektion eintragen(Beginner oder 2D) gruß robotx |
||
![]() |
nX^ |
![]() Antworten mit Zitat ![]() |
---|---|---|
oh fehler gefunden war nen dummer fehler
ne Variable hatte nen ; vorgehabt |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group