Eine OOP Raumschiffs Bewegungsroutine

Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Neue Antwort erstellen

 

morszeck

Betreff: Eine OOP Raumschiffs Bewegungsroutine

BeitragMo, Jan 10, 2005 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group