Tician Geschrieben 4. Juli 2017 Autor Teilen Geschrieben 4. Juli 2017 (bearbeitet) Klingt logisch! Ich frag dann nochmal wegen der besseren Lösung, jetzt wirds langsam knapp und ich renne gerade schon wieder in ein Problem. Ich initialisiere meine Subscribe-Events in Form1 bei Programm-Start - aber weil nicht alle Klassen schon ein Objekt direkt zu Beginn haben (Fight und Monster) komme ich hier auf eine NullReferenceException. Mir fällt keine Lösung drum herum ein. Ich brauche die Events Ich habe den Code wie er jetzt aussieht auch mal geupdated, ich weiß Github wäre besser, aber ich blick das nicht >.< https://pastebin.com/3krETNbs Irgendeine Idee wie ich da jetzt drum rum komme? Einfach trotzdem mal Objekte für die 2 Klassen erstellen ist ne blöde Lösung. Edit: Ich habe das Event komplett aus der Fight-Klasse genommen und mal ein Monster mit leeren Stats erstellt damit ich zumidnest mal den Code ausprobieren kann. In der Monster-Klasse bekomme ich beim HpChanged-Event ein NullReferenceException. Mach ich irgendwas mit den Events falsch? Bearbeitet 4. Juli 2017 von Tician Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 4. Juli 2017 Teilen Geschrieben 4. Juli 2017 Was heißt für dich "Programm-Start"? Wo ist denn das zu finden, was du meinst? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tician Geschrieben 4. Juli 2017 Autor Teilen Geschrieben 4. Juli 2017 (bearbeitet) Monster //Events public event PropertyChangedEventHandler HpChanged; public void TakeDamage(int damage) { if (curHP > damage) { curHP = curHP - damage; HpChanged(this, new PropertyChangedEventArgs("curHP")); //NullReferenceException } else { curHP = 0; } } Genau hier bekomme ich die Exception, andere Events funktionieren aber soweit ich sehen kann. Ich weiß zu wenig über Events um da einen Ansatz zu haben warum das jetzt nicht funktioniert, aber ein anderes Event das genau so aufgebaut ist funktioniert. Das Monster ist auch da, die curHP-Variable hat auch einen Inhalt. Bearbeitet 4. Juli 2017 von Tician Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
arlegermi Geschrieben 4. Juli 2017 Teilen Geschrieben 4. Juli 2017 (bearbeitet) Wieso setzt du die Events nicht beim Erzeugen der Monster? Events sind doch immer mit Objekten verknüpft (nicht mit Klassen!). Wenn du also in PopulateMonsters deine beiden Monster erzeugst, kannst du doch auch da die Events anlegen. Zu der NRE: Wenn es niemanden gibt, der auf das Event hört, dann bekommst du die. Deshalb solltest du immer erst prüfen, ob der Handler null ist: public void TakeDamage(int damage) { //... if(HpChanged != null) { HpChanged(this, new PropertyChangedEventArgs("curHP")); } // oder (neueres C#): HpChanged?.Invoke(this, new PropertyChangedEventArgs("curHP"); } Bearbeitet 4. Juli 2017 von arlegermi Tician reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tician Geschrieben 4. Juli 2017 Autor Teilen Geschrieben 4. Juli 2017 (bearbeitet) Es gibt aber jemanden der darauf hören sollte... Form1 private void InitializeEvents() { _player.HpChanged += UpdateHpLabel; _player.LocationChanged += UpdateControls; _currentMonster.HpChanged += MonsterTakesDamageOutput; _player.Victory += MonsterDeadOutput; _currentMonster.MonsterAttack += MonsterAttackOutput; } public void UpdateHpLabel(object sender, PropertyChangedEventArgs e) { lbCurHP.Text = _player.curHP.ToString(); hpBar.Value = _player.curHP; } Form1 ist die einzige Klasse die auf Events hört. vor 11 Minuten schrieb arlegermi: Wieso setzt du die Events nicht beim Erzeugen der Monster? Weil mir Whiz-zarD 4 Posts weiter oben gesagt hat das es nicht in den Konstruktor gehört^^ Wenn ich mich das aber so anschaue sind sämtliche Subscribe-Events trotzdem in meinem Form1-Konstruktor enthalten... Bearbeitet 4. Juli 2017 von Tician Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tician Geschrieben 4. Juli 2017 Autor Teilen Geschrieben 4. Juli 2017 (bearbeitet) Fehler gefunden! Mein Gott ich sollte nicht _player.HpChanged und _Monster.HpChanged simultan haben... wer hat nur so einen Mist programmiert... Edit: Doch nicht, die Events sind vorhanden (ich bin nur blind). Ich bin verwirrt. Sämtliche Monster-Events funktionieren nicht. Bearbeitet 4. Juli 2017 von Tician Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
arlegermi Geschrieben 4. Juli 2017 Teilen Geschrieben 4. Juli 2017 (bearbeitet) vor 14 Minuten schrieb Tician: Weil mir Whiz-zarD 4 Posts weiter oben gesagt hat das es nicht in den Konstruktor gehört^^ Muss ja auch nicht in den Konstruktor Du hast doch eine Methode PopulateMonsters, wo du irgendwie sowas hast: Monster wolf = new Monster(...) Nach dem Erzeugen des Monsters kannst du doch einfach die Events setzen: wolf.HpChanged += ... Nochmal zu der NRE: Du registrierst die Events aber nur für das Monster, das zu dem Zeitpunkt der Methode gesetzt ist. Für alle neuen Monster ist das Event nicht registriert. Events gelten immer für das konkrete Objekt, für das du sie registrierst. Nur, weil du deinem Formular sagst, dass es auf die Events des aktuellen Monsters hören soll, reagiert es nicht auch gleich auf alle anderen Monster. Bearbeitet 4. Juli 2017 von arlegermi Tician reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tician Geschrieben 4. Juli 2017 Autor Teilen Geschrieben 4. Juli 2017 (bearbeitet) Macht Sinn. Stimmt, ich hab ja das Objekt mit drin stehen. Oh man ._. Jetzt finde ich Events doch nicht mehr so toll. Dann ruf ich das jetzt zu jedem neuen Monster auf. Das kriegt dann später (nach Donnerstag) noch ne extra Methode. Ich brauch ne Liste mit was ich alles machen wollte.... Edit: So, Spiel rennt jetzt ohne Exceptions. Hat noch ein paar wenige Schreib- und Logikfehler, aber die krieg ich noch raus. Ihr seid toll, ich bin voll happy! Bearbeitet 4. Juli 2017 von Tician arlegermi und JimTheLion reagierten darauf 2 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tician Geschrieben 5. Juli 2017 Autor Teilen Geschrieben 5. Juli 2017 (bearbeitet) Eine (hoffentlich) letzte Frage. Wie sieht das in einem UML aus wenn ich in meiner Form1-Klasse eines der Monster aus der World-Klasse kopiere? Geht dann ein Pfeil zwischen Form1 und World oder zwischen Form1 und Monster? Und wäre das dann eine Aggregation? Was fehlt sonst noch? Bearbeitet 5. Juli 2017 von Tician Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SaJu Geschrieben 5. Juli 2017 Teilen Geschrieben 5. Juli 2017 Ich würde sagen, weil World das Monster aus der Klasse "Monster" schon bezieht, würde eine Beziehung zwischen "Form1" und "World" ausreichen. Und "Ja": Es ist eine Aggregation, weil die Daten schließlich aus der anderen Klasse geholt werden. Tician reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tician Geschrieben 5. Juli 2017 Autor Teilen Geschrieben 5. Juli 2017 Super, vielen Dank! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.