HP-Balken an HP-Variable anpassen
Wie du den Balken an die HP-Variable anpasst? Ideal wäre es, wenn der Balken nicht mehrere Zustände hat, sondern wenn er je nach HP-Wert verschoben werden würde. Dabei wäre der Balken in der Reihenfolge ganz hinten angeordnet und darüber befände sich eine Art Schablone, die einen Teil abdeckt.
Um jetzt die x-Position des Balkenobjekts (rot) der Variable "health" anzupassen, brauchst du zunächst 4 Werte: den x-Wert des Balkens in maximaler Linksposition (ich nehme als Beispiel 200), den x-Wert des Balkens in maximaler Rechtsposition (Bsp. 400), den minimalen Healthwert (Bsp. 0) und den maximalen Healthwert (Bsp. 100).
Beispiel für das nötige Skript, was geloopt werden müsste (am besten als Function mit infinit starten):
Code: Select all
setnum(Balkenpos;2*[health])
setnum(Balkenpos;+200)
moveobj(Balken;[Balkenpos];+0;0)
Wie man aus den Health-Werten die zugehörigen x-Werte erhält, da kommt man dadurch drauf, so wie Schiman es schon mal angesprochen hatte, indem man sich einfach eine lineare Gleichung bastelt aus f(0)=200 und f(100)=400. Die Healthwerte sind die x-Werte und die x-Positionswerte sind die y-Werte, somit erhalten wir für jeden Healthwert den zugehörigen x-Positionswert.
f(x)=m*x+a
f(0)=m*0+a=200 --> a=200
f(100)=m*100+200=400 --> m=2
--> f(x)=2x+200
Die Werte müsstest du dann natürlich an die aus deinem Interface anpassen. Die +0 im
moveobj() steht übrigens dafür da, damit der y-Wert des Balkens unverändert bleibt.
HP-Balken flüssig verschieben
Was ich dir noch raten möchte, ist, wie du den Schaden an der Health flüssig darstellst. Angenommen die Health beträgt 70, und es werden -30 abgezogen, dann lege erstmal in der Variable [newhealth] fest, welchen neuen Wert die Health annehmen soll, am besten durch
Dann führst du in einer Function "Health -30", die infinit gestartet wird, nicht einfach
setnum(Health;-30) aus, sondern:
Code: Select all
setnum(Health;-1)
if_num(Health;0)
{
(* Game Over *)
stopfunction(Health -30)
}
if_num(Health;[newhealth])
{
(* nächste Kampfrunde, zum Beispiel setnum(round;+1) *)
stopfunction(Health-30)
}
Das
setnum(Health;-1) wird also so lange wiederholt , bis der Zielwert erreicht ist.
Bei jedem Durchgang der Function wird die Health und durch die gleichzeitig ablaufende Balken-Function von oben auch der Balken entsprechend reduziert. Da die Function 50-mal pro Sekunde abgearbeitet wird, ist die Animation der Balkenabnahme recht flott.
Hm... wenn man statt der Function "Health -30" ein ein Loop im Raumskript benutzt, kann man auch am Ende noch ein
wait() reinsetzen, um die Geschwindigkeit zu steuern (weil
wait() in Functions nicht funktioniert). Das Raum-Loop müsstest du dann nur mit einem Bool aktivieren/ deaktivieren, etwa so
Code: Select all
on(loop1)
{
if_bool(Health -30;true)
{
setnum(Health;-1)
if_num(Health;0)
{
(* Game Over *)
setbool(Health -30;false)
}
if_num(Health;[newhealth])
{
(* nächste Kampfrunde, zum Beispiel setnum(round;+1) *)
setbool(Health -30;false)
}
wait(0,1)
}
}
Entsprechend wie das
if_bool(Health -30;true) könntest du weitere Module einsetzen unter das
on(loop1) und dann mit Setzen des jeweiligen
setbool()s anschalten.
Das ist jetzt ein bisschen viel Aufwand für wenig Nutzen

Vielleicht machst du erstmal nur
setnum(Health;-30) und schaust dass die Balkenposition funktoniert
