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

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

11

26.01.2014, 19:23

Also überleg mal was du für Möglichkeiten damit hast.
Wenn du eine abstrakte Basisklasse für die Events hast, kannst du beispielweise ganz einfach umsetzen, dass die KI alle 3 Sekunden einmal Springt(um es einfach zu halten). Dann kannst du sogar in Laufzeit die Steuerung von der KI auf den Spieler übergeben, ohne an der Klasse des zu steuernden Objektes etwas zu ändern. Zur Erstellung dieser Events kann das Pattern "Abstract Factory" einsetzen, sobald es ein paar mehr Events werden.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

12

26.01.2014, 19:43

Also der Link, den LetsGo gepostet hat, meint das ganze doch so:

Input Klasse liest erstmal gesamten Input ein(Raw input).
Input Klasse verarbeitet Input(Raw Input zu HighLevel Input).
Input Klasse sagt enstprechender Funktion was sie zu tun hat.


Bei der Verarbeitung, wird erstmal geprüft in welchem Status das Spiel, im Menü, Baumodus, nichts spezielles....
Danach wird dann die aktuell gedrückte Taste mit einer map öÄ verglichen.


Beispiel (Linke Maustaste gedrückt):

-Im Menü?
-Nein
-Ganz normal im Spiel?
-Ja
-Wurde ein Button vom UI angeklickt?
-Ja
-Dem UI sagen dass der Button geklickt wurde
-Nein
- Wurde ein anderes Object (Einheit,Gebäude,...) angeklickt?
-Ja
-Machen was dann passieren soll
-Nein
-nichts wurde angeklickt

Also gibt es eine Inputhandler Klasse, die den Input einliesst und interpretiert. Verstehe ich das soweit richtig?

PS.: Ich hoffe ich erkläre nicht zum umständlich, was ich meine^^

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

13

26.01.2014, 19:56

Menüs die nicht aufgerufen sind werden doch hoffentlich keine Tastenabfrage für dieses Menü machen?
Das Problem mit der Maus lässt sich einfach lösen. Das GUI erstellt ein Event, das auf den Mausklick reagiert und startet einen weiteres "virtuelles" Mausklickevent wenn nichts angeklickt wurde. Die Alternative wäre die Events zu Priorisieren. Die Blockierung eines Events durch ein anderes kommt aber recht selten vor, also ist die Reihenfolge meist egal. Ausserdem sind die Events, die gerade nicht genutzt werden sowieso abgeschaltet bzw. werden nicht abgefragt. Ich glaube also nicht, dass der Aufwand sich lohnen würde.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

14

26.01.2014, 20:10

Also meiner Meinung nach, werden manche Events durch andere ziemlich oft blockiert.
Als Beispiel folgendes Bild:

(Link)

Die "UI-Leisten" müssen dem normalen "Spielfeld" gegenüber priorisiert abgefragt werden und dieses je nach Situation blockieren.
Wenn ich zB auf die Schaltfläche der Hand drücke, muss blockiert werden dass ich den darunter versteckten Mauerabschnitt anklicke.

Ich hoffe du meintest das mit blockieren, nicht dass ich grade auf etwas falsches eingehe :D Das meine ich zumindest damit ;)


Gibt es in C++ bereits Möglichkeiten events zu benutzen (von der Sprache, nicht andere libraries) oder müsste ich mir einen eigenen Eventhandler bauen? Wenn ja, wie setzt man dies am besten um?


EDIT: in C# hatte ich vor längerer Zeit mal so etwas umgesetzt, leider kann ich mich da nicht mehr so wirklich dran erinnern. Das war ein Tutorial Code, der irgendwie mit Flugzeugen war...
Ich weiss noch, dass es relativ einfach mit ein paar Hilfsmitteln von C# ging, deswegen frage ich, ob es in C++ da schon Hilfsmittel gibt :)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

15

26.01.2014, 20:29

Die "UI-Leisten" müssen dem normalen "Spielfeld" gegenüber priorisiert abgefragt werden und dieses je nach Situation blockieren.
Wenn ich zB auf die Schaltfläche der Hand drücke, muss blockiert werden dass ich den darunter versteckten Mauerabschnitt anklicke.

Das ist doch nur ein Event und zwar der Mausklick. Würde ich nicht als "oft" bezeichnen.

Zitat

Gibt es in C++ bereits Möglichkeiten events zu benutzen (von der Sprache, nicht andere libraries) oder müsste ich mir einen eigenen Eventhandler bauen? Wenn ja, wie setzt man dies am besten um?

Ich denke es würde dir nicht schaden den Eventhandler selbst zu entwickeln.

@LetsGo: Über soetwas verfügt die SFML meines wissens nach nicht. Der Input kann über eine statische Methode und in der Eventschleife abgefragt werden. Man sollte schon zwischen Event und Input unterscheiden. Ein Event ist ja kein Tastendruck sondern wird durch diesen nur ausgelöst. Wenn er es richtig macht muss aber nicht unbedingt ein Tastendruck ein Auslöser sein.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »NachoMan« (26.01.2014, 20:35)


ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

16

26.01.2014, 20:31

Die SFML bietet "nur" möglichkeiten zum zeichnen und abspielen von Audio usw. SFML = Simple and Fast Multimedia Library.


Also würde ich mir einen Eventhandler bauen, bei dem jede Klasse bestimmte Methoden registrieren kann, die bei einem bestimmten Event (druck auf irgendeine Taste) ausgeführt werden?

Beispiele:
Beim Erstellen eines Buttons wird ein entsprechendes event im eventhandler registriert. bei Klick auf Button beende Spiel/Erstelle Einheit/Feuer!... .


Kennt jemand dazu ein gutes Beispiel in C++? Ich bin mir nicht sicher ob ich weiss wie ich das umsetzen würde.


EDIT(NachoMan war mal wieder schneller):
Also ich finde grade ein Klick ist schon oft. Aber ich denke darüber könnte man sich streiten und das bringt hier ja grade nichts ;)

Kannst du ein Beispiel/Tutorial für einen sehr kleinen Eventhandler nennen? Wie gesagt kann ich mir grade nicht so richtig vorstellen wie ich so etwas umsetzen kann.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

17

26.01.2014, 20:42

EDIT(NachoMan war mal wieder schneller):
Also ich finde grade ein Klick ist schon oft. Aber ich denke darüber könnte man sich streiten und das bringt hier ja grade nichts ;)

Um die Performance musst du dir bei einem Mausklick keine Gedanken machen. Selbst 10 mal pro Sekunde wäre nicht oft.

Es ging mir nicht darum wie oft dieses Event auftritt sondern wie häufig du dieses teure Feature für andere Arten von Events benötigen könntest.

Weißt du was virtuelle Methoden und Interfaces sind und kannst du damit umgehen? Wenn ja sollte diese Aufgabe für dich zu stämmen sein. Wenn nicht solltest du es lernen.
Einfach! und klein anfangen, testen, aufräumen, Features hinzufügen, testen, aufräumen, Features hinzufügen...
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »NachoMan« (26.01.2014, 20:48)


18

26.01.2014, 20:55

Schau dir mal Thor an.

MfG
Check

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

19

26.01.2014, 21:16

Vielleicht hilft dir etwas Pseudocode weiter:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Event
{
    virtual bool wasStarted();
    virtual bool wasStopped();
    virtual bool isActive();
    virtual bool update();
}

class KeyboardEvent : public Event
{
    Key key;
    bool isDown;
    bool hasNewStatus;

    KeyboardEvent(Eventmanager &eventmanager, Key key)
        :key(key), isDown(false), hasNewStatus(false)
    {
        eventManager.RegisterEvent(this);   
    }

    virtual bool wasStarted(){return isDown && hasNewStatus;}
    virtual bool wasStopped(){return !isDown && hasNewStatus;}
    virtual bool isActive(){return isDown}
    virtual void update(){
        bool newKeyStatus = Input.isKeyPressed(key);
        hasNewStatus = newKeyStatus != isDown;
        isDown = newKeyStatus;
    }
}

class Eventmanager
{
    Vector<Event*> allEvents;
    
    RegisterEvent(Event &event)
    {
        allEvents.push_back(&event);
    }

    Update()
    {
        foreach(Event *event in AllEvents)
        {
            event->update();
        }
    }
}

Das habe ich jetzt in 5 Minuten hingeklatscht und bitte denkt daran, dass es Pseudocode ist, nur minimale Features bietet und natürlich über keinerlei Optimierung verfügt. Es dürfte dir aber eine gute Grundlage bieten, bei der du ansetzen kannst.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (26.01.2014, 21:21)


ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

20

26.01.2014, 22:02

Danke, ja das hilft mir schon viel weiter :)

2 Probleme habe ich aber noch:

1. Die jeweilige Klasse(Keyboardevent oÄ) muss denke ich noch erweitert werden, denn bisher machen die events ja nichts. Mein Ansatz wäre dem ganzen einen Funktionszeiger und eine Bedingung zu übergeben. So, dass das Event beim Updaten auch noch prüft ob es jetzt true ist (zB durch den Druck auf eine Taste) und dann wenn dem so ist die Funktion auf die der Zeiger zeigt aufruft(zB ExitGame()).

2. Ich glaube ich gehe das ganze irgendwie grundsätzlich falsch an, weil ich habe, wenn ich das im kopf durchgehe, eine ziemlich grosse Zahl an events, weil für jeden Button und jede Möglichkeit müsste doch ein eigenes event registriert werden oder nicht?
- Je nach UI könnten alleine das UI schon ein nicht allzu kleiner 2 stelliger Betrag sein. Um bei dem RTS Beispiel zu bleiben: klicke ich auf eine figur, hat das UI je nach Spiel vielleicht 20 neue Buttons(baue Haus, Kirche, geh in einer anderen Formation, werte dich auf,was auch immer ...)
- das Menü (über Escape) hat mindestens 5 Buttons(beenden, speichern, laden, optionen, zurück zum Hauptmenü,....)
- jeder Hotkey je nach Situation
-...
-...


Ich denke wirklich ich habe ein komplett falsches "Bild" im Kopf. :dash:

Werbeanzeige