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

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

1

28.11.2010, 12:03

Brauche einen kleinen Denkanstoß...

Hallo!

Ich habe mir vor kurzem das SFML.NET SDK(1.6) runtergeladen und bin ehrlich gesagt total überrascht.
Im gegensatz zu XNA oder SDL.NET / SDL.CS ähnelt das ganze doch sehr der C++ Version.
(Ich programmiere jetzt in C#)

Jetzt habe ich aber mal wieder ein Problem mit den Klassen:

Wie sollte ich so eine Klasse (z.B. Player) aufbauen?
Sie sollte ja, wenn ich sie aufrufe als Sprite erkannt werden.

Bei C++ geht das ja so:

C-/C++-Quelltext

1
class Player : public sf::Sprite



Aber bei C# geht das ja nicht mehr.
Ich möchte gerne eine Sprite-Klasse, die ich einfach so aufrufen kann:

Quellcode

1
Player player1 = new Player();



Allerdings sollte man dann auch das ganze zeichnen können und nicht erst die
Sprite über

Quellcode

1
App.Draw(player1.sprite);

aufrufen müssen.

Kann mir jemand vlt. sowas wie ein Muster für so eine Klasse in C# zeigen?

Tut mir leid, dass ich euch mit sowas blödem belästige ;)

2

28.11.2010, 12:21

Da muss man doch einfach vererben oder?

Quellcode

1
2
3
4
class Player : sf::Sprite
{
    //......
}

idontknow

unregistriert

3

28.11.2010, 12:55

Da muss man doch einfach vererben oder?

Quellcode

1
2
3
4
class Player : sf::Sprite
{
    //......
}


guter Post...

4

28.11.2010, 13:15

Ich weiß ehrlich gesagt auch nicht ganz, was der TE will.
Du brauchst doch nur ne Klasse, die unter anderem ein Sprite hat. Der kannst Du doch 'ne Draw-Methode geben, die Du dann einfach aufrufst. Vererben kannst Du wie in C++, insofern stimmt Batzers Beitag auch.

Du solltest Dir halt nur überlegen, wie Du die Klasse aufbauen willst.
"Ist" der Spieler ein Sprite oder "hat" er ein Sprite?

Nach dem, was ich bei dir herauslese klingt das so, als wolltest Du eine Klasse, die nichts anderes als ein Sprite ist.

5

28.11.2010, 13:56

@idontknow
Mein Post ist immer noch besser als deiner ;)

Wie Luinechor schon geschrieben hat klappt das Vererben genau wie in C++.
Daher wird folgende Kette gebildet: Drawable -> Sprite -> Player
Und da RenderWindow::Draw(const Drawable& drawable) einen Drawable erwartet
sollte dieser Lösungsweg ohne Probleme laufen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

6

28.11.2010, 14:20

ich weiß ja nicht was für ein genre es wird aber in 99% der fälle ist es sinnvoller von einer allgemeinen klassen die z.b. die spielfiguren in rpgs oder schiffe in weltraum shoot'em ups darstellt zu erben die ein sprite enthält. denn die spielfigur muss, wenn du alles richtig machst, nur einmal initialisiert werden und verwaltet sich dann mit den auslösern update und rendermethode ab dann selbst(steuerung, bewegung, animationen ect.) weshalb man keinen zugriff auf das sprite direkt brauch. das wichtigste bei der kapselung ist nämlich nicht das verhindern von unbefugten zugriff sondern die möglichkeit zum beispiel vor dem zeichnen noch etwas zutun. stell dir vor du hast eine figur die sich tarnen kann und nicht gezeichnet werden soll. es wird ziemlich unübersichtlich wenn du das in der klasse prüfst in der die figuren verwaltet werden.
"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?

idontknow

unregistriert

7

28.11.2010, 17:31

@idontknow
Mein Post ist immer noch besser als deiner ;)


Mehr von nicht-sinnvoll ist immernoch nicht sinnvoll, ergo ist deiner gleich wertlos wie mein Post.

Der TE hat einfach keine Ahnung was genau er will, daher auch keine anständige Antwort wert (meine Meinung).

8

29.11.2010, 16:20

@idontknow
Also denkst du, dass ich nie hätte posten sollen oder was? :P
Ich fand meinen Post kurz und knackig :D Er wollte ja nur wissen
wie man die Spieler Instanz der Funktion *.Draw() übergeben könnte.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

9

29.11.2010, 16:36

Also mal ein bisschen Ordnungs ins Code-Kuddel-Muddel machen:

1) Ist oder Hat-Beziehung?
Für Die Frage ob Vererben oder als Membervariable hilft ein einfacher Satz bzw. zwei: Player ist ein Sprite bzw. Player hat ein Sprite. Je nachdem, was besser passt hilft in der Regel. Ausserdem: Vererbung macht code manchmal kürzer, engt aber auch ein ;)

2) Wie baue ich eine Klasse auf?
Du kannst deine Klasse eigentlich wie in C++ aufbauen, mit dem Unterschied, dass du quasi nur in die "Header" schreibst. Das hat mir oft geholfen am Anfang. Ansonsten überlege dir, was dein Player können soll (Methoden) und was er dafür an Material braucht (Membervariablen). Wenn dir das nicht hilft: Galileo Computing - Visual C# 2008. Wenn das nicht Hilft: OOP lernen!

3) SFML ist in C# wie C++
Warum auch nicht? Es ist eine portierung und da wird halt soweit es geht alles übernommen.

4) Player soll als Sprite erkannt werden
Naja, du hast beide möglichkeiten aufgeführt, bis auf eine:

C-/C++-Quelltext

1
Player.Draw(App);


Welche du davon nimmst, ist deine Sache. Ich habe dir oben die Vor- und Nachteile genannt. Um Flexibel zu bleiben, würde ich die App Als Parameter nehmen. Allein, vllt stehen in der App noch andere dinge drin, diefür deinen Player interessant sind?

So far ;)

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

10

29.11.2010, 17:58

Danke für eure Hilfe!
Ich mache nur ein kleines Spiel, für das es vollkommen reicht, dass der Player ein Sprite IST.
Aber jetzt habe ich das Problem, dass ich in der Doku und in den Example Quelltexten keine
Move() - Funktion gefunden habe... Wie soll ich denn jetzt meine Sprites bewegen?
Hab auch schon Google und das offizielle SFML Forum danach durchforstet, aber anscheinend
hat niemand das selbe Problem???

Wisst ihr da vielleicht, wie ich Sprites bewegen kann?

Werbeanzeige