Scoreboards machen jeden level gleich viel schöner und sind eigenlich auch recht simpel zu machen wie genau das geht und wie man es in Level einbaut erkläre ich euch jetzt.
Es gibt drei wichtige Funktion die ich in diesem Tutorial behandeln werde:
SetScoreboardData(int iRowID, int iColID, string sText, int iData)Diese Funktion ist natürlich dazu da die Daten die das Scoreboard anzeigen
soll einzugeben.
SortScoreboard(int iColID, bool fReverse)Auch sehr wichtig hiermit kann man die Scoreboardeinträge sortieren
sehr wichtig damit man immer den überblick hat wer erster ist.
DoScoreboardShow(int iChange, int iForPlr)Finde ich nicht so wichtig kann jeder auch mit TAB machen aber es
ist die einfachste der Funktion.
Im Laufe dieses Tutorials wird ein kleiner Scenarioscript entstehen der Relaunches
und Kills der Spieler im Scoreboard wiedergibt.
So jetzt wende ich mich zuerst einmal der Funktion SetScoreboardData zu.
- Code:
-
func Initialize(){
SetScoreboardData(SBRD_Caption,0,"{{EFLN}}");
SetScoreboardData(SBRD_Caption,1,"{{CLNK}}");
}
So wenn man jetzt das Scenario started und TAB drückt dann sieht man ein Scoreboard
in dem nebeneinander zwei bilder sind Tera-flint und Clonk.Diese zeichen stehen für
Kills und Relaunches(man hätte natürlich auch wipf und Fisch oder "Kills"und sonstwas nehmen können).
WICHTIG: Ein scoreboard ist immer dann mit TAB verfügbar wennn irgendwelche daten gesetzt sindNun das ganze etwas genauer:
Der erste Paramter von
SetScoreboardData ist die Zeile für die der Wert gesetzt werden soll (Man muss sich das Scoreboard wie ein level vorstellen in der du anstatt jedem pixel ein material jeder X/YPosition einen Wert zuweist
also gehören zu jedem Wert eine Zeile und eine Reihe wobei die Zählung der Reihen bei 0 beginnt und SBRD_Caption noch vor dieser 0 kommt und ormalerweise für die überschrift genommen wird)ser zweite ist dementsprechend die Spalte auch hier kann man SBRD_Caption als übershrift nehmen.
Erstmal eine Veranschaulichung:
Das scoreboard kann nach rechts und nach unten nach belieben erweitert werden.
So damit hätten wir schon mal ein erstes Scoreboard erschaffen allerdings kann man damit nicht viel anfangen denn es hat leider keine Aussagekraft
Neuer Code:
- Code:
-
//Initialize wie gehabt
func Initialize(){
SetScoreboardData(SBRD_Caption,0,"{{EFLN}}");
SetScoreboardData(SBRD_Caption,1,"{{CLNK}}");
}
//nun wird jeder Spieler beim beitritt ins Scoreboard eingefügt:
public func InitializePlayer(iPlr){
//Ein Array aus der Globalen mit dem Index des Spielers machen
Global(iPlr)=CreateArray(2);
//Relaunches auf 10 setzen
Global(iPlr)[1]=10;
//Name eintragen
SetScoreboardData(iPlr,SBRD_Caption,Format("%s",GetPlayerName(iPlr)));
//Kills auf 0 setzen
SetScoreboardData(iPlr,0,Format("%d",Global(iPlr)[0]),0);
//Relaunches müssen auch angezeigt
SetScoreboardData(iPlr,1,Format("%d",Global(iPlr)[1]),Global(iPlr)[1]);
}
Und dass Ergebnis:
So das war jetzt etwas komplizierter deshalb werde ich das noch mal schritt für schritt durchgehen:
Global(iPlr)=CreateArray(2);Hier wird einfach bei jedem Spielerbeitritt aus der Globalen mit dem Index des Spielers ein Array der länge 2 gemacht
sodass wir zwei Werte darin speichern können.Bei Fragen siehe
Doku oder wirf einen blick ins entsprechende
Tutorial hier auf dem CNDG.
Global(iPlr)[1]=10;Man nehme den zweiten eintrag(es fängt ja bei 0 an)und setze ihn auf die anzahl der Relaunches.
Die Kills müssen nicht festgelegt werden denn sie sind ja 0.
So und jetzt kommt der erst richtig interessante Teil:
SetScoreboardData(iPlr,0,Format("%d",Global(iPlr)[0]),0);Funktioniert eigenlich wie vorher nur nehmen wir als ZeilenIndex den Index des Spielers(iPlr) damit jeder Spieler seine eigene Zeile bekommt und als Spaltenindex die 0 es steht also unter dem Tera-flint. Als nächtes erwarted die Funktion einen String der in die Zeile geschrieben werden soll, da wir aber ein Zahl(die Anzahl der Kills)angeben wollen müssen wir uns hier der Funktion
Format bediehen die unsere Variable nämlich den ersten Wert des Global(iPlr) arrays in einen String schreibt.
Als vierten Paramter erwartet SetScoreboardData() einen Zusatzwert der nur zum Sortieren der Einträge gebraucht wird.
Hierfür nehmen wir ebenfalls den gleichen wert
Global(iPlr)[0] damit später auch wirklich nach den Kills sortiert wird.
SetScoreboardData(iPlr,1,Format("%d",Global(iPlr)[1]),Global(iPlr)[1]);Diese Zeile Funktioniert im Prinzip genau wie die vorherige Zeile nur das hier die zweite Variable und nicht
die erste des Arrays Global(iPlr) genommen wird .
Und weiter geht's:
- Code:
-
//immer wenn ein Clonk stirbt
public func OnClonkDeath(object pClonk, int iKiller){
//Kein Kill für Selbstmord
if(iKiller==GetOwner(pClonk))return(1);
//Kills erhöhen
Global(iKiller)[0]++;
//Punkte ins Scoreboard nach bewärtem System eintragen:
SetScoreboardData(iKiller,0,Format("%d",Global(iKiller)[0]),Global(iKiller)[0]);
//Scoreboard nach Kills Sortieren
SortScoreboard(0);
//Nachricht Ausgeben:
Log("%s von %s wurde von %s getöted",GetName(pClonk),GetPlayerName(GetOwner(pClonk)),GetPlayerName(iKiller));
}
So damit ist unser Scenarioscript wieder ein schönes stück größer und endlich wurde auch mal
SortScoreboard verwendet.
public func OnClonkDeath(object pClonk, int iKiller)OnClonkDeath ist ein
GameCall der immer dann aufgerufen wird wenn ein Clonk stirbt und zwei Paramter übergeben bekommt. Den Clonk der gestorben ist und den Spieler der dafür verantwortlich ist.
Global(iKiller)[0]++;Sehr simpel dem Spieler der den Clonk getöted hat wird einfach ein Killer dazugezählt.
SetScoreboardData(iKiller,0,Format("%d",Global(iKiller)[0]),0);Diese Zeile hatten wir eigentlich schon weiter oben es wird einfach das Scoreboard auf den neusten Stand gebracht.
SortScoreboard(0);Die neue Funktion macht nichts anderes als das Scoreboard nach den extradaten der Spalte mit dem Index des ersten Parameters von Sortscoreboard zu sortieren.Und dieser Wert ist bei uns immer gleich dem Wert der Kills des Spielers.
Es wird nach dem braun gefärbtem Abschnitt Sortiert:
SetScoreboardData(iKiller,0,Format("%d",Global(iKiller)[0]),Global(iKiller)[0]);Damit wäre das Kill-System geregeltaber es fehlt noch eine Relaunchregelung:
- Code:
-
public func RelaunchPlayer(int iPlr){
//Mal sehen ob er noch Relaunches hat:
if(Global(iPlr)[1]<1){RemovePlayer(iPlr);return(1);}
//wenn ja einen abziehen
Global(iPlr)[1]--;
//Spieler Relaunchen
var Clonk;
Clonk=CreateObject(CLNK,Random(LandscapeWidth()),40,iPlr);
MakeCrewMember(Clonk,iPlr);
SetCursor(iPlr,Clonk);
//Und nun das Scoreboard erneunern
SetScoreboardData(iPlr,1,Format("%d",Global(iPlr)[1]),Global(iPlr)[1]);
}
func RemovePlayer(iPlr){
return(1);
}
Und wieder mal schritt für schritt:
if(Global(iPlr)[1]<1)return(1);Prüfen ob der Spieler noch Relaunches hat wenn nicht return(1) bricht die Relaunchfunktion ab.In diesem Fall wird
auch die Funktion RemovePlayer() aufgerufen die bis jetzt noch keinen Sinn hat.
Global(iPlr)[1]--;Einen Relaunch abziehen.
SetScoreboardData(iPlr,1,Format("%d",Global(iPlr)[1]),Global(iPlr)[1]);Und hier werden wieder die Daten des Spielers im Scoreboard erneuert.
Diesmal muss nicht Sortiert werden weil wir nach Kills und nicht nach Realunches Sortieren.
So damit wäre der größte Teil geschaft es gibt jetzt noch einen kleinen schönheitsfehler auszubessern, wenn ein Spieler Eliminiert wurde muss er auch aus dem Scoreboard verschwinden und das kommt jetzt:
- Code:
-
public func RemovePlayer(int iPlr){
//Beide werte auf 0 setzen sorgt dafür das die Zeile verschwindet
SetScoreboardData(iPlr,0,0,0);
SetScoreboardData(iPlr,1,0,0);
}
Hierzu gibts es nicht viel zu sagen es werden einfach die Inhalte beider Spalten die zur Zeile des Spielers der Eliminiert worden ist auf 0 gesetzt wodurch dieser aus dem Scoreboard verschwindet.
Damit wäre mein zweites Tutorial fertig ich hoffe
es hat euch gefallen.
Viel Spass mit dem Scoreboard
Mit Freundlichen Grüßen Toastbrot