Aufgrund einer akuten Spamwelle ist das Editieren für nicht angemeldete Benutzer zur Zeit deaktiviert. Wir bitten um Verständnis.

Scripte:Lebensbalken

Aus Clonk Wiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Allgemein

Hier wird gezeigt, wie man sich einen eigenen Lebensbalken machen könnte. Dazu benötigen wir zuerst eine Graphik. Ich habe dazu einen roten Balken (100px x 10px) verwendet.

  Lebensbalken
Kategorie: Objekt
Autor: Feuermonster
Behandelt: {{{Behandelt}}}
Empfohlenes Vorwissen: {{{Vorwissen}}}
Benötigt Objektpacks: {{{Packs}}}
Stufe: Experte Experte Experte Experte






Voraussetzungen

Für den Lebensbalken benötigen wir ein Objekt mit richtig gesetzten Vertices sowie eine ActMap mit einer Aktion mit der Procedure "ATTACH".

In meinem Fall sieht DefCore wie folgt aus:

Width=100
Height=10
Offset=-50,-5
Vertices=1
VertexY=20
Timer=10
TimerCall=UpdateEnergy

Width und Height bestimmen Höhe und Breite. Offset ist der Mittelpunkt. Er wird relativ zum Nullpunkt (oben in der linken Ecke) angegeben. In unseren Fall ist er 50 Pixel vom linken Rand und 5 Pixel vom oberen Rand entfernt. Der Timer sorft dafür, dass die Funktion "UpdateEnergy" alle 10 Frames aufgerufen wird. Man könnte hier natürlich auch Effekte verwenden. Mit dem Fx*Damage-Callback müsste man damit nicht periodisch updaten, sondern effektiv nur dann, wenn der Clonk schaden erleidet.

Die ActMap sieht wie folgt aus:

[Action]
Name=Attach
Procedure=ATTACH
Facet=0,0,100,10

Facet ist hier auf 0,0 (Startpunkt) und 100,10 (Breite,Höhe) gesetzt. Diese Angaben sind wichtig, sonst wird keine Graphik angezeigt.

Code

C4Script
/*-- Lebensbalken --*/

#strict

local
 
pClonk;

protected
 
func
 
Initialize()
 
{
	
return(true);
}

public
 
func
 
SetClonk(object
 
pClnk)
 
{
	
if(!pClnk)
 
return(true);
  
//Diesen Clonk gibt es nicht, abbrechen.
	
if(!GetAlive(pClnk))
 
return(true);
  
//Dieser Clonk lebt nicht, abbrechen
	
SetAction("Attach",pClnk);
  
//Nun setzen wir die Aktion Attach.
	
pClonk
 
=
 
pClnk;
  
//den Clonk speichern
	
return(true);
}

public
 
func
 
UpdateEnergy()
 
{
	
if(!pClonk)
 
RemoveObject();
  
//Objekt ist nicht mehr da, dann weg mit uns
	
if(!GetAlive(pClonk))
 
RemoveObject();
 
//Clonk lebt nicht mehr, auch weg mit uns
	
var
 
iMaxEnergy
 
=
 
GetPhysical("Energy",0,pClonk)
 
/
 
1000;
 
//Die maximale Energy des Clonkes
	
var
 
iEnergy
 
=
 
GetEnergy(pClonk);
 
//die aktuelle Energy
	
var
 
iPercent
 
=
 
(iEnergy
 
*
 
100
 
/
 
iMaxEnergy)*10;
 
//den Prozentwert ausrechnen.
	
SetObjDrawTransform(iPercent,0,0,0,1000,0,this());
  
//Graphik verkleinern.
}

Erklärung

C4Script
SetAction("Attach",pClnk);

Damit setzen wir die Aktion des Objektes. In der ActMap haben wir sie Attach gennant. Wichtig ist jedoch die Procedure im Objekt. Die Proceduze "ATTACH" sorgt dafuer, dass ein Objekt einem anderen Objekt "folgt". Hier kommen die Vertices ins Spiel. Attach orientiert sich an den Vertices. In der DefCore haben wir "VertexY=20" gesetzt, damit erscheint unser Lebensbalken 20px ueber dem Offset (Mitte) des Clonkes.


C4Script
var
 
iMaxEnergy
 
=
 
GetPhysical("Energy",0,pClonk)
 
/
 
1000;

Schlauen Leuten wird aufgefallen sein, dass in der Physical-Section des Clonkes die Werte viel höher sind, als man mit GetEnergy() erhalten würde. Die Physicals sind immer mit dem Faktor 1000 multipliziert gespeichert. 1000 Energy entspricht 1. Damit wir also einen Wert haben, der zu GetEnergy() stimmt, müssen wir durch 1000 dividieren.

C4Script
var
 
iPercent
 
=
 
(iEnergy
 
*
 
100
 
/
 
iMaxEnergy)*10;

Clonk kann nicht von sich aus mit Kommazahlen rechnen. Deshalb multiplizieren wir den Energywert des Clonkes mit 100. Wenn iEnergy genau so gross ist, wie iMaxEnergy ergibt dies 100. 100 wie 100%. Das * 10 folgt im nächsten Abschnitt.


C4Script
SetObjDrawTransform(iPercent,0,0,0,1000,0,this());

Mit dieser Funktion kann man Graphiken transformieren (verzerren/strecken/rotieren). Die Parameter für diese Funktion sind:

SetObjDrawTransform (int iWidth, int iXSkew, int iXAdjust, int iYSkew, int iHeight, int iYAdjust, object pObj, int iOverlayID);

Ich behandele jedoch nur iWidth und iHeight. Sind diese auf 1000, wird die Graphik nicht verzerrt. (Sofern keine anderen Parameter gesetzt sind). Das erklärt, warum wir oben noch * 10 rechnen. Wenn wir iWidth auf 500 setzen, ist die Graphik nur noch halb so lang. Analog ist dies zu iHeight.

Weiteres

Beispieldatei

Scripte des Scripte-Projekts
AnfängerBonbon · Context-Eintrag · EliminateTeam · Flint:Partikelschleuder · Hüpfbonbon · TeamMessage
Fortgeschrittene FortgeschritteneFlint:HitCounter · Flint:Partikelkreis · Flint:Partikelschleuder2 · Is-Funktionen · Menü:Beim Start der Runde · Normaler Flint · Partikel-Linie in den Himmel · Rakete · Random · Relaunch · Return · Sichtweite · Spawn · Startposition
Profi Profi ProfiClantag · Gift-Effekt · Unverwundbarkeit · Scoreboard · Zufallsgespräch
Experte Experte Experte ExperteLebensbalken · Nachrichten bei Sichtkontakt · Object2Overlay · SHA1


Wipfhunt.png Dieser Artikel wurde gemäß der Scriptrichtlinien veröffentlicht.
extern