Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

  • Autor

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

  • Antworten 85
  • Ansichten 13.5k
  • Erstellt
  • Letzte Antwort

Top-Poster in diesem Thema

Beliebteste Beiträge

  • thereisnospace
    thereisnospace

    Bevor du dich an ein solches Projekt setzt, solltest du das Konzept der OOP verinnerlicht haben. Alleine schon anhand deiner Fragen kann ich erkennen, dass du ansonsten schnell an deine Grenzen stößt.

  • 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 Do

  • Whiz-zarD
    Whiz-zarD

    Ich sehe das ähnlich, wie @Gottlike. Dein Kenntnisstand ist noch nicht so weit, um so ein Projekt anzugehen. Ich will nicht zu Nahe treten aber dir ist OOP offenbar immer noch nicht so wirklich klar.

Gepostete Bilder

  • Autor
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

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

  • Autor

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

  • Autor

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

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

  • Autor

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

  • Autor

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.