Ein Forum, in dem sich neue Clonk Entwickler untereinander austauschen können.
 
StartseiteStartseite  PortalPortal  FAQFAQ  SuchenSuchen  AnmeldenAnmelden  MitgliederMitglieder  LoginLogin  

Austausch | 
 

 Scoreboard erstellen und verwenden

Vorheriges Thema anzeigen Nächstes Thema anzeigen Nach unten 
AutorNachricht
Toastbrot
Kadett
Kadett
avatar

Männlich Anmeldedatum : 10.03.09

BeitragThema: Scoreboard erstellen und verwenden   Mi Jul 01, 2009 10:45 pm

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 sind

Nun 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 Crying or Very sad


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


Zuletzt von Toastbrot am So Feb 21, 2010 7:56 pm bearbeitet; insgesamt 2-mal bearbeitet
Nach oben Nach unten
Benutzerprofil anzeigen
Wolfes
General
General
avatar

Männlich Alter : 22
Ort : :/
Anmeldedatum : 21.02.09

BeitragThema: Re: Scoreboard erstellen und verwenden   Do Jul 02, 2009 1:18 pm

Klasse^^ auch mit den Verlinkungen(zwar nicht soviele aber egal)
Nach oben Nach unten
Benutzerprofil anzeigen
Patta
Großadmiral
Großadmiral
avatar

Männlich Alter : 24
Anmeldedatum : 22.05.09

BeitragThema: Re: Scoreboard erstellen und verwenden   Do Jul 02, 2009 1:39 pm

könnte noh mal nütlich sein. Auch wenn snoch nicht fertig ist ^^
Nach oben Nach unten
Benutzerprofil anzeigen http://sites.google.com/site/clonkprojekte/star-wars
YoCed
Vizeadmiral
Vizeadmiral
avatar

Männlich Alter : 21
Ort : Rheine
Anmeldedatum : 23.05.09

BeitragThema: Re: Scoreboard erstellen und verwenden   So Jul 05, 2009 11:38 pm

Ich gehöre zwar eigentlich nicht in diesen Bereich, habe aber trotzdem alles verstanden, wirklich super tut! Wenn wir auf dem CCAN währen, gäbe es +3!! cheers cheers cheers
Nach oben Nach unten
Benutzerprofil anzeigen
Patta
Großadmiral
Großadmiral
avatar

Männlich Alter : 24
Anmeldedatum : 22.05.09

BeitragThema: Re: Scoreboard erstellen und verwenden   Mo Jul 06, 2009 12:00 am

ist bei mir genauso. Mein Breich ist das dann doch nicht wirklich. trotzdem gutes, Verständliches Tut.
Nach oben Nach unten
Benutzerprofil anzeigen http://sites.google.com/site/clonkprojekte/star-wars
der kleine boss
Vizeadmiral
Vizeadmiral
avatar

Männlich Alter : 22
Ort : In einem gaaaaanz kleinen Kaff in Austria
Anmeldedatum : 21.03.09

BeitragThema: Re: Scoreboard erstellen und verwenden   Sa Feb 20, 2010 4:19 pm

Gut erklärt, schön Farblich, einfach Klasse Very Happy
Nach oben Nach unten
Benutzerprofil anzeigen http://www.clonk.de
Umezawa
Feldmarschall
Feldmarschall


Männlich Alter : 23
Anmeldedatum : 30.12.08

BeitragThema: Re: Scoreboard erstellen und verwenden   Sa Feb 20, 2010 7:27 pm

Toastbrot schrieb:

Code:

//immer wenn ein Clonk stirbt
public func OnClonkDeath(object pClonk, int iKiller){
          //Kills erhöhen
          Global(iKiller)[0]++;

          //Kein Kill für Selbstmord
          if(iKiller==GetOwner(pClonk))return(1);
...
Müsste
Code:
Global(iKiller)[0]++;
nicht hinter
Code:
 if(iKiller==GetOwner(pClonk))return(1);
stehen?
Sonst wird der Kill doch trotzdem angerechnet, auch wenn er erst beim nächsten Aufruf angezeigt wird.
Nach oben Nach unten
Benutzerprofil anzeigen
Toastbrot
Kadett
Kadett
avatar

Männlich Anmeldedatum : 10.03.09

BeitragThema: Re: Scoreboard erstellen und verwenden   So Feb 21, 2010 7:56 pm

Stimmt habs ausgetauscht.
danke.
Nach oben Nach unten
Benutzerprofil anzeigen
Ralek
Clonk
Clonk


Männlich Anmeldedatum : 20.02.10

BeitragThema: Re: Scoreboard erstellen und verwenden   Fr Feb 26, 2010 7:09 pm

Wirklich sehr gut gemacht, ich hab's auf Anhieb kapiert.

Eine Sache hätt' ich aber noch:

Ich weiß nicht ob das schon so war als du dass hier reingestellt hast, bei mir ist es auf jeden Fall jetzt so und verursacht einen kleinen Bug:

Ein Clonk kann nicht nur von anderen Spielern oder sich selbst gekillt werden, sondern auch durch die "Natur" (Ersticken, von Fallenden Gegenständen erschlagen, durch Blitze entzündet...)
Dann wird als iKiller -1 angegeben. Das ist deinem Script aber egal und so wird Spieler -1 ein Kill hinzugerechnet.
Was passiert also? Statt des Teraflints stehen in der ersten Zeile nachher die Kills der Natur.
(Zumindest war das bei mir so)
Um das zu unterbinden reicht es, einfach zu deiner Bedingung, dass iKiller nicht der Besitzer des Clonks sein darf, noch hinzuzufügen dass iKiller auch nicht -1 sein darf.

Code:
if(iKiller==GetOwner(pClonk) || iKiller==-1) return(1);

Bei mir funktioniert's dann so, der Teraflint bleibt stehen und nur noch normale Spieler bekommen einen Kill.
Nach oben Nach unten
Benutzerprofil anzeigen
Gesponserte Inhalte




BeitragThema: Re: Scoreboard erstellen und verwenden   

Nach oben Nach unten
 
Scoreboard erstellen und verwenden
Vorheriges Thema anzeigen Nächstes Thema anzeigen Nach oben 
Seite 1 von 1
 Ähnliche Themen
-
» Fell erstellen mit der SP ->bitte unbedingt lesen!!!
» Layout erstellen (Video)
» Für was könnte man denn die RPG Funktion noch verwenden?
» Unterforen erstellen und auf Admin stellen
» Wie kann ich eine Umfrage erstellen ??

Befugnisse in diesem ForumSie können in diesem Forum nicht antworten
CNDG :: Fortgeschrittene :: Tutorials-
Gehe zu: