Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.04.2011, 13:23

Klassendiagramm für 2D-Spiel

Hallo Leute,

ich plane einen 2D-Sidescroller wie R-Type oa. Katakis zu basteln.
Möchte aber von Anfang an eine klare objektorientierte Struktur anlegen.
Damit ich aber nicht falsch anfange und dann wegen schlechter Analyse scheitere, möchte ich mir gern eure Meinungen einholen.

Bis jetzt bin ich bei 6 Klassen, die meiner Meinung nach benötigt werden. Die Klasse CStarship habe ich bereits implementiert(bis auf die deutschen Attribute und Methoden):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
---------------
CStarship
---------------
-Leben
-Schildenergie
-m_sprite : sf::Sprite
-m_speed : int
-m_startX : int
-m_startY : int
---------------
-CStarship(const sf::Image& image, int speed, int x, int y)
-Update(sf::RenderWindow &app)
-Draw(sf::RenderWindow &app)

weitere Attribute u. Methoden sollen noch dazu kommen:

-aktuelle Waffe
-Sonderausrüstung des Schiffes
-Bewegungsmethoden mit Kollisionsabfragen
-Schussmethoden

usw.


---------------
Klasse Geschoss
---------------
-XStartposition
-YStartposition
-Geschwindigkeit
-Schaden
-sf::Image
-------------------
-Kollisionsmethoden 


----------------------------------------------------------------------------
Klasse Gegner (Basisklasse mit abgeleiteten Klassen für versch. Gegnerarten)
----------------------------------------------------------------------------
-Leben
-Schildenergie
-Waffe
-----------------------------------------
+Bewegungsmethoden mit Kollisionsabfragen
+Schussmethoden

eventuell von CStarship ableiten


----------------------------------------------------------------------
Klasse Waffe (Basisklasse mit abgeleiteten Klassen für versch. Waffen)
----------------------------------------------------------------------
-Geschoss
-Kadenz
-Munitionsvorrat
-Schusswinkel und Streuung
-Geschossgeschwindigkeit
usw.


-----------------------
Klasse Sonderausrüstung
-----------------------
-Methoden, die die Eigenschaften des Spielerschiffes oder der Waffensysteme positiv beeinflussen
usw.


------------
Klasse Level
------------
-Höhe
-Länge
-Levelaufbau
usw.


Was denkt ihr, sind meine Vorstellungen ausbaufähig oder soll ich es lassen und andere Klassen verwenden?
Bin für jeden Tipp sehr dankbar.

Hätte jemand eventuell ein simples Klassendiagramm für mich als Vorlage?
Ich weiß im Moment noch nicht, wie ich Objekte einer Klasse an eine andere Klasse übergebe.
(z.B.: ein Objekt der Klasse Waffe soll genau ein bestimmtes Objekt aus Klasse Geschoss übernehmen).

Gruß, NEUMee...

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

2

14.04.2011, 14:56

Ein kleiner spontaner Hinweis. Ich würde die Kollisionsabfragen nicht auf die einzelnen Objekte verteilen, sondern eher eine Klasse wie "PhysicalWorld" oder so erstellen. Dort kannst Du dann die einzelne Objekte (oder eher ihre Boundingbox oder was auch immer) ablegen. Dann kannst Du leicht in einem Rutsch alle möglichen Kollisionen zwischen einzelnen Objekten ermitteln und zum Beispiel per Event als Nachricht verschicken.
Ansonsten müßtest Du zum Beispiel an Dein CStarship an die Kollisionsabfrage eine Liste aller anderen Objekte übergeben etc.

Werwofl

Treue Seele

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

3

14.04.2011, 15:38

Starship und Gegner könntest du eine übergeordnete Klasse geben beide haben Leben, Waffen, usw. ...

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

4

14.04.2011, 16:15

und noch eine Kleinigkeit. Ich bin da ein wenig pingelig, aber es wäre gut, wenn Du Parameter als const definierst. Damit machst Du nach "außen" deutlich, dass Du die Werte nicht ändern wirst.
Also

C-/C++-Quelltext

1
CStarship(const sf::Image& image,const int& speed,const int& x,const int& y)

Das noch als Pass-By-Reference. Sollte man direkt von vornherein machen, weil es hinterher immer einen tierischen Aufwand bedeutet.
Aber nur am Rande.

5

14.04.2011, 16:18

Ich danke euch erstmal für die Tipps.
Ja die Klasse Gegner werde ich von Starship ableiten.
Wie sollte die Klasse "PhysicalWorld" denn aufgebaut sein.
Soll darin jedes Objekt jeder Klasse auf Kollision mit jedem Objekt jeder Klasse geprüft werden?


Ich zitier mich nochmal selbst, vielleicht kann mir einer auf die Sprünge helfen:

Zitat

Ich weiß im Moment noch nicht, wie ich Objekte einer Klasse an eine andere Klasse übergebe.
(z.B.: ein Objekt der Klasse Waffe soll genau ein bestimmtes Objekt aus Klasse Geschoss übernehmen).
@buggypixels
Welchen Vorteil bringt mir die Parameterübergabe als Referenz?

6

14.04.2011, 16:26

Allerdings ist eine Referenzübergabe bei int, float etc. relativ unnötig.
Die Referenz muss ja auch irgendwann erstellt werden und bei so kleinen Werten wie int macht das überhaupt keinen Unterschied.
Ansonsten sind Referenzen/Zeiger natürlich äußerst sinnvoll, da sonst das gesamte Object nochmal kopiert wird.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

14.04.2011, 16:51

jup, primitive datentypen sollte man nur als referenz übergeben wenn man den wert in der funktion bearbeiten will.
zusammengesetze datentypen sollte immer per referenz übergeben werden, es sei denn man brauch sowieso eine kopie von dem objekt um es innerhalb der funktion ändern zu können ohne das übergebene objekt zu beeinflussen. das kommt aber sehr selten vor.

@NEUMee: leg dir bitte ein buch zu C++ zu. auch wenn du schon delphi kannst. dir fehlen ne ganze menge grundlagen.
übrigens gilt für das image für den schuss das gleiche wie das fürs raumschiff.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (14.04.2011, 16:58)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

14.04.2011, 16:59

Wo genau liegt jetzt doch gleich der Vorteil von dem

C-/C++-Quelltext

1
CStarship(const sf::Image& image,const int& speed,const int& x,const int& y)


zu dem:

C-/C++-Quelltext

1
CStarship(const sf::Image& image, int speed, int x, int y)


????
Irgendwie sehe ich da keinen außer mehr Schreibarbeit und unnötige Verwirrung.
Immerhin ist die Referenz in diesem Fall genauso groß wie der verwendete Datentyp...
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

9

14.04.2011, 17:44

Es gibt keinen Vorteil. Im Regelfall sollte in einem solchen Fall der Code ohne Referenzen sogar schneller sein.

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

10

14.04.2011, 20:00

Sorry. Ihr habt natürlich alle Recht. Bei primitives ist es sogar kontraproduktiv, wenn man sie als Referenz übergibt.
Keine Ahnung, was mich da geritten hatte.

Werbeanzeige