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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

01.07.2014, 17:05

Würde ich so allgemein nicht sagen.
Speichert man sich die Callbacks oder den Callback, ohne zu wissen, worauf er verweist: kein Problem
Speichert man sich ein Objekt einer definierten Schnittstelle, wovon eine Methode aufgerufen wird: auch kein Problem (in Java ist das bspw. erforderlich)
Nur ist das eben eine Lösung über Events und nicht über übliche Methoden-Aufrufe. In Java ist das wie du schon selbst sagst die einzig mögliche Lösung für Event-Patterns.
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]

12

02.07.2014, 23:04

Ich bin mir nicht sicher aber ich glaube das ich es geschafft habe Events richtig zu implementieren. Ich bitte die ScreenManager Class noch zu ignorieren das ist nur um eine Prototyp Implementierung handelt.

http://pastebin.com/AVg81P8v

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

13

03.07.2014, 09:44

Das Event sollte nicht ScreenChanged heißen, sondern bspw. ScreenFinished oder ScreenEnded. Ein Event wird immerhin nicht danach benannt, was danach passieren soll, sondern wann das Event auftritt. Bei einem Button hat man bspw. das Click-, Clicked- oder OnClick-Event, nicht aber WindowClosed, GameStarted oder DividedByZeroAndDestroyedTheUniverse.
Statt des selbst definierten Delegates kann man grundsätzlich auch Func<T> und Action<T> verwenden (in diesem Fall Action). Allerdings muss man in einem solchen Fall zwischen dem Code abwägen, der für die Delegate-Definition erforderlich ist und der Lesbarkeit durch den (hoffentlich) sprechenden Delegate-Namen.
Und eventuell wäre es ganz gut, wenn man sich bei Delegates für Events an denen orientiert, die im .Net-Framework an anderer Stelle bereits definiert sind. Dort wird bspw. ein Objekt erwartet, welches weitere Informationen über das Event beinhaltet, genauso wie das Objekt, von dem das Event ausgelöst wurde.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public override void Update(GameTime gameTime)
        {
            elapsedTime += gameTime.ElapsedGameTime.TotalSeconds;
 
            if(elapsedTime >= introDuration)
            {
                if(ScreenChanged != null)
                OnIntroEnd();
            }
        }
 
        protected void OnIntroEnd()
        {
            elapsedTime = 0;
            ScreenChanged();
        }
Gibt es einen Grund, warum in der Update Methode geprüft wird, ob Event-Handler vorhanden sind? Diese Prüfung sollte nicht dafür relevant sein, ob das Intro nun beendet wurde oder nicht. Auch wenn sich niemand für das Ende interessiert, wurde das Intro abgeschlossen. (-> Bedingung in die Methode OnIntroEnd verlagern).

Gibt es einen Grund dafür, warum GameScreen eine abstrakte Klasse und keine Schnittstelle ist?
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

14

03.07.2014, 10:14

Du bist zu spät, Sacaldur. Haben wir alles schon im Chat besprochen und auf eine vernünftige Basis gezogen ;)
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]

15

03.07.2014, 10:43

Das Event sollte nicht ScreenChanged heißen, sondern bspw. ScreenFinished oder ScreenEnded. Ein Event wird immerhin nicht danach benannt, was danach passieren soll, sondern wann das Event auftritt. Bei einem Button hat man bspw. das Click-, Clicked- oder OnClick-Event, nicht aber WindowClosed, GameStarted oder DividedByZeroAndDestroyedTheUniverse.
Statt des selbst definierten Delegates kann man grundsätzlich auch Func<T> und Action<T> verwenden (in diesem Fall Action). Allerdings muss man in einem solchen Fall zwischen dem Code abwägen, der für die Delegate-Definition erforderlich ist und der Lesbarkeit durch den (hoffentlich) sprechenden Delegate-Namen.
Und eventuell wäre es ganz gut, wenn man sich bei Delegates für Events an denen orientiert, die im .Net-Framework an anderer Stelle bereits definiert sind. Dort wird bspw. ein Objekt erwartet, welches weitere Informationen über das Event beinhaltet, genauso wie das Objekt, von dem das Event ausgelöst wurde.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public override void Update(GameTime gameTime)
        {
            elapsedTime += gameTime.ElapsedGameTime.TotalSeconds;
 
            if(elapsedTime >= introDuration)
            {
                if(ScreenChanged != null)
                OnIntroEnd();
            }
        }
 
        protected void OnIntroEnd()
        {
            elapsedTime = 0;
            ScreenChanged();
        }
Gibt es einen Grund, warum in der Update Methode geprüft wird, ob Event-Handler vorhanden sind? Diese Prüfung sollte nicht dafür relevant sein, ob das Intro nun beendet wurde oder nicht. Auch wenn sich niemand für das Ende interessiert, wurde das Intro abgeschlossen. (-> Bedingung in die Methode OnIntroEnd verlagern).

Gibt es einen Grund dafür, warum GameScreen eine abstrakte Klasse und keine Schnittstelle ist?



BlueCobold war so freundlich mir im Chat unter die Arme zu greifen und jetzt funktioniert alles wie es soll. Ihr habt beide ca. das gleiche kritisiert.

Vielen dank euch beiden.

Grüße

WhySoSad

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

16

03.07.2014, 10:54

Du bist zu spät, Sacaldur. Haben wir alles schon im Chat besprochen und auf eine vernünftige Basis gezogen ;)
D=
Aber zu meiner Ausre... ähhhh Verteidigung: das konnte ich ja natürlich nicht wissen... ^^
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

17

03.07.2014, 10:59

Ist ja auch nicht schlecht es für die Nachwelt dokumentiert zu haben.
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]

Werbeanzeige