Spaceshooter 2D Tutorial

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

Firstdeathmaker

Betreff: Spaceshooter 2D Tutorial

BeitragDi, Mai 24, 2005 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist mein zweites Tutorial, wenn ihr Verbesserungsvorschläge habt, immer her damit. Allerdings sollten sie dahingehend sein, etwas zu vereinfachen, deshalb werde ich keine Sachen beachten wie "Baue noch Explosionen ein". Dies soll einfach der Grundstock sein, in dem blutige Anfänger mal sehen können wie man z.B. Schüsse erstellen und nachher wieder verschwinden lassen kann e.t.c.

Aus dem Grund, dass ich möchte dass Anfänger was hier draus lernen, und nicht einfach den Code übernehmen, stelle ich folgende Verwendungslizenz auf:
Es ist erlaubt den Code zu Lernzwecken runterzuladen oder Freunden zu diesem Zwecke weiterzugeben.
Es ist nicht erlaubt den Code oder Teile dieses Codes für eigene Projekte zu übernehmen. Wenn jmd dies tut, wird ihn hoffentlich der 300 Voltschlag des Noob-Gottes treffen Wink


Also, die Ressourcen und den Code kann man auch unter diesem Link herunterladen: http://mitglied.lycos.de/first...terTut.zip (Rechtsklick-> Ziel speichern unter

BlitzBasic: [AUSKLAPPEN]
;Spaceshootertutorial 2D by Firstdeathmaker 2005
;www.illusion-games.de.vu
;
;Vorraussetzungen: Verständnis über Types und einfache Grafikbefehle.
;
;In diesem Tutorial möchte ich erklären, wie man einen einfachen Spaceshooter programmiert. Da immer wieder
;so Fragen kommen wie \"Wie erstelle ich Schüsse?\", \"Wie mache ich das sich das Raumschiff bewegt?\" oder \"Warum verschwinden die
;Schüsse nicht?\" möchte ich hiermit ein paar Sachen erklären, sodass sie hoffentlich nicht mehr so oft gefragt werden, und wenn, das
;man dann auch dieses Tutorial verweisen kann. Also, have fun!

;Vorher sollte man sich immer Gedanken darüber machen, was man
;überhaupt haben möchte. In diesem Fall habe ich mir folgende Checkliste ausgedacht:
;Spielgenre: Spaceshooter
;Prinzip: Der Spieler hat ein Raumschiff und muss damit die von oben kommenden Aliens abschießen.
;Das Raumschiff soll per Pfeiltasten steuerbar sein, die Leertaste wird für´s Feuern genommen.
;Pro abgeschossenem Alien bekommt man eine bestimmte vom Level abhängige Punktzahl. Wenn man genug zusammen hat, steigt man
;einen Level auf und bekommt mehr Rüstung, 10% mehr Lebensenergie und das Schussintervall sinkt. Es werden jedoch mehr Gegner erstellt.


;Also, zuerst einmal sollte man ein paar Sachen festlegen:

Const GFX_X=800;Grafikauflösung in X-Richtung
Const GFX_Y=600;Grafikauflösung in Y-Richtung
Global Playerimage,Gegnerimage,Schussimage,BG1,BG2;Diese Variablen brauche ich gleich für die Grafiken
init_gfx();Scrolle mal bis zu der Zeile \"Function init_gfx()\" runter. Dort liest du weiter.

Type Gegner;Dieses Typenfeld braucht man später für die Gegner. Es enthält alle Variablen die man nachher für die Gegner braucht.
Field x#;Hier wird später die aktuelle Position des Gegners auf der X-Achse gespeichert.
Field y#;Hier wird später die aktuelle Position des Gegners auf der Y-Achse gespeichert.
Field energie#;Hier wird die Lebensenergie des Gegners gespeichert.
Field lastshoot;Und hier drin wird dann der Zeitpunkt gespeichert, wann der Gegner das letzte Mal geschossen hat.
Field dead;Wenn der Gegner gelöscht werden soll, wird diese Variable auf \"1\" gesetzt.
End Type

Type Schuss;Dieses Typenfeld braucht man später für die Laserschüsse die durch´s All flitzen.
Field x#;Die X-Achsenposition des Laserschusses.
Field y#;Die Y-Achsenposition des Laserschusses.
Field speed#;Um wieviele Pixel sich der Schuss pro Rechendurchlauf verschiebt.
Field schaden#;Wieviel Schaden der Schuss beim auftreffen machen wird.
Field friendly;Ob der Schuss vom Player kommt oder ob er vom Gegner abgefeuert wurde.
Field dead;Wenn der Schuss gelöscht werden soll, diese Variable auf 1 setzen.
End Type

