Jump to content

C# kleines Spiel, bitte um Hilfe

Empfohlene Beiträge

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 von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
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 von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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 von arlegermi

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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 von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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 von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
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 von arlegermi

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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 von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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?

 

5-1.PNG

bearbeitet von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Nimm an der Diskussion teil

Du kannst jetzt hier posten und Dich später registrieren. Wenn Du bereits über eine Konto verfügst, melde Dich jetzt an, um mit Deinem Konto zu posten.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.


Fachinformatiker.de, 2019 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung