OOP Pong

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

diGGa

GruppenKaspar

Betreff: OOP Pong

BeitragDi, Mai 17, 2005 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
k is nich besonders sinnvol xD aber ich muss mich ja erstmal einarbeiten...

BlitzMax: [AUSKLAPPEN]
Rem
### Author: Jaap __COMMENT1__
### Title [00-P]ong ###
### Idea: ###
### Create a Object orientated (OO) based Pong ###
EndRem


Strict

Graphics 640,480, 0, 60

Type Tentity ' test comment
Field x:Float
Field y:Float
Field speedup:Float
EndType

Type Tplayer Extends Tentity
Field Speed:Float
Field Width:Int
Field Height:Int

Method MoveUp(var_amount:Float)
y = y - var_amount
EndMethod

Method MoveDown(var_amount:Float)
y = y + var_amount
EndMethod
EndType

Type Tball Extends Tentity
Field xMoveSpeed:Float
Field yMoveSpeed:Float
Field xSpeed:Float
Field ySpeed:Float
Field xMaxSpeed:Float
Field yMaxSpeed:Float

Method MoveUp(var_amount:Float)
y = y - var_amount
EndMethod

Method MoveDown(var_amount:Float)
y = y + var_amount
EndMethod´

Method MoveLeft(var_amount:Float)
x = x - var_amount
EndMethod

Method MoveRight(var_amount:Float)
x = x + var_amount
EndMethod

Method Collide()
If x => 630
xSpeed = xSpeed *(-1)
If xMoveSpeed <= xMaxSpeed Then xSpeed = xSpeed * SpeedUp ; xMoveSpeed = xMoveSpeed * SpeedUp
EndIf

If x <= 0
GameOver()
EndIf

If y => 470
ySpeed = ySpeed *(-1)
If yMoveSpeed <= yMaxSpeed Then ySpeed = ySpeed * SpeedUp ; yMoveSpeed = yMoveSpeed * SpeedUp
EndIf

If y <= 0
ySpeed = ySpeed *(-1)
If yMoveSpeed <= yMaxSpeed Then ySpeed = ySpeed * SpeedUp ; yMoveSpeed = yMoveSpeed * SpeedUp
EndIf

If x => player.x And x <= player.x+player.width And y => player.y And y <= player.y+player.height
xSpeed = xSpeed *(-1)
If xMoveSpeed <= xMaxSpeed Then xSpeed = xSpeed * SpeedUp ; xMoveSpeed = xMoveSpeed * SpeedUp
EndIf
EndMethod
EndType

' instances erstellen
Global player:Tplayer = New Tplayer
Global ball:Tball = New Tball

' variablen legen
Global NewGame = 1

Repeat
Cls

If NewGame = 1
LoadGameVars()
Else
MovePlayer()
MoveBall()

DrawPlayer()
DrawBall()
EndIf
Flip
FlushMem()
Until KeyHit(KEY_ESCAPE)
End

Function LoadGameVars()
player.x = 50
player.y = 50
player.Speed = 3
player.width = 30
player.height = 100

ball.x = 200
ball.y = 200
ball.xSpeed = 2 'variablen für Richtung
ball.ySpeed = 1
ball.xMoveSpeed = 2 'variablen für maximum speed (immer positiv)
ball.yMoveSpeed = 1
ball.xMaxSpeed = 6
ball.yMaxSpeed = 5
ball.SpeedUp = 1.5 'für die erhöhung des ballspeeds um 50% bei aufschlag

NewGame = 0
EndFunction

Function MovePlayer()
If KeyDown(KEY_UP) And player.y > 0 Then player.MoveUp(player.Speed)
If KeyDown(KEY_DOWN) And player.y < 380 Then player.MoveDown(player.Speed)
EndFunction

Function DrawPlayer()
DrawRect(player.x,player.y,player.width,player.height)
EndFunction

Function MoveBall()
ball.x = ball.x + ball.xSpeed
ball.y = ball.y + ball.ySpeed
ball.Collide()
EndFunction

Function DrawBall()
DrawOval(ball.x,ball.y,10,10)
EndFunction

