klassen diagramm pingpong

02/21/2017 03:42 maxi39#1
moin,

ich wollte das spiel pingpong in c++ / sfmlprogrammieren. dafür habe ich mir erstmal ein klassen diagramm erstellt.

[Only registered and activated users can see links. Click Here To Register...]

was kann man verbessern ? kritik ist erwünscht!

EDIT: 2tes design nach warfley

[Only registered and activated users can see links. Click Here To Register...]
02/21/2017 07:43 XYZ-Cannon#2
Nach welcher Architektur willst du das Programm denn aufbauen? MVC?
02/21/2017 12:13 warfley#3
Quote:
Originally Posted by maxi39 View Post
was kann man verbessern ? kritik ist erwünscht!
Mal ein paar Vorschläge:
Statt einer gamelogic Klasse und einer TimerThread Klasse würde ich einfach eine GameEngine Klasse machen, und im Loop einfach die Zeitdifferenz mittels GetTickCOunt berechnen, und dann die update und eine Draw Funktion in die GameEngine klasse hauen, und diese mit dem ZeitDelta als Parameter aufrufen.

Das würde das ganze deutlich einfacher gestalten und es gilt immer die Faustregel Simpler = Besser.

Dann würde ich eine Abstrakte Oberklasse Gameobject machen von der Ball und Paddel erben, welche sich um das rendern kümmert, damit vermeidest du doppelten code, außerdem eine abstrakte Methode Update(Delta) implementiert um die Updates durchzuführen, und eventuell eine Reset Methode zum zurücksetzen auf default, damit musst du nur noch eine Liste von Objekten zu deiner GameEngine hinzufügen und in der Update Funktion durchiterieren und für jedes Update aufrufen, und in der Render Methode für alle Render aufrufen.

Dann noch, wozu brauchen die Paddles speed? Willst du beschleunigte paddles bauen? ich würde einfach sagen falls der key down ist dann bewege das Paddle um Speed(Konstant) * Delta / 1000 (falls Delta in MS ist, was es eigentlich zumeist sein sollte)

Außerdem fehlt mir bei deinem Modell irgendwie eine Klasse oder so für User Input also Tastatur handling o.ä.

So wie ich es machen würde:
Code:
SoundDriver = {...}
KeyboardDirver = {...}

GameEngine = {
private:
  LastTickCount
  SoundDriver
  KeyboardDriver
protected:
  ObjectsList
  Update(Delta)
  Draw()
public:
  Init()
  Run()
  Teardown()
}

GameObject = {
private
  Texture
  TexturePosition
protected
  Position
public
  Create(Texture)
  Destroy()
  Reset(); abstract
  Update(Delta); abstract
  Draw()
}

Ball = (GameObject){
private
  Speed
protected
  SoundDriver
  CheckCollision()
public
  Create(SoundDriver)
  Destroy()
  Reset()
  Update(Delta); override
}

Paddle = (GameObject) {
protected
  KeyboardDriver
public
  Create(KeyBoardDriver)
  Destroy()
  Reset()
  Update(Delta); override
}
Natürlich fehlen da noch ein paar Abhängigkeiten wie z.B. Ball -> Paddle
02/21/2017 19:58 maxi39#4
das gefällt mir ziemlich gut

[Only registered and activated users can see links. Click Here To Register...]
02/21/2017 21:04 warfley#5
Quote:
Originally Posted by maxi39 View Post
das gefällt mir ziemlich gut

[Only registered and activated users can see links. Click Here To Register...]
Noch ein Tipp, meist wird die delta zeit als unsinged int (32 oder 64), da bei floating point zahlen wie float oder double sehr unschöne lücken entstehen können, welche echt unschöne geschwindigkeitsunterschiede (grade bei hohen fps) erzeugen können. Daher einfach einen unsigned long oder so verwenden und darin die Millisekunden speichern. Unter Windows gibt dir die Funktion GetTickCount sogar genau das zurück

Und die Positionen sowie die größe solltest du eventuell protected machen, da du ja in den abstammenden klassen (Ball, Paddle) die position ja ändern können möchtest
02/21/2017 21:15 maxi39#6
Quote:
Originally Posted by warfley View Post
Noch ein Tipp, meist wird die delta zeit als unsinged int (32 oder 64), da bei floating point zahlen wie float oder double sehr unschöne lücken entstehen können, welche echt unschöne geschwindigkeitsunterschiede (grade bei hohen fps) erzeugen können. Daher einfach einen unsigned long oder so verwenden und darin die Millisekunden speichern. Unter Windows gibt dir die Funktion GetTickCount sogar genau das zurück

Und die Positionen sowie die größe solltest du eventuell protected machen, da du ja in den abstammenden klassen (Ball, Paddle) die position ja ändern können möchtest
danke für den tipp. hab das mit private in der abtracten klasse ganz vergessen^^ und es haben sich noch weitere fehler eingeschlichen z.b.
Update(float delta : int) (Syntax fehler) was ich jetzt eh nach Update(delta :unsigned int) änder^^