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?