Function GameOver()
Repeat
Cls

DrawText \"Game Over, press ESCAPE to exit or RETURN to restart the Game\", 50, 150
If KeyHit(KEY_ENTER) Then NewGame = 1
If KeyHit(KEY_ESCAPE) Then End

Flip
Until NewGame = 1
EndFunction


die idee ist halt ien möglichst oop pong zu bauen... vielleicht hat ja noch jemand ideen wie man das noch oop-iger machen kann xD

~EDITIERT~

Syntax-Sprache auf bmax geändert.
Thorben
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und
glaubte im Licht der Straßenlampe
Den Geist unseres jahrhunderts auf der
Straße zu sehen
Der uns sagte, daß wir alle am Rande
des Abgrunds stehen.
- Al Steward


Athlon 64 3000+ / Radeon 9600 / 1024mb ddram

DivineDominion

BeitragDi, Mai 17, 2005 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe Gamestates mit Gamemanager eingebaut und sowas alles. Schau selbst. hat ne weile gedauert Smile Hoffe es schrieb nicht ebreits jemand außer mir

Paar Sachen sidn noch nich so gut (Ballkollision und so) aber prinzipiell muss das so sein, wenn du volles OOP-Programm willst Wink

Du nutzt irgendwie kein TAB für Zeileneinrückungen sondern sehr viele Leerzeichen... ODer es liegt am Syntaxzeug.
Types übrigens am besten groß schreiben: "Player", "Ball", statt "player", "ball". auch mit T davor Smile

Benenne deine MEthoden nach ihrem Zweck und mach ggf 2 für ähnliche aber dennoch verschiedene ZWecke (CollideWalls, <0, ...)

Viel Spaß beim lesen Smile

Code: [AUSKLAPPEN]
Rem
### Author: Jaap 'diGGa' Groeneveld                                 ###
### Title [00-P]ong                                                        ###
### Idea:                                                                                ###
### Create a Object orientated (OO) based Pong        ###
EndRem

Rem
OOP -> DivineDominion :)
EndRem

Strict

Graphics 640,480, 0, 60

Type TEntity ' test comment
   
   Field x:Float
   Field y:Float
   Field speedup:Float
   
EndType

Type TPlayer Extends TEntity   
           
   Field Speed:Float

   Field Width:Int
   Field Height:Int

   Method moveUp()
      y = y - self.speed
   EndMethod
       
   Method moveDown()
      y = y + self.speed
   EndMethod
   
   Method draw()
      DrawRect self.x, self.y, self.width, self.height
   EndMethod
   
EndType

Type TBall Extends TEntity
   
   Field xMoveSpeed:Float
   Field yMoveSpeed:Float
   Field xSpeed:Float
   Field ySpeed:Float
   Field xMaxSpeed:Float
   Field yMaxSpeed:Float
       
   Method move()
      self.x :+ self.xSpeed
      self.y :+ self.ySpeed
   EndMethod       
       
   Method collideWalls()
      If x => 630
         xSpeed = xSpeed *(-1)
         If xMoveSpeed <= xMaxSpeed Then xSpeed = xSpeed * SpeedUp ; xMoveSpeed = xMoveSpeed * SpeedUp
      EndIf
                               
      If y => 470
         ySpeed = ySpeed *(-1)
         If yMoveSpeed <= yMaxSpeed Then ySpeed = ySpeed * SpeedUp ; yMoveSpeed = yMoveSpeed * SpeedUp
      EndIf
               
      If y <= 0
         ySpeed = ySpeed *(-1)
         If yMoveSpeed <= yMaxSpeed Then ySpeed = ySpeed * SpeedUp ; yMoveSpeed = yMoveSpeed * SpeedUp
      EndIf       
   EndMethod
   
   Method draw()
      DrawOval self.x, Self.y, 10, 10
   EndMethod
   
EndType

