Eventfunktionen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Eventfunktionen

      Es ist 2016, und noch immer gibt es keine gescheiten Hilfen für Anfänger in die zauberhafte Welt des Teeworlds-developements einzusteigen.

      Ich denke, wer seine ersten kleinen Modifikationen schreiben will, wird in den meißten Fällen zuerst Code in Eventfunktionen hinzufügen um einen einigermaßen sinnvollen Spieltyp zu erschaffen, der nicht aus komplett overpowerten Waffen und bescheuerten Änderungen an der Physik des Spiels besteht.

      Also, was sind Eventfunktionen?
      Nun, das ist eigentlich relativ simpel. Eine Eventfunktion ist eine Funktion, die immer aufgerufen wird, wenn ein bestimmtes Ereignis (=Event) eintritt. Beispielsweise könnte das eine Funktion sein, die immer aufgerufen wird, wenn ein Spieler stirbt. Oftmals bekommt man noch gleich einige Informationen als Parameter mitgeliefert, ansonsten kann man sich zusätzlich an den Klassen eigenen Attributen bedienen.
      Um bestimmte Ereignisse einer Funktion zuzuordnen gibt es diesen Thread, auch wenn ich natürlich nicht alle Events abdecken kann, sondern hier nur auf einige Beispiele eingehen möchte, da man sich erfahrungsgemäß relativ schnell alleine in der Source zurecht findet, daher ist das hier auch nur für Anfänger geeignet.

      Ihr findet hier die Eventfunktionen, die ich für das erstellen von einfachen Modifikationen am wichtigsten halte und die ich in meiner Anfangszeit am häufigsten gebraucht habe. Natürlich reicht das Wissen hier nicht aus, um komplette Spieltypen zu erstellen, aber es ist nach meinem Erachten ein guter Einstiegspunkt.

      Also gut, fangen wir mit einer Funktion an, die ich besonders herausheben möchte, da sie in vielen Klassen vorkommt und sehr häufig Verwendung findet.

      Tick() bzw. OnTick()
      Eine Funktion mit diesem Namen findet ihr in vielen Klassen. Sie wird (bei einem unmodifizierten Server aber auch bei fast allen modifizierten Servern) alle 20ms aufgerufen. Oftmals ist dies die Kernfunktion der Klasse, da in den Ticks das eigentliche Spiel stattfindet, das ist ein bisschen schwer zu erklären, aber grob und ungenau formuliert "kann nur alle 20ms etwas passieren".
      Und was kann ich jetzt damit anfangen? Naja, die Tick()-Funktionen eignen sich zum Beispiel hervorragend um Dinge zu bestimmten Zeiten passieren zu lassen (ein super Tutorial dazu gibt es hier: teeworlds-friends.de/index.php?page=Thread&threadID=4328) oder Abfragen zu machen die nun mal "jederzeit" gemacht werden müssen, damit meine ich zum Beispiel ob ein Spieler ein bestimmtes Tile berührt oder Ähnliches.

      OnCharacterDeath()
      Siehe IGameController Klasse, gamecontroller.cpp.
      Wird aufgerufen wenn ein CCharacter Entity, sprich ein Tee, stirbt. Als Argumente bekommen wir den CCharacter des Getöteten und den CPlayer des Mörders sowie die Waffe, mit der der Kill erzielt wurde.
      In dieser Funktion wird nahe liegender Weise das scoring gemacht, in einer Modifikation könnte man hier zum Beispiel Kills speichern oder Belohnungen/Strafen verteilen.

      OnCharacterSpawn()
      Siehe IGameController Klasse, gamecontroller.cpp.
      Aufruf, wenn ein CCharacter spawnt. Das mitgelieferte Argument gibt uns den spawnenden CCharacter, hier kann man beispielsweise das Leben oder Armor bestimmten wenn ein Tee spawnt. Auch die Anfangswaffen werden hier bestimmt.

      OnPlayerConnect() / OnPlayerDisconnect()
      Siehe IGameController Klasse, gamecontroller.cpp.
      Auch hier gibts als Argument den Pointer auf den betreffenden CPlayer.
      In Modifikationen könnte hier das Speichern/Laden von saves stattfinden, generell ist hier viel denkbar.

      OnMessage()
      Siehe CGameContext Klasse, gamecontext.cpp.
      Eine wichtige Funktion. Hier kann man zum Bespielt Chatnachrichten oder votes abfangen und ausswerten, um etwa ein Command-System zu programmieren, ein zwar nicht ganz optimales aber funktionsfähiges Tutorial gibt es ebenfalls hier im Forum.

      FireWeapon()
      Siehe CCharacter Klasse, character.cpp.
      Wird ausgeführt wenn der Spieler feuert. Zu beachten ist, dass diese Funktion sich direkt in der CCharacter Klasse befindet, ihr also während das Objekt aus der Klasse erzeugt ist auf alle Attribute zugreifen könnt, dies schließt den zum Character zugehörigen Player mit ein (m_pPlayer).
      In der Funktion bietet es sich an, kleinere, interessante Veränderungen an der Waffenphysik vorzunehmen, da hier die Erzeugung der Projektile stattfindet.

      TakeDamage()
      Siehe CCharacter Klasse, character.cpp
      Diese Funktion wird aufgerufen, wenn der CCharacter Schaden erleidet.
      Nützlich ist diese Funktion wenn ihr beeinflussen wollt, wer wem Schaden zufügen kann oder wann jemand stirbt, man könnte hier für eine einfache instagib mod den CCharacter einfach sofort sterben lassen, egal wie klein der Schaden ist (und die Indikatoren entfernen).

      Sucht ihr nach einem bestimmten Event, zögert nicht, mich hier zu Fragen.

      Viel Spaß beim wursten,
      metzgerlin
      1338 - the next level
    • Moinsen,

      ein sehr nettes Einsteigertutorial, allerdings würde ich gerne nochmal eine etwas genauere Erklärung eines Gameticks folgen lassen.

      Eine nette Erklärung findet man auf "http://minecraft-de.gamepedia.com/Tick", einem Minecraftwiki wo das etwas genauer erklärt wird (auch wenn sich einige Sachen im Vergleich zu Teeworlds unterscheiden).

      Für alle Faulen, hier die wichtigste Zusammenfassung :

      Im Gegensatz zu einem rundenbasierten Computerspiel, bei dem der
      Spielverlauf durch das Beenden einer Spielrunde voranschreitet,
      schreitet er bei einem Tick-basierten Computerspiel in immer gleichen
      Zeitintervallen voran, den Ticks. In jedem Tick werden automatisch
      bestimmte Aktionen ausgelöst.
      In jedem Tick schreitet das Spiel etwas weiter voran: bewegliche Objekte ändern ihre Position, Kreaturen prüfen ihre Umgebung und passen ihr Verhalten an, Gesundheit und Hunger werden durch die Spieler-Umgebung beeinflusst etc.
      Weiterhin sei noch gesagt, dass man aufpassen muss keine blockierenden Funktionen in die Tickfunktion einzubauen (dies betrifft Sleepfunktionen, Wartefunktionen sowie Schleifen die eine lange Abarbeitung erfordern) da sonst das Spiel quasi anhält.

      Und ja, das heißt auch dass sämtliche Bewegungen in Teeworlds zeitdiskret ablaufen aber aufgrund der Tickgeschwindigkeit + Prediction kontinuierlich wirken.

      Gruß,
      FuroS