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

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

1

24.09.2012, 04:28

Wiedermal ein paar Fragen ;)

Hallo,

1.
-----
Ich glaub ich mach was falsch... Ich hatte ja schon ein paarmal fragen über Variablen gestellt und ich dachte eigentlich das ich sie die Antworten darauf geschnallt habe, aber irgendwie bin ich mir immernoch nicht sooo sicher..
Ich bastel grad bisschen an einem kleinen Bomberman, was ich habe ist die Map und den Spieler, aber nur schon das ergibt bei mir ne Funktionsaufruf von:

C-/C++-Quelltext

1
void c_spieler::SpielerMove(sf::Event events, char map[100][100], sf::RenderWindow *spielWindow, sf::Sprite *s_spieler)


und ja wenn ich jetzt noch Bomben reinpflanzen will kommen da noch mehr übergaben dazu, und irgendwie erscheint mir das doch völlig falsch.. ich mein bei einem grösseren Projekt wäre diese Zeile dann endlos :/
Ich bin grad dabei Bomben zu implementieren, aber dann erweitert sich die Funktion nochmals um einen Parameter und irgendwie erscheint mir das der falsche Weg, oder wie seht ihr das? bin ich aufm richtigen Dampfer oder bin ich völlig falsch? :/


2.
----

Zu den Bomben, was würdet ihr mir da raten was ich mir da anschaue um Bomben zu realisieren in einem Bomberman? ich mein ich brauch ja sicherlich mal einen Timer, und dann die XY Koordinaten, BombenTyp, usw.
Anfangs dachte ich mir ich mache das mit einer Liste, aber irgendwie scheint mir die Liste doch nicht auszureichen.. sollte ich vieleicht einen Vector verwenden?
vector bomb[bombe][koordx][koordy][typ][...]
und dann halt immer abfragen welche bombe wo grad wie stark explodiert?
oder gibt es was viel einfacheres in dieser hinsicht?

3.
----

zu dem Timer, seh ich das richtig das ich einfach nur immer abfragen muss wieviel Zeit nun verstrichen ist?
also sozusagen speicher ich eine Zeit in eine Variable also
vector bomb[bombe][x][y][typ][zeit][...]
und checke dann immerwieder wielang es jetzt schon her ist seit dieser Zeit und nach länger als 5 sekunden explodiert sie dann?
oder gäbe es ne schönere Variante in SFML?


Jo vielen Dank für die Antworten!
♥ SFML 2.0 Visual Express 2010 ♥

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

24.09.2012, 06:39

1) Typisches Problem bei schlechtem Design und von EierLegendenWollMilchSau-Funktionen. Der Spieler muss das Fenster nicht kennen, er muss das Sprite nicht kennen, er muss das Event nicht kennen und schon gar nicht einen Spieler übergeben bekommen. Überleg Dir rein fachlich, was "Player::Move" eigentlich tun sollte und was er dazu wissen muss, damit er die Aktion durchführen kann. Im Normalfall ja maximal die Map und die Richtung. Seine aktuelle Position wird er ja hoffentlich ohnehin kennen.

2) std::list<Bomb>. Nix Array mit tausend Dimensionen. Die Sachen "Typ", und "Koordinate" sollten Attribute von "Bomb" sein.

3) Einfach abfragen reicht. Ist sicher besser als irgendwelche anderen Varianten.

4) Lies ein Buch über Strukturen und Klassen. Dringend.

5) c_spieler::SpielerMove? Erstens finde ich Englisch-Deutsch-Mix ganz schlimm. Zweitens finde ich Präfixe ganz schlimm. Drittens finde ich kleine Klassen-Namen ganz schlimm. Und viertens ist "SpielerMove" doppelt gemoppelt, da "Move" ja bereits eine Methode von "Spieler" ist.
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]

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

3

24.09.2012, 11:10

im Grunde hat BlueCobold schon alles geschrieben

zu 1.)
wie schon geschrieben ist dein Design wohl nicht das beste
der Spieler sollte nach Möglichkeit nur sich selbst kennen und max. wissen, in welcher Umgebung er sich befindet (auf welche er aber keinen "Vollzugriff" benötigt)
zum Wissen über sich selbst würde gehören, welcher Spieler ihn kontrolliert, was für ein Aussehen er hat und (wenn man so will) auch die Position, an der er sich befindet
da für die Bewegung aber genaueres Wissen über die Umgebung erforderlich ist, kann der Spieler selbst nicht prüfen, wie weit er sich in eine bestimmte Richtung bewegen kann
das heißt, die Umgebung muss entweder gefragt werden, wie weit sich der Spieler in die Richtung bewegen kann oder die Umgebung muss sich um die Bewegung des Spielers kümmern
dann wären die Parameter nicht mehr erforderlich, da die Umgebung bereits alles weiß, was sie wissen muss (man müsste nur noch den Spieler übergeben, der bewegt werden soll und die Richtung, in die er laufen soll)