Const GAMESTATE_MENU = 1
Const GAMESTATE_GAME = 2
Const GAMESTATE_GAMEOVER = 3
Type TGameManager
   
   'Zeug für Zeitabhängiges bewegen
   Field iFrameStart:Int 'Zeit zu Beginn einer Frame
   Field iFrameTime:Int 'Dauer einer Frame
   
   'Gamestate
   Field hGameState:TGameState
   
   Method init()
   
      Self.setGameState(GAMESTATE_MENU)
   
   EndMethod
   
   Method beginFrame()
   
      self.iFrameStart = MilliSecs()
   
   EndMethod
   
   Rem
      idle(  )
      
      Übergibt die aktuelle Framezeit für frameunabhängige
      Bewegung an den aktuellen GameState - wenn einer
      existent ist.
   EndRem
   Method idle()
      
      If Self.hGameState
         
         'Wenn neuer Gamestate aufgerufen werden soll
         Local iNewState:Int = Self.hGameState.process(Self.iFrameTime)
         
         If iNewState = -1
            'Beenden
            
            self.terminate()
         
         ElseIf iNewState > 0 'Deswegen ist der erste Gamestate 1 :)
            
            Self.setGameState(iNewState)
         
         EndIf

      EndIf
      
   EndMethod

   
   Rem
      endFrame()
      
      Berechnet die Dauer dieser Frame
   EndRem
   Method endFrame()
            
      'Framedauer
      Self.iFrameTime = MilliSecs() - Self.iFrameStart      
      
   EndMethod   
   
   Rem
      terminate()
      
      Beendet den aktuellen Spielstatus anständig
      und befreit ihn aus dem Speicher.
   EndRem
   Method terminate()
      
      If Self.hGameState
         
         Self.hGameState.leave()
         Self.hGameState = Null
      
      EndIf
      
   EndMethod
   
   
   Rem
      setGameState (
         iGameState:Int         Wert des neuen Status
         )
      
      Setzt einen neuen Spielstatus (Menü, Credits,
      Optionen, ...) und beendet dafür ggf. einen
      bestehenden.
   EndRem
   Method setGameState(iGameState:Int)
      
      Local hNewGameState:TGameState
      
      Select iGameState
         
         Case GAMESTATE_MENU
            
            hNewGameState = New TGSMenu
            
         Case GAMESTATE_GAME
            
            hNewGameState = New TGSGame
         
         Case GAMESTATE_GAMEOVER
            
            hNewGameState = New TGSGameOver
            
         Default
            
            Return
            
      EndSelect
      
      'Alten Status beenden und löschen
      If Self.hGameState
         
         Self.hGameState.leave()
         Self.hGameState = Null
         
      EndIf
      
      Self.hGameState = hNewGameState
      Self.hGameState.enter()   
      
   EndMethod

   
EndType

Type TGameState Abstract
   
   Method enter() Abstract 'Gamestate wird aufgerufen
   Method process:Int(iFrameTime:Int) Abstract 'Normaler Prozess (mainloop-zeuch)
   Method leave() Abstract 'Gamestate wird verlassen
   
   Method draw() Abstract 'Malen! :)

EndType

Type TGSMenu Extends TGameState
   
   Method enter()
   EndMethod
   
   Method process:Int(iFrameTime:Int)
      If GetChar()
         Return GAMESTATE_GAME
      EndIf
      
      self.draw()
   EndMethod
   
   Method leave()
   EndMethod
   
   Method draw()
      DrawText "Taste drücken für Spielstart (Menüemulator ;))", 100, 100
   EndMethod
   
EndType

Type TGSGameover Extends TGameState
   
   Method enter()
   EndMethod
   
   Method process:Int(iFrameTime:Int)

      If KeyHit(KEY_ENTER) Then Return GAMESTATE_GAME
      'If KeyHit(KEY_ESCAPE) Then Return -1 'Unnötig da Mainloop das schon macht

      self.draw()
   EndMethod
   
   Method leave()
   EndMethod
   
   Method draw()
      DrawText "Game Over, press ESCAPE to exit or RETURN to restart the Game", 50, 150
               
   EndMethod
   
EndType

Type TGSGame Extends TGameState
   
   Field hPlayer:TPlayer
   Field hBall:TBall
   
   Method enter()
      
      'Das ganze SELFen ist natürlich doof :)
      Self.hPlayer = New TPlayer
      Self.hPlayer.x = 50
        Self.hPlayer.y = 50
        Self.hPlayer.Speed = 3
        Self.hPlayer.width = 30
        Self.hPlayer.height = 100

      Self.hBall = New TBall
        Self.hBall.x = 200
        Self.hBall.y = 200
        Self.hBall.xSpeed = 2 'variablen für Richtung
        Self.hBall.ySpeed = 1
        Self.hBall.xMoveSpeed = 2 'variablen für maximum speed (immer positiv)
        Self.hBall.yMoveSpeed = 1
        Self.hBall.xMaxSpeed = 6
        Self.hBall.yMaxSpeed = 5
        Self.hBall.SpeedUp = 1.5 'für die erhöhung des ballspeeds um 50% bei aufschlag

   EndMethod
   
   Method process:Int(iFrameTime:Int)
      
      '"MovePlayer" ist ungut, weil er ja nicht bewegt wird,
      'sondern man steuert
      self.handlePlayerInput()
      self.handleBall()
      
      If self.hBall.x < 0
         Return GAMESTATE_GAMEOVER
      EndIf
      
      self.draw()
      
   EndMethod
   
   Method leave()
      'Sachen löschen oder so; brauch man aber net :)
   EndMethod
   
   Method draw()
      self.hPlayer.draw()
      self.hBall.draw()
   EndMethod
   
   Method handlePlayerInput()
      
      'Speed hat er selber; liegt an ihm sich zu bewegen! :)
        If KeyDown(KEY_UP) And self.hPlayer.y > 0 Then self.hPlayer.MoveUp()
        If KeyDown(KEY_DOWN) And self.hPlayer.y < 380 Then self.hPlayer.MoveDown()

   EndMethod
   
   Method handleBall()
      'Wirklich sinn macht das ansich erst mit Breakout und multiball-extra
      self.hBall.move()
      
      If self.hBall.x => self.hPlayer.x And self.hBall.x <= self.hPlayer.x + self.hPlayer.width
         If self.hBall.y => self.hPlayer.y And self.hBall.y <= self.hPlayer.y + self.hPlayer.height
            self.hBall.xSpeed = self.hBall.xSpeed * (-1)
            If self.hBall.xMoveSpeed <= self.hBall.xMaxSpeed
               self.hBall.xSpeed = self.hBall.xSpeed * self.hBall.SpeedUp
               self.hBall.xMoveSpeed = self.hBall.xMoveSpeed * self.hBall.SpeedUp               
            EndIf
         EndIf
      EndIf
      
        self.hBall.collideWalls()   

   EndMethod
      
EndType


Global GAMEMANAGER:TGameManager = New TGameManager
GAMEMANAGER.init()
Repeat

   Cls
   
   GAMEMANAGER.beginFrame()
   
   GAMEMANAGER.idle()
   
   GAMEMANAGER.endFrame()
   
   Flip
   FlushMem
   
Until KeyHit(KEY_ESCAPE)
GAMEMANAGER.terminate()
End


christian.tietze@gmail.com - https://christiantietze.de
macOS
  • Zuletzt bearbeitet von DivineDominion am Di, Mai 17, 2005 21:02, insgesamt einmal bearbeitet

diGGa

GruppenKaspar

BeitragDi, Mai 17, 2005 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
da steig ich überhaupt nich durch xD
übrigens geht mit 'enter' game fortführen nichtmehr
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und
glaubte im Licht der Straßenlampe
Den Geist unseres jahrhunderts auf der
Straße zu sehen
Der uns sagte, daß wir alle am Rande
des Abgrunds stehen.
- Al Steward


Athlon 64 3000+ / Radeon 9600 / 1024mb ddram

DivineDominion

BeitragDi, Mai 17, 2005 21:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs editiert. War falsche Methode.

Der Sinn dahinter ist: Der Gamemanager steht über allem.

Gamestates werden ihm zugewiesen, in ihm geändert und von ihm ausgeführt.
Gamestates liefern einen CONST-wert zurück, wenn ein anderer Gamestate kommen soll (Menü, Gameover, ...)