;Jetzt brauchen wir nur noch ein paar Variablen für den Spieler selber:

Local Player_x#=GFX_X/2;Hier wird die jeweils aktuelle X-Achsenposition des Spielers abgespeichert. Diese wird erstmal genau auf die Mitte gesetzt.
Local Player_y#=GFX_Y-30;Hier wird die jeweils aktuelle Y-Achsenposition des Spielers abgespeichert. Erstmal auf 30 Pixel über der unteren Kante.
Local Player_XP=0;Hier werden die aktuellen Erfahrungspunkte des Spielers abgespeichert.
Local Player_XP_NEED=0;Hier drin wird abgespeichert, wieviele Erfahrungspunkte der Spieler für den nächstes Level braucht.
Local Player_Level=0;Der aktuelle Level des Spielers.
Local Player_energie#=0.9;Lebensenergie des Spielers. Er bekommt beim ersten Levelup noch 0.1 dazu, deshalb hier erstmal auf 0.9 gesetzt.
Local Player_Panzerung=0.0;Panzerungsgrad des Spielers (Durch diesen Wert wird der Schaden des gegnerischen Schusses dividiert)
Local Player_Lastschuss=0;Hier wird der Zeitpunkt vom letzten Spielerschusses vermerkt.

Global gameend=0;Wenn diese Variable später auf \"1\", also auf \"True\" gesetzt wird, wird das Programm die Hauptschleife verlassen und sich selbst beenden.
;____________________ Mainloop/Hauptschleife ___________________________



Repeat;Anfang der Hauptschleife.
Cls;Die Arbeitsfläche sauber machen, d.h. den Backbuffer löschen, damit keine Bildreste drauf bleiben.
;Dann den Hintergrund bewegen und einzeichnen. Dafür haben wir eine durchlaufende Variabel namens BG_X#

BG_Y#=BG_Y+0.2;Die Hintergrundvariable erhöhen...
TileImage BG1,0,BG_Y;Und den ersten Hintergrund einzeichnen. Der Befehl Tileimage zeichnet das Bild so oft neben- und untereinander bis der Bildschirm ausgefüllt ist.
TileImage BG2,0,BG_Y*2.6;Der vordere Hintergrund soll sich schneller fortbewegen als der andere, deshalb wird die Bewegung mit 2,6 multipliziert.
;Die unterschiedlichen Geschwindigkeiten der beiden Hintergründe suggerieren dem Spieler einen 3D-Raum.

;Steuerung des Spielers.
If KeyDown(203);So lange die Pfeiltaste \"Links\" gedrückt wird... (Die Tastencodes findet man in der Onlinehilfe unter \"Scancodes\")
Player_x=Player_x-10.0; Verringere die Variable für den Spieler-Speed um 0.1. Das bewirkt, dass entweder die Geschwindigkeit
;nach Rechts abnimmt, oder, wenn die Variable ins negative geht, das Spielerschiff nach links fliegt.
EndIf

If KeyDown(205);So lange die Pfeiltaste \"Rechts\" gedrückt wird...
Player_x=Player_x+10.0; Vergrößere die Variable für den Spieler-Speed um 0.1. Das bewirkt, dass entweder die Geschwindigkeit
;nach Links abnimmt, oder, wenn die Variable ins positive geht, das Spielerschiff nach rechts fliegt.
EndIf

If KeyDown(57) And Player_Lastschuss<MilliSecs()-(1000/(Player_level+1));Wenn die Leertaste unten ist und wenn eine bestimmte Zeit (Pro Level wird sie geringer) nach dem letzen Schuss vergangen ist...
create_schuss(Player_x,Player_y,-5,1,1);Die -5 bewirkt, dass der Schuss sicht pro Programmdurchlauf um 5 Pixel nach oben bewegen soll.
Player_Lastschuss=MilliSecs()
EndIf

If KeyHit(1) gameend=1; Wenn \"Esc\" gedrückt wird, soll das Spiel beendet werden.

;Kontrollieren ob der Spieler noch im Spielfeld ist, wenn nicht, zurück auf´s Spielfeld setzen.
If Player_x<0 Player_x=0
If Player_x>GFX_X Player_x=GFX_X