zu 2.)
ich bin mir nicht sicher, was das heißen soll, was du als Datentyp/Variable geschrieben hast (es könnte daran liegen, dass ich nicht mit C++ arbeite), aber ich gehe mal davon aus, es sollte ungefähr sowas heißen:
vector<vector<map<Type, Bomb>>> bombs (ich weiß nicht, wie entsprechende Datentypen in C++ heißen)
um an eine einzelne Bombe zu kommen, müsste man bombs[x][y][type] verwenden, wobei x und y die Koordinate darstellen und type den Typ der Bombe (vom Typ Type)
wie BlueCobold schon geschrieben hat, wäre das nicht der richtige Ansatz, da der Typ (und ggf. auch die Koordinate) Eigenschaften der Bombe sind und somit nicht als Indizes dienen sollten
du könntest darüber nachdenken, was durch die von dir verwendete Datenstruktur möglich wäre:
an jeder X-Koordinate und jeder Y-Koordinate kann von jedem Typ eine Bombe vorhanden sein
allerdings dürfte es wohl nicht das Ziel sein, dass an einer Koordinate mehrere Bomben liegen, weshalb das wohl nicht das gewünschte ist

zu 3.)
warum willst du dein Array um eine Dimension erweitern?
wann eine Bombe gelegt wurde ist wiedereinmal eine Eigenschaft der Bombe


zu 4.)
zusätzlich evtl. noch Objektorientiertes Design

zu 5.)
ich kann nur dem zustimmen, was BlueCobold geschrieben hat
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

4

24.09.2012, 22:55

Vielen Dank für die Antworten, ich dachte schon das ich wiedermal vieles nicht geschnallt habe :/

naja, ich werd mich dann nochmals in klassen und strukturen reinlesen demnächst...
♥ SFML 2.0 Visual Express 2010 ♥

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

5

25.09.2012, 08:56

So ich nochmals :D


im Grunde hat BlueCobold schon alles geschrieben

zu 1.)
wie schon geschrieben ist dein Design wohl nicht das beste
der Spieler sollte nach Möglichkeit nur sich selbst kennen und max. wissen, in welcher Umgebung er sich befindet (auf welche er aber keinen "Vollzugriff" benötigt)
zum Wissen über sich selbst würde gehören, welcher Spieler ihn kontrolliert, was für ein Aussehen er hat und (wenn man so will) auch die Position, an der er sich befindet
da für die Bewegung aber genaueres Wissen über die Umgebung erforderlich ist, kann der Spieler selbst nicht prüfen, wie weit er sich in eine bestimmte Richtung bewegen kann
das heißt, die Umgebung muss entweder gefragt werden, wie weit sich der Spieler in die Richtung bewegen kann oder die Umgebung muss sich um die Bewegung des Spielers kümmern
dann wären die Parameter nicht mehr erforderlich, da die Umgebung bereits alles weiß, was sie wissen muss (man müsste nur noch den Spieler übergeben, der bewegt werden soll und die Richtung, in die er laufen soll)



Soll das heissen das ich in der Spieler klasse laufen soll, aber nicht checken ob ich gegen ne Wand laufe? also sozusagen soll ich da laufen, und dann der Karten-Klasse sagen das ich auf das XY Feld gelaufen bin und fragen ob das geht?

Ich bin ja grad ein bisschen meinen Code zu verklassen (gutes Wort!) und häng jetzt an der Kollisionsabfrage fest, da ich vorher ja schön alles gewusst hatte (also alles mögliche an die Funktion weitergeleitet habe) konnt ich alles in der Bewegens-Funktions lösen, da ich ja jetzt aber nur noch das Fenster an sich weitergebe (void c_Player::Update(sf::RenderWindow *spielWindow)), weis die Spielerklasse gar nix mehr, also der Spieler weis eigentlich nicht wo er steht..

Soll ich jetzt eifach mal den Spieler fortbewegen, und nachdem er gewandert ist, die Karte fragen ob ich da überhaupt stehen darf? und wenn nicht dann wieder zurücksetzen?
♥ SFML 2.0 Visual Express 2010 ♥

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

25.09.2012, 09:33

Der Spieler braucht das Fenster nicht zu kennen. Der Spieler ist ein abstraktes Modell und hat mit der Repräsentation Deines Programms als Fenster nichts zu tun.
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]

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