Ein Gamestate (Menü, Credits, das Spiel selber, Editor, ...) beinhaltet eine Methode enter(), die aufgeruft wird wenn der Gamestate geöffnet wird. Leave() kommt beim verlassen bzw Ändern des Gamestates.
procesS() ist eben der normale Mainloop-Inhalt.
draw() muss von dort aus auch aufgerufen werden.

Das bläht den Code sehr auf, gebe ich zu.
christian.tietze@gmail.com - https://christiantietze.de
macOS

diGGa

GruppenKaspar

BeitragDi, Mai 17, 2005 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
gibs zu sowas n tut oder magst du eins schreiben? würde bestimmt enorm helfen.. auf anhieb steig ich da nich durch und n kleiner leitfaden (stück für stück aufbauen etc) würde bestimmt vielen helfen die neu mit oop anfangen Smile

danke schonmal...

habs jetzt so gemacht,... is schon n bischne mehr oop (nur bischen weil ich mitm manager nich kla komm^^)

Code: [AUSKLAPPEN]

Strict

Graphics 640,480, 0, 60

Type TEntity
   Field x:Float
   Field y:Float
   Field speedup:Float
EndType

Type TPlayer Extends TEntity
   Field Speed:Float
   Field Width:Int
   Field Height:Int

   Method MoveUp()
      self.y = self.y - self.Speed
   EndMethod
   
   Method MoveDown()
      self.y = self.y + self.Speed
   EndMethod
   
   Method Draw()
      DrawRect(self.x,self.y,self.width,self.height)
   EndMethod
   
   Method HandleInput()
      If KeyDown(KEY_UP) And self.y > 0 Then self.MoveUp()
      If KeyDown(KEY_DOWN) And self.y < 380 Then self.MoveDown()
   EndMethod
EndType

Type TBall Extends TEntity
   Field xMoveSpeed:Float
   Field yMoveSpeed:Float
   Field xSpeed:Float
   Field ySpeed:Float
   Field xMaxSpeed:Float
   Field yMaxSpeed:Float
   
   Method Move()
      self.x = self.x + self.xSpeed
      self.y = self.y + self.ySpeed   
   EndMethod
   
   Method CollideWalls()
      If self.x => 630
         self.xSpeed = self.xSpeed *(-1)
         If self.xMoveSpeed <= self.xMaxSpeed Then self.xSpeed = self.xSpeed * self.SpeedUp ; self.xMoveSpeed = self.xMoveSpeed * self.SpeedUp
      EndIf
      
      If self.y => 470
         self.ySpeed = self.ySpeed *(-1)
         If self.yMoveSpeed <= self.yMaxSpeed Then self.ySpeed = self.ySpeed * self.SpeedUp ; self.yMoveSpeed = self.yMoveSpeed * self.SpeedUp
      EndIf
      
      If self.y <= 0
         self.ySpeed = self.ySpeed *(-1)
         If self.yMoveSpeed <= self.yMaxSpeed Then self.ySpeed = self.ySpeed * self.SpeedUp ; self.yMoveSpeed = self.yMoveSpeed * self.SpeedUp
      EndIf      
   EndMethod
   
   Method CollideDeathZone()
      If self.x <= 0
         GameOver()
      EndIf
   EndMethod
   
   Method CollidePlayer()
      If self.x => player.x And self.x <= player.x+player.width And self.y => player.y And self.y <= player.y+player.height
         self.xSpeed = self.xSpeed *(-1)
         If self.xMoveSpeed <= self.xMaxSpeed Then self.xSpeed = self.xSpeed * self.SpeedUp ; self.xMoveSpeed = self.xMoveSpeed * self.SpeedUp      
      EndIf   
   EndMethod
   
   Method Draw()
      DrawOval(self.x,self.y,10,10)
   EndMethod
EndType

' instances erstellen
Global player:TPlayer = New TPlayer
Global ball:TBall = New TBall

' variablen legen
Global NewGame = 1

Repeat
Cls

   If NewGame = 1
      LoadGameVars()
   Else
      player.HandleInput()
      
      ball.Move
      ball.CollideWalls()
      ball.CollideDeathZone
      ball.CollidePlayer
      
      player.Draw()
      ball.Draw()   
   EndIf
Flip
FlushMem()
Until KeyHit(KEY_ESCAPE)
End

Function LoadGameVars()
   player.x = 50
   player.y = 50
   player.Speed = 3
   player.width = 30
   player.height = 100

   ball.x = 200
   ball.y = 200
   ball.xSpeed = 2 'variablen für Richtung
   ball.ySpeed = 1
   ball.xMoveSpeed = 2 'variablen für maximum speed (immer positiv)
   ball.yMoveSpeed = 1
   ball.xMaxSpeed = 6
   ball.yMaxSpeed = 5
   ball.SpeedUp = 1.5 'für die erhöhung des ballspeeds um 50% bei aufschlag
   
   NewGame = 0
EndFunction

Function GameOver()
   Repeat
   Cls
   
   DrawText "Game Over, press ESCAPE to exit or RETURN to restart the Game", 50, 150
   If KeyHit(KEY_ENTER) Then NewGame = 1
   If KeyHit(KEY_ESCAPE) Then End
   
   Flip
   Until NewGame = 1
EndFunction
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und
glaubte im Licht der Straßenlampe
Den Geist unseres jahrhunderts auf der
Straße zu sehen
Der uns sagte, daß wir alle am Rande
des Abgrunds stehen.
- Al Steward


Athlon 64 3000+ / Radeon 9600 / 1024mb ddram

Suco-X

Betreff: ......

BeitragDi, Mai 17, 2005 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Damit habe ich gelernt : http://tonyandpaige.com/tutorials/game1.html
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

diGGa

GruppenKaspar

BeitragDi, Mai 17, 2005 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
werds mir durchlesen danke Smile
wird zwar schwer da ich cpp überhaupt nich versteh aber zum ansatzweise verstehen wirds reichen
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und
glaubte im Licht der Straßenlampe
Den Geist unseres jahrhunderts auf der
Straße zu sehen
Der uns sagte, daß wir alle am Rande
des Abgrunds stehen.
- Al Steward


Athlon 64 3000+ / Radeon 9600 / 1024mb ddram

DivineDominion

BeitragDi, Mai 17, 2005 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Vershclang doch prompt eine ganze Stunde meiner Zeit... na egal Smile

https://www.blitzforum.de/viewtopic.php?p=125660

Hier!
christian.tietze@gmail.com - https://christiantietze.de
macOS

rema

BeitragMi, Mai 18, 2005 7:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sehe da nur ein Problem bei diesen schönen Spielen!!! Es braucht immer 100% Prozessorleistung! Da kratze ich mir am Kopf wen ich ein PingPongGame auf einen AMD2600+ spiele...

Aber trotzdem, sehr gute Leermittel um sich in OOP zuvertiefen!
 

ChristianH

BeitragMi, Mai 18, 2005 9:17
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~

Passt wohl besser in das Code Archiv.

diGGa

GruppenKaspar

BeitragMi, Mai 18, 2005 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
rema hat Folgendes geschrieben:
Ich sehe da nur ein Problem bei diesen schönen Spielen!!! Es braucht immer 100% Prozessorleistung! Da kratze ich mir am Kopf wen ich ein PingPongGame auf einen AMD2600+ spiele...

Aber trotzdem, sehr gute Leermittel um sich in OOP zuvertiefen!


also ich hab ne ram usage von 11mb und ne gesamt cpu auslastung von 2%...

ma ne frage:


wenn ich

Self.hBall = New TBall


mache, dann heisst die neue instance doch "Self"... das ist doch eher verwirrend und leicht zu verwechseln mit dem self. befehl!? warum nicht lieber etwas wie iPlayer (instance player) machen?

am besten nochmal (wenns nich zuviel mühe macht)
den abschnitt erklären...

