Eine OOP Raumschiffs Bewegungsroutine
Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials
morszeckBetreff: Eine OOP Raumschiffs Bewegungsroutine |
Mo, Jan 10, 2005 19:57 Antworten mit Zitat |
|
---|---|---|
Ich habe mal das Tutorial von englisch auf deutsch so gut wie möglich übersetzt. Teil 2 kommt demnächst hinzu.
Orginal: http://www.blitzbasic.com/Comm...opic=42259 Teil: 1/2 Code: [AUSKLAPPEN] Strict ' Wird angegeben um dem Compiler zu sagen,
' das alle Variabeln deklariert werden müssen. ' Ist eine Variabel nicht deklariert, so entsteht ' ein Compiler-Fehler ' Variabeln: Global GW = 800 ' Fenster-Höhe (height) Global GH = 600 ' Fenster-Breite (width) Global GD = 0 ' Fenster-Farbtiefe, 0 für Fenster-Modus (Depth) Global MID_GH = GH/2 ' Mitte der Bildschirm-Höhe (Y) Global MID_GW = GW/2 ' Mitte der Bildschirm-Breite (X) Global MX, MY ' für Mousex() und Mousey() Graphics(GW, GH, GD) Rem Erstellt ein Schaupieler-Typ (actor type) der verschiedene Attribute besitzt, dieser aber von verschiedenen anderen Arten von Spieler-Charakteren gebraucht werden kann, wie zbsp: Spieler, Feind, Zauberer etc... Der Type "actor" ist von beginn an Objektorientiert programmiert (OOP). "actor" ist eine Klasse oder ein Type. Dies ist eine einfache Definition was ein "actor" ist. Die Felder (field) können verschiedene Attribute oder Werte aufnehmen. Für dieses Beispiel hat der Typ "actor" die Felder x#, y#, der die Bildschirm-Koordinaten beinhalten, die BMax zum Zeichnen braucht. Die Klasse "actor" beinhaltet Methoden. Methoden sind Funktionen die nur die Klasse (oder genauer der Type) beinhaltet. Die Methode "update" ist nur durch die Klasse "actor" ansprechbar! End Rem Type actor ' FELDER Field x# = GW/2 ' Bild x/y Position (Initialisierung der Bildmitte) Field y# = GH/2 Field xint:Int ' x/y Koordinate für Bildausgabe Field yint:Int Field color Field name:String ' Name des "actors" (Schauspielers) Field leben = 100 ' Lebenskraft (voreingestellt: 100) Field entity ' ein Platzhalter für das Bild vom "actor" ' Field speed# ' Flucht-Geschwindigkeit des "actor" Field reibung# = 0.99 ' verlangsamen der Flucht-Geschwindigkeit nach jedem Bild Neuaufbau Field winkel# ' winkel# = 0 to 360 Grad (Winkel) Field winkel_speed# ' Rotations-Geschwindikeit, wie schnell sich der "actor" dreht Field winkel_reibung# = 0.97 ' verlangsamt die Rotations-Geschwindigkeit nach jedem Bild Neuaufbau ' METHODEN Method applyImpulse#(angular#, thrust#=0.0) Rem Addiert zur Rotations- und/oder der Flucht-Geschwindigkeit die von der Tastatur übernommen wird. Siehe weiter untenb add the rotational and/or thrust to the velocities these are taken from key inputs. see below EndRem winkel_speed# = winkel_speed# + angular# speed# = speed# + thrust# End Method Method update() Rem Diese Methode berechnet die Geschwindigkeit (speed) des Schiffs sowie auch den Winkel. Es wird Sinus und Cosinus verwendet um die momentane Richtung zu ermitteln und somit die neue Reiserichtung zu berechnen. Der Winkel ist immer zwischen 0 und 360 Grad. Die beiden Geschwindigkeiten (Flucht und Rotation) werden mit der Reibung multipliziert, um das Schiff nach jeden Bild Neuaufbau zu verlangsamen. EndRem winkel_speed# = winkel_speed# * winkel_reibung# speed# = speed# * reibung ' bewegt das Schiff vorwärts x=x+(speed*Cos(winkel-90)) y=y+(speed*Sin(winkel-90)) ' Dreht das Schiff winkel#:+winkel_speed If winkel#<0.0 Then winkel#=360.0 If winkel#>360.0 Then winkel#= 0.00 ' Das Schiff geht ausserhalb des Bildschirms und ' kommt auf der anderen Seite wieder rein If x>GW Then x = 0 If x<0 Then x = GW If y<0 Then y = GH If y>GH Then y=0 End Method Method show() Rem Diese Methode wird gebraucht um das momentane Bild des Schiffs auf dem Bildschirm zeichnen, sowie Lage (x/y), die Flucht- und die Rotations-Geschwindkeit anzuzeigen. EndRem xint = x yint = y SetRotation(winkel) ' Drehungs des Schiffs zum Winkel SetColor 255,0,0 DrawImage(entity,x,y) SetTransform(0,1.1,1.1) SetColor 0,0,255 DrawRect x-44,y+30,96,15 SetScale 1,1 SetColor 255,255,0 DrawText "x="+xint+" y="+yint,x-40,y+32 DrawText "speed = "+speed,x-40,y+48 End Method End Type Rem Jetzt erstellen wir einen erweiterten (extends) Typen, der "Player" genannt wird. Dieser Type "Player" übernimmt alle Attribute und Methoden der Klasse (Type) "actor", und erstellt ein neues Feld von sich selber und fügt sich selber dem Warenbestand (inventory) hinzu. [] fügt sich ans Ende des Arrays an. Der Inventory (Warenbestand) ist ein Array von Strings (Zeichenketten). End Rem Type player Extends actor Field inventory:String[] End Type ' den Feind brauchen wir erst später Type feind Extends actor Field boese End Type ' jetzt erstellen wir eine Instanze des Players und nennen ihn "spaceship" ' dessen Name ist "Bob" Global spaceship:player = New player spaceship.name = "Bob" spaceship.entity = CreateImage(64,64,DYNAMICIMAGE) ' zeichnen des "spaceship" 'AutoMidHandle(1) SetColor 255,255,0 SetLineWidth 3 DrawLine 0,64,32,0 DrawLine 32,0,64,64 DrawOval 24,16,16,16 GrabImage spaceship.entity,0,0 SetImageHandle(spaceship.entity,32,48) 'MidHandleImage(spaceship.entity) SetScale 1,1 ' Main Loop Repeat Cls ' löschen des Bildschirms ' Tasteneingabe zum bewegen des Schiffs If KeyDown(KEY_LEFT) Then spaceship.applyImpulse(-0.1) If KeyDown(KEY_RIGHT) Then spaceship.applyImpulse(0.1) If KeyDown(KEY_UP) Then spaceship.applyImpulse(0,0.04) ' updaten und zeichnen des Schiffs spaceship.update() spaceship.show() Flip ' zeigen des Backbuffers (umschalten von Frontbuffer) Until KeyHit(KEY_ESCAPE) |
||
Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials
Powered by phpBB © 2001 - 2006, phpBB Group