7

25.09.2012, 09:39

Der Spieler braucht das Fenster nicht zu kennen. Der Spieler ist ein abstraktes Modell und hat mit der Repräsentation Deines Programms als Fenster nichts zu tun.


Hmm ich geb das Fenster halt weiter damit ich es Updaten kann, ich versteh sonst nicht wie ich den Spieler sonst in das Fenster drawen soll? Ich definier ja das Sprite erst in der Spieler klasse, somit ist es in der eigentlichen Run() funktion nicht bekannt, soll ich jetzt das Sprite von der Spielerklasse zurück an die Run klasse geben oder das Fenster von der Run in die Spielerklasse?
♥ SFML 2.0 Visual Express 2010 ♥

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

8

25.09.2012, 09:43

alternativ könntest du auch erst die Karte fragen, ob die neue Position gültig ist und ihn dann verschieben
allerdings hast du immer das Problem, dass der Spieler sich (abhängig von der Geschwindigkeit) nicht bis an die Wand ran bewegen kann, sondern ggf. mit geringem Abstand zu dieser stehen bleibt

besser wäre es, wenn du deine Bewegen-Funktion so wie du sie hast/hattest in die Map-Klasse packst, die ganz Kollisionsprüfung dann auch dort durchführst (was ohne Parameter möglich ist) und die Position des Spielers aktualisierst
die Methode muss dazu folgende Dinge wissen:
welcher Spieler?
aktuelle Position?
welche Bewegungsrichtung?
welche Geschwindigkeit?
nicht alle diese Dinge müssen als Parameter übergeben werden
es ließe sich auch so lösen, dass nur noch der Spieler als Parameter übergeben werden muss


und als Randbemerkung noch:
die Position des Spielers in der Umgebung (Map) ist keine Eigenschaft des Spielers und keine Eigenschaft der Map, sondern eine Eigenschaft der Beziehung zwischen Spieler und Map (ein Spieler, der sich nicht in einer Umgebung befindet, benötigt keine Position und eine Map ohne Spieler keine Spielerpositionen)
an der Stelle macht man sich das Leben meist einfacher, indem man dem Spieler die Position gibt


spieler zeichnen:
das sollte gänzlich unabhängig von der Bewegung passieren
schreibe dir zusätzlich eine Draw()-Methode, die das Zeichnen erledigt ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

25.09.2012, 09:44

Hmm ich geb das Fenster halt weiter damit ich es Updaten kann, ich versteh sonst nicht wie ich den Spieler sonst in das Fenster drawen soll? Ich definier ja das Sprite erst in der Spieler klasse, somit ist es in der eigentlichen Run() funktion nicht bekannt, soll ich jetzt das Sprite von der Spielerklasse zurück an die Run klasse geben oder das Fenster von der Run in die Spielerklasse?

Die Methode "Run" sagt ihrem Namen nach nicht, dass sie ein Sprite irgendwohin zeichnet. Sonst hieße sie ja RunAndRender. Wie ich schon sagte, spalte das Design auf. Die Methode macht zu viel auf einmal. Das sollte sie nicht.

@Sacaldur: Sehe ich leicht anders. Ich finde, dass die Position eines Spielers durchaus eine seiner Eigenschaften ist, auch wenn nicht so konkret wie Mütze oder Hose. Sie ist abstrakter. Natürlich kann man sie in eine externe Relation umwandeln, die zwischen Map und Spieler besteht. Wäre ebenso logisch, für mich aber ein unüblicher Ansatz. Das Problem, was ich vor allem dabei sehen würde ist: Gehört z.B. Geschwindigkeit und Richtung auch dazu? Oder gehört dazu auch die aktuelle Animation, also welcher Fuß oder welcher Arm gerade wo ist? Würdest Du die komplette Animation und Bewegung der Figur auslagern? Wenn ja, was bleibt vom Konstrukt "Spieler" eigentlich noch übrig außer einem reinen Daten-Container?
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]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (25.09.2012, 09:50)


Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

10

25.09.2012, 09:49



Soll ich jetzt eifach mal den Spieler fortbewegen, und nachdem er gewandert ist, die Karte fragen ob ich da überhaupt stehen darf? und wenn nicht dann wieder zurücksetzen?


Mach doch einfach mal folgenden Versuch. Du stellst dich in ca. 3m Entfernung vor einer Wand hin, dann nimmst du Anlauf und rennst los.

3m ... 2m ... 1m ... 0m ... BUMM

Wer ruft Aua? Die Wand oder du? :D

Werbeanzeige