;Das Spielerraumschiff auf Kollision mit feindlichen Schüssen prüfen und alle Schüsse bewegen und einzeichnen.
For s.schuss=Each schuss;Jeden Schuss durchgehen...
s\y=s\y+s\speed;Den Schuss um s\speed auf der Y-Achse bewegen...

DrawImage Schussimage,s\x,s\y

If s\y<0 Or s\y>GFX_Y s\dead=1;Wenn der Schuss den Bildschirmbereich verlässt, den Schuss auf \"tot\" setzen, d.h. er wird gleich am Ende dieser For-Schleife aus dem Type-Feld entfernt.

If Not s\friendly;Wenn der Schuss nicht freundlich ist, also von einem Gegner stammt...
If ImagesCollide(playerimage,player_x,player_y,0,Schussimage,s\x,s\y,0);Kollidiert das Spielerschiff mit dem aktuellen Schuss?
Player_energie=Player_energie-(s\schaden/Player_Panzerung);Schadensberechnung und speichern der verbleibenden Spieler-Energie.
s\dead=1;Den Schuss auf \"tot\" setzen, d.h. er wird gleich am Ende dieser For-Schleife aus dem Type-Feld entfernt.
EndIf
EndIf

If s\dead=1 Delete s.schuss ;Den Schuss verschwinden lassen, also aus der Liste löschen. Achtung, ab nun kann nicht mehr darauf ;Zugegriffen werden, weil er nicht mehr existiert.
Next


;Einzeichnen des Spielers
DrawImage playerimage,player_x,player_y;Und hiermit zeichnet man dann das Spielerraumschiff an die Koordinaten Spieler_x und Spieler_y


;Gegner bewegen, auf kollision mit Schüssen prüfen und einzeichnen.
Local Gegnercounter=0;Dieser dient dazu, die vorhandenen Gegner zu zählen.
For g.gegner=Each gegner
Gegnercounter=Gegnercounter+1
g\y=g\y+2

DrawImage Gegnerimage,g\x,g\y;Den Gegner an seiner aktuellen Position einzeichnen.

For s.schuss=Each schuss;Alle vorhandenen Schüsse durchgehen.
If s\friendly;Wenn der Schuss vom Spieler kommt...
If ImagesCollide(Schussimage,s\x,s\y,0,Gegnerimage,g\x,g\y,0);Und wenn der Schuss das gegnerische Raumschiff berührt...
g\energie=g\energie-s\schaden
s\dead=1;;Den Schuss auf \"tot\" setzen, d.h. er wird gleich am Ende dieser For-Schleife aus dem Type-Feld entfernt.
If g\energie<=0;Wenn der Gegner keine Energie mehr hat...
Player_XP=Player_XP+(Player_Level);Dem Spieler einen Punkt/Level dafür geben.
g\dead=1;...den Gegner auf \"tot\" setzen damit er am Ende gelöscht wird.
EndIf
EndIf
EndIf
Next

;\"KI\" (In Anführungsstrichen weil es keine richtige KI ist, sondern nur ein Zufallsgenerator für Schüsse)
If g\lastshoot<MilliSecs()
create_schuss(g\x,g\y,5,1,0)
g\lastshoot=MilliSecs()+Rand(500,2000)
EndIf



If g\y>GFX_Y g\dead=1;Wenn der Gegner den Bildschirm verlässt, den Gegner auf \"tot\" setzen.

If g\dead Delete g.gegner;Wenn der Gegner tot ist, den Gegner löschen.
Next

If Gegnercounter<Player_Level;Wenn weniger Gegner am Leben sind als der Spieler Level hat.
create_gegner();Erstelle einen Gegner (Lese dazu bei der Funktion \"create_gegner()\" weiter
EndIf


;Berechnung bezüglich XP und Spielerlevel
If Player_XP>=Player_XP_NEED; Wenn der Spieler genug Erfahrung für die nächste Stufe hat...
Player_XP=0;Aktuelle Erfahrung zurücksetzten.
Player_Level=Player_Level+1;\"Levelup\"
Player_XP_NEED=(Player_Level+1)*(Player_Level/0.2);Nächste Menge an Erfahrungspunkten berechnen
Player_Energie=Player_Energie+0.1;Dem Spieler etwas mehr Energie geben.
Player_Panzerung=Player_Panzerung+5;Belohnung für den Spieler: Panzerung wird verbessert.
EndIf

;Anzeigen der Spielerdaten, Quasi das \"HUD\"
Text 10,10,\"Level: \"+Player_Level
Text 10,25,\"Punkte: \"+Player_XP+\"/\"+Player_XP_NEED
Text 10,40,\"Lebensenergie:\"+Int(Player_energie*100)+\" %\"







Flip; Den Front- mit dem Backbuffer vertauschen. Siehe auch bei der Funktion \"init_graph()\" nach.
Until gameend=1;Bis die Variable gameend=1 ist soll die Hauptschleife wiederholt werden.
End;Beendet das Spiel




;_________________________________ Funktionen ___________________________________________
Function init_gfx()
Graphics GFX_X,GFX_Y,16,2;Bildschirmauflösung setzen. Die 16 steht für 16-bit Farbtiefe, die 2 für \"Im Fenster ausführen\".
SetBuffer BackBuffer();Den Bildschirmbuffer auf den hinteren setzen, damit wir in ruhe alles einzeichnen können wärent auf dem
;Frontbuffer das letzte Frame angezeigt wird. Wenn wir ein neueres Bild eingezeichnet haben schieben wir es mit dem Befehl \"Flip\"
;nach Vorne und löschen den Hinteren wieder. Man kann sich das wie 2 Blätter Papier vorstellen: Eines dass man Vorne den Zuschauern
;zeigt, wärent man auf dem zweiten gerade ein neues Bild malt. Wenn dieses fertig ist, vertauscht man die beiden Blätter, sodass die
;Zuschauer immer nur fertige Blätter sehen.

;Laden aller Grafiken
Playerimage=LoadImage(\"Images\Player.png\");Laden des Spielerraumschiffbildes.
MidHandle Playerimage; Midhandle bewirkt, dass das Bild später mittig eingezeichnet wird.
MaskImage Playerimage,255,0,255;Die Bildfarbe 255,0,255 (Pink) als Transparente Farbe markieren. Alles was Pink ist wird nachher nicht eingezeichnet.

Gegnerimage=LoadImage(\"Images\Gegner.png\");Laden des Gegnerraumschiffbildes.
MidHandle Gegnerimage; Midhandle bewirkt, dass das Bild später mittig eingezeichnet wird.
MaskImage Gegnerimage,255,0,255;Auch das gleiche wie beim Spieler.

Schussimage=LoadImage(\"Images\Schuss.png\");Laden des Schussbildes.
MidHandle Schussimage; Midhandle bewirkt, dass das Bild später mittig eingezeichnet wird.
MaskImage Schussimage,255,0,255; Das gleiche wie schon weiter oben erklärt.

BG1=LoadImage(\"Images\Background1.png\");Den Hinteren Hintergrund laden.
BG2=LoadImage(\"Images\Background2.png\");Den davor liegenden Hintergrund laden.

;Scrolle wieder dahin hoch, von wo du hierher verwiesen wurdest und lies dort weiter.
End Function


Function create_schuss(x#,y#,speed#,schaden#,friendly)
s.schuss=New schuss;Einen neuen Schuss in die Schuss-Liste einfügen.
s\x=x
s\y=y
s\speed=speed
s\schaden=schaden
s\friendly=friendly
End Function

Function create_gegner()
g.gegner=New gegner;Einen neuen Gegner in die Gegnerliste einfügen.
g\x=Rand(0,GFX_X)
g\y=-10
g\energie=1.0
End Function
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Artemis

BeitragDi, Mai 24, 2005 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, das ganze ist wohl kein Tut oder?? Nur ein gut kommentierter Quellcode!
In einem Tut geht man auf die einzelnen Dinge ein und erklärt sie im Zusammenhang mit den anderen!

Naja ansonsten ganz net!!

(Ich würds ins CodeArchiv tuen, falls isch jemand für meine Meinung interessiert!)

Kryan

BeitragDi, Mai 24, 2005 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
nee...machen viele so...is doch in ordnung so...so kann man sich das wenigstens bildhaft vorstellen...wo das sein soll Wink
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

Diablo

BeitragMo, Jun 20, 2005 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Vllt. währe es noch sinnvoll die Images hier rein zu posten!
www.pb-software.de.vu

Meine Entwicklungsseite
 

Lukas

BeitragMo, Jun 27, 2005 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast dir wirklich viel Mühe gemacht.
Allerdings glaub ich viele haben einfach nur den Code in Blitz Basic kopiert, und geguckt was passiert. Das ist aber nicht der Sinn von Tutorials.

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group