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

GameProggD3D

Frischling

  • »GameProggD3D« ist der Autor dieses Themas

Beiträge: 67

Wohnort: Walding

Beruf: Schüler

  • Private Nachricht senden

1

31.05.2012, 21:39

[C# Forms] Events aus eigener Klasse einbauen?

Hi,

Ich programmier grade (eine Art) 4 gewinnt in C# Windows Forms.
Ich hab mir ne eigene Klasse gemacht, die das ganze steuert (und solche Methoden wie "ZugMachen", "GewinnenPrüfen" "GewinnAuslösen" hat) und ne Punkteverwaltung durchführt.
In der Statusleiste der Form hab nen Label, wo ich gerne die Punkte anzeigen würde.
Dann hat sich das Problem gestellt, wie ich es aktualisiere.
Denn ich kann aus der Klasse selbst nicht auf die Steuerelemente der Forms-Anwendung zugreifen und hab in der Forms-Anwendung bisher keinen Ort, bei dem ich in der Forms-Anwendung etwas mache, zu dem Zeitpunkt, wenn jemand gewinnt (wo ich es ja aktualisieren will), da das alles die Klasse macht.

Da die Punkteanzahl frei aufrufbar ist (public), könnte ich einen Timer benutzen, aber die Möglichkeit find ich extrem dumm.
Ich könnts auch bei jedem Zug machen, da hab ich das Mouse_Click Event, aber das wär auch irgendwie schlecht (95% der Zeit ändert sich nichts).

Ich hab mir gedacht:
Kann ich ein Event in der Klasse definieren, die ich gemacht habe, dieses in der "GewinnAuslösen"-Funktion auslösen und bewirken, dass durch das Auslösen des Events etwas in der Forms-Klasse passiert (die ein Objekt der Spielklasse, wo das Event deklariert wird, enthält)?

Ich hab mich bei den ganzen Event-C#-Anleitungen nicht so recht ausgekannt, aber wie ich gesehen hab, greifen die niemals von außerhalb der Klasse, wo es definiert ist, auf ein Event zu (oder lassen es handeln).
Programmiere Zombie-Spiel mit nem Freund

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

31.05.2012, 21:48

Ich hab mir gedacht:
Kann ich ein Event in der Klasse definieren, die ich gemacht habe, dieses in der "GewinnAuslösen"-Funktion auslösen und bewirken, dass durch das Auslösen des Events etwas in der Forms-Klasse passiert (die ein Objekt der Spielklasse, wo das Event deklariert wird, enthält)?

Ja, du kannst deiner Spielklasse ein Event geben das du dann eben entsprechend auslöst:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Game
{
  ...

  public delegate void ScoreChangedDelegate(int score);

  public event ScoreChangedDelegate ScoreChanged;  // dein event

  ...

  void bla()
  {
    ScoreChanged(10000);  // event auslösen
  }

}


An das Event kannst du dann jede Methode dranhängen, die einen int nimmt und nichts returned.

GameProggD3D

Frischling

  • »GameProggD3D« ist der Autor dieses Themas

Beiträge: 67

Wohnort: Walding

Beruf: Schüler

  • Private Nachricht senden

3

31.05.2012, 22:03

Das ist schon mal sehr hilfreich, danke, was ich jetzt noch wissen müsste, ist:
Wie kann ich einem Event eine Methode zuweisen? ?(
Programmiere Zombie-Spiel mit nem Freund

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

31.05.2012, 22:11

Ganz einfach:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Blub
{
  ...

  void ScoreCallback(int score)
  {
    // wird aufgerufen wenn der score sich ändert
  }

  void bla()
  {
    my_game.ScoreChanged += ScoreCallback;
  }
}


Das sollte aber eigentlich in jedem C# Grundlagenbuch erklärt werden ;)

GameProggD3D

Frischling

  • »GameProggD3D« ist der Autor dieses Themas

Beiträge: 67

Wohnort: Walding

Beruf: Schüler

  • Private Nachricht senden

5

01.06.2012, 08:36

So eins muss ich mir unbedingt mal kaufen :P

Wir lernen C# nämlich bloß in der Schule, da lernt man weniger als in nem Grundlagenbuch ;)
Programmiere Zombie-Spiel mit nem Freund

Union_Freedom

Treue Seele

Beiträge: 156

Wohnort: Nähe Hannover

Beruf: Student

  • Private Nachricht senden

6

01.06.2012, 10:13

Vielleicht noch eine Ergänzung:

Statt jedes mal einen Delegaten zu definieren, kannst du auch einfach "Action" nutzen.

Also statt

C#-Quelltext

1
2
3
  public delegate void ScoreChangedDelegate(int score);

  public event ScoreChangedDelegate ScoreChanged;  // dein event


Einfach

C#-Quelltext

1
public Action<int> ScoreChanged;  // Dein Event


Action bietet 18 (Wenn ich es richtig im Kopf habe) Überladungen. Also Action<Par1,Par2...> Und so weiter.

mfg
Union
Coder bei: http://crushing-gods.de/ (Folgt uns)
Erste Eindrücke zu Crushing Gods Link

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

01.06.2012, 10:38

Die Openbooks von Galileo Computing reichen vielleicht schon. Da kläre ich meistens meine C# Fragen.
Beispiel: Link
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

8

01.06.2012, 18:08

Hier ist vielleicht noch interessant das MS fuer delegates und events auch ne naming convention definiert.

Delegates sollten auf "Handler" enden, events auf "Event".

Werbeanzeige