OOP Pong
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
diGGaGruppenKasparBetreff: OOP Pong |
Di, Mai 17, 2005 18:22 Antworten mit Zitat |
|
---|---|---|
k is nich besonders sinnvol xD aber ich muss mich ja erstmal einarbeiten...
BlitzMax: [AUSKLAPPEN] Rem 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 |
Di, Mai 17, 2005 20:30 Antworten mit Zitat |
|
---|---|---|
Habe Gamestates mit Gamemanager eingebaut und sowas alles. Schau selbst. hat ne weile gedauert 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 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 Benenne deine MEthoden nach ihrem Zweck und mach ggf 2 für ähnliche aber dennoch verschiedene ZWecke (CollideWalls, <0, ...) Viel Spaß beim lesen 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
diGGaGruppenKaspar |
Di, Mai 17, 2005 20:44 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Mai 17, 2005 21:05 Antworten mit Zitat |
|
---|---|---|
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 |
diGGaGruppenKaspar |
Di, Mai 17, 2005 21:18 Antworten mit Zitat |
|
---|---|---|
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
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-XBetreff: ...... |
Di, Mai 17, 2005 21:25 Antworten mit Zitat |
|
---|---|---|
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 |
diGGaGruppenKaspar |
Di, Mai 17, 2005 21:31 Antworten mit Zitat |
|
---|---|---|
werds mir durchlesen danke
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 |
Di, Mai 17, 2005 23:57 Antworten mit Zitat |
|
---|---|---|
Vershclang doch prompt eine ganze Stunde meiner Zeit... na egal
https://www.blitzforum.de/viewtopic.php?p=125660 Hier! |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
rema |
Mi, Mai 18, 2005 7:08 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Mai 18, 2005 9:17 Antworten mit Zitat |
|
---|---|---|
~VERSCHOBEN~ Passt wohl besser in das Code Archiv. |
||
diGGaGruppenKaspar |
Mi, Mai 18, 2005 19:46 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Mai 18, 2005 20:04 Antworten mit Zitat |
|
---|---|---|
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 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. |
||
diGGaGruppenKaspar |
Mi, Mai 18, 2005 21:20 Antworten mit Zitat |
|
---|---|---|
gibs zu diesen unterschieden eine aufführung ^^
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 |
||
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 |
Mi, Mai 18, 2005 22:34 Antworten mit Zitat |
|
---|---|---|
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. |
||
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
Powered by phpBB © 2001 - 2006, phpBB Group