Code: [AUSKLAPPEN]

   Field hPlayer:TPlayer
   Field hBall:TBall

   Method enter()
      'Das ganze SELFen ist natürlich doof :)
      Self.hPlayer = New TPlayer
         Self.hPlayer.x = 50
         Self.hPlayer.y = 50
         Self.hPlayer.Speed = 3
         Self.hPlayer.width = 30
         Self.hPlayer.height = 100
         
      Self.hBall = New TBall
         Self.hBall.x = 200
         Self.hBall.y = 200
         Self.hBall.xSpeed = 2 'variablen für Richtung
         Self.hBall.ySpeed = 1
         Self.hBall.xMoveSpeed = 2 'variablen für maximum speed (immer positiv)
         Self.hBall.yMoveSpeed = 1
         Self.hBall.xMaxSpeed = 6
         Self.hBall.yMaxSpeed = 5
         Self.hBall.SpeedUp = 1.5 'für die erhöhung des ballspeeds um 50% bei aufschlag
   EndMethod


warum das "Field hPlayer:TPlayer"

überhaupt isses so doch etwas schwer weil nicht einfach für jede instance alles gemacht wird sondern der ganze code angepasst werden muss wenn zB n 2. ball dazu kommt... muss man wohl dann mit listen machen
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und
glaubte im Licht der Straßenlampe
Den Geist unseres jahrhunderts auf der
Straße zu sehen
Der uns sagte, daß wir alle am Rande
des Abgrunds stehen.
- Al Steward


Athlon 64 3000+ / Radeon 9600 / 1024mb ddram

Jolinah

BeitragMi, Mai 18, 2005 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das heisst einfach dein Type hat ein Feld namens hPlayer welches vom Type TPlayer ist.

Dem Feld wurde aber noch kein Wert zugeordnet weshalb es am Anfang Null ist.

Mit hPlayer = new TPlayer erstellst du dann einen neuen Player und weist diesen dem Feld hPlayer zu.

Self wird in diesem Fall nicht benötigt, es zeigt einfach auf den aktuellen Type. Du bist aber schon in diesem Namespace, deshalb sind alle Felder direkt ansprechbar.

Es sei denn du hast eine Methode/Funktion mit einem Parameter der gleich heisst wie das Feld. Dann kannst du nicht mehr auf das Feld direkt zugreifen weil der Parameter ja schon so heisst.

Mit der Listen hast du recht, wäre besser wenn es mehrere geben soll Wink


Edit: Du hast da wahrscheinlich was mit BlitzBasic verwechselt wo man so eine Variable definiert:

Code: [AUSKLAPPEN]
bla.typename = new typename


Dann ist bla die Variable. Aber in Bmax ist dafür ja das Doppelpunkt da. Mit dem Punkt greift man auf die Methoden und Eigenschaften eines Types zu. In dem Fall ist also Self eine Referenz auf die Instanz dieses Types.

diGGa

GruppenKaspar

BeitragMi, Mai 18, 2005 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
gibs zu diesen unterschieden eine aufführung Smile^^
is jetz für mich verwirrend^^
ich meine irgendwo ein tut auf englisch für solche sachen gesehen zu haben...

/sry das ich so nerve.. aber sehts positiv... desto schneller ich es peil desto eher seit ihr mich los was solche fragen angeht Smile
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und
glaubte im Licht der Straßenlampe
Den Geist unseres jahrhunderts auf der
Straße zu sehen
Der uns sagte, daß wir alle am Rande
des Abgrunds stehen.
- Al Steward


Athlon 64 3000+ / Radeon 9600 / 1024mb ddram

Jolinah

BeitragMi, Mai 18, 2005 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja eine kleine Zusammenfassung von dem was mir grad in den Sinn kommt:

Code: [AUSKLAPPEN]

bb -> bmax

variable.typename -> variable:typename
variable\field -> variable.field
var = var + 1 -> var :+ 1
var = var - 1 -> var :- 1
var = var * 1 -> var :* 1
var = var / 1 -> var :/ 1
var# -> var:Float  (wobei var# immer noch geht)
var$ -> var:String (dito)
var% -> var:Int (dito)


Der Rest ist eigentlich gleich wie bei BB.. vielleicht noch die Binären Operatoren wie | und & etc.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group