Aufbau und Strukturierung eines spiels

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

Suco-X

Betreff: Aufbau und Strukturierung eines spiels

BeitragMi, Okt 27, 2004 9:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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.


user posted image



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

BeitragDo, Okt 28, 2004 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
na es ist ja auch für anfänger gedacht...

drum *Spitze* Very Happy
 

biegl

BeitragMi, Nov 03, 2004 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
gut erklärt,guter code,gute gestaltet..


darum von mir : Note 1++ super gemacht.. einfach spitze..



mfg biegl (TheTrigger)
 

zocker2150

BeitragSo, Nov 07, 2004 2:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 07, 2004 11:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst dir ja ne funktion schreiben, die alle Variablen zurücksetzt.
 

zocker2150

BeitragDi, Nov 30, 2004 2:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja stimmt - man kann einfach
Code: [AUSKLAPPEN]
Delete Each XXXTYPE

schreiben
 

azureuz

BeitragDi, Nov 30, 2004 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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-X

Betreff: ......

BeitragDi, Nov 30, 2004 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
@azureuz : Ich versteh nicht ganz!?
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

azureuz

BeitragDi, Nov 30, 2004 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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-X

Betreff: ........

BeitragMi, Dez 01, 2004 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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^

BeitragDo, Feb 17, 2005 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Feb 17, 2005 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Du müsstest dein Problem schon etwas besser beschreiben.
Außerdem ist das hier das falsche Forum um über Probleme zu reden. Wink
Zitat:

Also den fehlerhaften Code lieber in die dafür vorgesehene Forum Sektion eintragen(Beginner oder 2D)

gruß robotx

nX^

BeitragDo, Feb 17, 2005 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
oh fehler gefunden war nen dummer fehler
ne Variable hatte nen ; vorgehabt

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group