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

Codrix

Frischling

  • »Codrix« ist der Autor dieses Themas

Beiträge: 9

Wohnort: Neu-Ulm

Beruf: Softwareentwickler

  • Private Nachricht senden

1

08.12.2014, 20:50

C++ Klasse mit eigenen Events erstellen

Hallo Zusammen,
frische im Moment meine C++ Kenntnisse wieder auf. Dabei bin ich über mein aktuelles Problem gestossen...

Wie kann man in einer C++ klasse eigene Events erstellen?

einfaches beispiel:
Klasse Person
int leben = 100;

in Main soll in einer while das leben immer um 1 abgezogen werden...

wenn leben = 0 ist soll ein Event ausgelösst werden "Aua Tod"
was ich dann in der main funktion weiterverarbeiten kann... "Person begraben"...

ich hoffe ihr versteht wie ich es mein :)

Grüße
Tim

2

08.12.2014, 21:00

Google einfach mal nach "event handling" oder Ähnlichem. Z.B. http://www.gamedev.net/page/resources/_/…ling-in-c-r2459
Oft sollte man sich eventuell vorher überlegen, in wie fern man ein Eventsystem implementieren sollte und ob es überhaupt sinnvoll ist. Ist es für deine Anwendung wichtig, dass diese Person sofort begraben wird oder "erst" im nächsten Durchlauf? Gibt es mehrere verschiedene Events, für die es ebenso nützlich wäre so etwas einzubauen?
Sollte es nämlich bei 1-2 Pseudo-Events bleiben, ist ein ganzes Eventhandling-System vielleicht Overkill.

Codrix

Frischling

  • »Codrix« ist der Autor dieses Themas

Beiträge: 9

Wohnort: Neu-Ulm

Beruf: Softwareentwickler

  • Private Nachricht senden

3

08.12.2014, 21:07

ich stiess auf das problem bei der überlegung.

ich wüsste schon gerne was gerade in der klasse passiert. ich würde ungerne bei jedem durchlauf die klassen durchgehen und schauen ob sich da was geändert hat.

Meine Überlegung war dass mir die Klasse sagt was gerade sache ist... gerade am beispiel "Leben", das gilt ja so gesehen für alle Objekte, und wenn eines der objekte "halbtot" könnte man ja schon ein "Signal" bekommen. so "Moment mal hier ist gerade was los!..:" Dann kann ich im Programm darauf reagieren.
Es muss ja nicht "Leben" sein, kann ja alles möglich sein.

Gedacht war eine Person... die wird müde die wird alt die wird hungrig...und erst wenn ein Wert eine bestimmte erreicht hat, soll gehandlet werden.

ich weiss nur nicht wie das mit C++ funktioniert. Hab zwar heute einiges gegooglet aber das meiste war irgendwie verwirrend :D aber schau mir deinen link gleich mal an.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

4

08.12.2014, 21:08

Erstens: Du willst dann wohl leben nicht als public Feld haben, sondern einen Setter implementieren. Oder vielleicht auch eine NehmeSchaden-Methode.
Zweistens: Eine Möglichkeit so etwas umzusetzen -> http://de.wikipedia.org/wiki/Signal-Slot-Konzept
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Codrix

Frischling

  • »Codrix« ist der Autor dieses Themas

Beiträge: 9

Wohnort: Neu-Ulm

Beruf: Softwareentwickler

  • Private Nachricht senden

5

08.12.2014, 21:14

ja die variable ist nicht public.

danke für den link.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

6

08.12.2014, 21:28

"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

7

10.12.2014, 08:45

Hi,

schau dir mal die Implementierung von sf::Event (siehe SFML-Repository auf GitHub) an. Wenn du so eine Eventstruktur erzeugt hast (mit Event-Typen und -Daten), kannst du dann das vorgeschlagene Getter-Setter-Konzept nehmen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int Foo::getLife() const {
    return life;
}
void Foo::setLife(int new_life) {
    bool was_alive = (life > 0);
    life = new_lief;
    if (was_alive && life == 0) {
        // notify all listeners
        FooEvent event;
        event.type = FooEvent::Type::Death;
        event.object = this;
        notify(event);
    }
}


Dazu müsstest du natürlich vorher Listener bei Foo registrieren lassen - sie Antworten der anderen.

LG Glocke

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

8

10.12.2014, 09:43

@Sucker:
Vielleicht ist dieses ganze Event-Handling-System auch schon jetzt weit mehr als er bräuchte. Es kam ja bereits der Verweis auf das Observer-Pattern und ich denke mal, dass er eine in diese Richtung gehende Lösung benötigt. (Das erwähnte Signal-Slot-System dürfte eine mögliche Umsetzung dessen in C++ sein, auch wenn man dann keine Objekte mehr herumreicht.)

Ein Setter für die Anzahl der Lebenspunkte ist ziemlich unsinnig. Hat man später noch Attribute, die den erhaltenen Schaden verringern, müsste man an jeder aufrufenden Stelle diese Werte berücksichtigen. Kommen dann noch Elementarschäden (bzw. Schäden unterschiedlichen Typs) dazu, muss man entsprechenden Code wieder an jeder aufrufenden Stelle platzieren.
Abgesehen davon könnte man mit der derzeitigen Implementierung tote zum Leben erwecken (und wieder töten) oder die Lebensenergie auf einen Wert kleiner als 0 setzen, wodurch der Tod umgangen wird, mal ganz abgesehen davon, dass auch keine Obergrenze für die Lebensenergie definiert wurde.
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

9

10.12.2014, 11:06

Außer natürlich das "setLife" wird erst gerufen, nachdem der volle Schaden berechnet wurde inklusive aller Modifier ;)
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]

GlowDragon

Frischling

Beiträge: 66

Wohnort: Bayern

Beruf: Informatikstudent

  • Private Nachricht senden

10

11.12.2014, 14:39

Da der Wikipedia-Link hier gepostet wurde und das Thema passt, eine kleine Frage:

Zitat von »Wikipedia: Beobachter (Entwurfsmuster)«

Eine oder auch mehrere Komponenten stellen den Zustand eines Objektes grafisch dar. Sie kennen die gesamte Schnittstelle dieses Objektes. Ändert sich der Zustand des Objektes, müssen die Komponenten darüber informiert werden.
Verstehe ich richtig, dass z. B. die Klasse, welche die HUD zeichnet, die zum Zeichnen benötigten Informationen (Spielervariablen, etc.) extra speichern soll, um Kopplung zu verhindern? Und wenn ja, macht man das auch bei einem komplexem Inventar so?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »GlowDragon« (11.12.2014, 15:00)


Werbeanzeige