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

05.04.2015, 23:39

Objekte referenzieren Objekte?

Hallo, ich hab mal eine kleine Designfrage ;)
Mitunter kommt es ja vor, dass Objekte andere referenzieren, z.B. die Kamera ein Spielobjekt. Der Kamera wird also ein Zeiger/Referenz/irgendwas auf das Objekt übergeben und folgt diesem.
Das Problem ist, wenn es Zerstört wird, dann folgt die Kamera fröhlich dem nicht existenten Objekt und es hagelt 0xC0000005en.... :D Das Problem kann man natürlich auch auf andere Situationen übertragen, wie Kanonen, die Gegner abscheißen und das ganze schwieriger wird.
Ich würde da spontan auf Listener zurückgreifen, die aufgerufen werden, wenn ein Objekt zerstört wird und dementsprechen ihre Objektreferenz löschen. Wie würdet ihr das machen? Irgendwelche Gimicks, die ich nicht kenne?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

06.04.2015, 00:06

Vielleicht wäre das was für dich: Weak Pointer

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

06.04.2015, 00:15

Wieso wird das Objekt denn zerstört, so lange die Kamera es noch referenziert?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

06.04.2015, 07:59

Na ja, dass verfolgte Objekte länger leben als die Kamera ist ja jetzt nicht unüblich. Ich denke z.B. an StarCraft, wo man einer Einheit folgen kann. Wird diese vernichtet, entsteht das hier genannte Problem. Allerdings ist mir natürlich nicht klar, wieso es keinen Code gibt, der sich darum kümmert, dass die Kamera nicht mehr folgt. Es muss ja irgendwo ein gewisses Event geben. Irgendwer muss dieses ja der Kamera zugewiesen haben und da macht es durchaus Sinn, dass dieses Stück Code sich per Event informieren lässt, sobald das Ziel vernichtet wird und dann die Kamera wieder zurücksetzt.
Ich mache diesen Vorschlag, weil ich es nicht sehr elegant fände, wenn die Kamera ihre Ziele kennen würde, obwohl man es vielleicht über ein ganz knappes Interface lösen könnte (Position + Event für Vernichtung).
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]

5

06.04.2015, 10:50

Das meinte ich ja mit listener für die zerstörung von objekten. Oder meinst du, dass z.B. das Level die Kamera automatisch zurücksetzt, wenn das Objekt zerstört wird? Aber da wäre es ein Problem bei bereits genannten Kanonen geben, die sich ihre Ziele selbst aussuchen. Da wäre die Idee von weak_ptr wirklich passend.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

06.04.2015, 11:29

Du kannst zwar weak_ptr nutzen, ist aber genau genommen völlig überflüssig. Wenn ein beobachtetes Objekt zerstört wird, sollte die Kamera zurückgesetzt werden. Das über weak_ptr zu lösen finde ich nicht sehr elegant.
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]

7

06.04.2015, 11:47

Ja, aber ich meine doch auch andere Objekte, wie eben Kanonen, die auf Gegner zielen und die es auch mehrmals gibt. Somit wäre dann das ganze nicht so einfach, weil der Ort, an dem die Objekte zerstört werden (das ist das Level-Objekt), nichts von solchen Kanonen weiß. Da kommt solch ein weak_ptr doch ganz gelegen ^^ Nur muss ich noch gucken ob das von der Performance her passt, ich weiß nicht ob das gut ist, wenn ich jeden Frame mehrere von denen locke und wieder freigebe. Weiß nicht was der intern so anstellt.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

06.04.2015, 11:56

1) Wieso weiß das Level nichts von den Dingen, die in ihm drin sind (Kanonen)?
2) Wo ist das Problem ein Event zu werfen, wenn ein Objekt zerstört wird, woraufhin die Kanone dieses Ziel abwählt? Die Kanone kann doch prima auf so ein Event lauschen?
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

9

06.04.2015, 12:21

Für eine Kamera hat BlueCobold ja bereits beschrieben, dass die Stelle, der der Kamera die zu verfolgenden Objekte zuweisen kann, diese auch wieder entfernen kann.
Für Kanonen ist das meiner Meinung nur entfernt das gleiche. Die Kanone hat eine bestimmte Sichtweite. Sobald Feinde dort rein laufen, werden sie der Kanone bekanntgegeben, sobald sie raus laufen, wird die Kanone darüber ebenfalls informiert. Das Sterben einer beschossenen Einheit wäre genau das Gleiche, wie das verlassen der Sichtweite. Da sich ohnehin eine andere Stelle um die Prüfung kümmern muss, welche Einheiten in welchen Sichtweiten sind, würde auch hier wieder indirekt eine andere Stelle dafür sorgen, dass die zu beschießenden Einheiten richtig zugewiesen und "entfernt" werden.

Und man sollte auch bedenken, dass das Objekt der Einheit im Speicher nicht sofort zerstört werden muss/darf, nur weil die Lebensenergie auf 0 gesunken ist. Die Einheit wäre für den Spielverlauf und die Mechaniken, somit also auch für den Beschuss durch Kanonen, nicht mehr relevant, denen könnte also bereits ein entsprechendes Signal gegeben werden, soll sie allerdings erst noch eine heroische Sterbeanimation hinlegen, so sollte auch das entsprechende Objekt nicht einfach schon zerstört worden sein.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

10

06.04.2015, 12:46

Die Kanonen würden selber gucken, wenn etwas in Sichtweite ist und nehmen sich eine Referenz darauf. Das passiert nicht woanders. Meine Frage war jetzt, ob es elegant wäre, beim zerstören von Objekten registrierte listener aufzurufen, z.B. den der Kanone, die guckt, ob 'ihr' Objekt dabei ist. Also auch das, was BC meint. Hab mich etwas über den weak_ptr informiert und gesehen, dass es nicht unbedingt praktikabel ist, den bei einem Haufen von Objekten ständig einzusetzen.

Werbeanzeige