>Leider leider übersteigt das mal wieder meine programmierkenntnisse... wisst ihr wie ich das mit den vorhandenen Skripten gut umsetzen kann?
func Initialize()
{
// rufe die Effektfunktion in diesem Objekt alle fünf Frames auf
AddEffect("Radiate", this, 1, 5, this);
}
func FxRadiateTimer(pTarget, iEffectNumber, iTime)
{
var maximum_distance = 30;
// suche nach Zielen und mache denen dann Schaden je nachdem wie weit sie weg sind
for (var obj in FindObjects(Find_Distance(maximum_distance), Find_OCF(OCF_Alive)))
{
var distance = Distance(GetX(), GetY(), obj->GetX(), obj->GetY());
var distance_factor = 100 - (100 \* distance / maximum_distance); // in Prozent!
var damage = distance_factor * 50;
DoEnergy(-damage, obj, true);
}
}
>wie kommst du auf...
Fx
+ Effektname + Callbackname. Callbacks gibt es verschiedene: zB Fx\*Timer
, der in bestimmten Zeitabständen aufgerufen wird. Oder Fx\*Damage
, der aufgerufen wird wenn das Objekt Schaden nimmt. Oder Fx\*Stop
wenn der Effekt gelöscht wird. Da gibt es natuerlich noch viel mehr.Fx\*Timer
Callback bekommt zum Beispiel wie viel Zeit schon vergangen ist (iTime
) und dafür bekommt der Fx\*Damage
Callback, wie viel Schaden verursacht wurde.pTarget
. Das habe ich bei dir nicht gebraucht, weil das Ziel vom Effekt gleichzeitig das Objekt ist, in dem die Funktionen stehen.DoEnergy
sowas ranhängen:AddEffect("Sparkle", obj, 1, 30, 0, GetID());
func FxSparkleTimer(pTarget, iEffectNumber, iTime)
{
if (iTime > 36 * 10) return -1;
pTarget->CastParticles("PxSpark", 30, 50, 0, 0, 10, 50, RGB(0, 100, 0), RGB(100, 255, 100));
}
iTime
zählt in Frames. Eine Sekunde hat etwa 36 Frames.Fx\*Timer
Funktion -1
zurückgibt, wird der Effekt entferntAddEffect
als Ort wo der Effekt definiert ist eine Definition GetID
angegeben und kein Objekt. Der Unterschied ist etwas feiner und schwerer zu erklären - aber das ist keine schlechte Idee, wenn man den Effekt an ein anderes Objekt ranklatscht.>hmm.. ich bin mir fast sicher, das das so nicht funktioniert... es wird ja nirgends gesagt, dass es einen Clonk treffen soll... Demnach werden evlt auch andere Lebewesen (tiere) die durch den Schadensradius getroffen werden "aua" sagen? Wobei vermutlich selbst das mit >der jetzigen Funktion nicht funktioniert :D
Fx\*Damage
wird aufgerufen, wenn das Objekt Schaden nimmt, nicht wenn es ihn verteilt. Also müsste das dann in deinem Fall auf dem Clonk drauf sein.DoEnergy
klatschen:if (Random(10) == 0) Sound("Aua*");
Random(x)
zieht eine Zufallszahl zwischen 0
und x-1
. Also hier würde bei so jedem zehnten Mal der Sound abgespielt werden.>vermutlich brauche ich hier auch eine Schleife, wie du es bei der Schadensverteilung gemacht hast... aber warum eigentlich? Deine Funktion wird doch alle 5 Frames aufgerufen, also wieso braucht man da noch eine schelife?
>sofort aufhören
CastParticles
natuerlich auch wieder in die Schleife übernehmen, die den Schaden macht, und pTarget
mit obj
tauschen.>Also muss ich das in einem appendto für clonks regeln? Und da dann einen Damage Effekt hinzufügen?
obj
ein Clonk ist. Ich glaube Clonks haben den Callback IsClonk()
.if (obj->~IsClonk()) Sound("Aua*");
>Wenn wir aber schon bei "Random" sind, es gibt 3 Sounds, Hurt1 bis Hurt3. Durch den Random Befehl könnte man dann ja z.b jedes 30te mal Sound 1 , sound 2 und sound 3 abspielen, super =)
Sound("Hurt*")
abspielen.
func Entrance(object container)
{
Message("Hui, ein %s hat mich eingesammelt! :D", container->GetName());
}
>dann kommt die Fehlermeldung:
obj->Message("Hi", ...)
statt Message("Hi", obj, ...)
.>Jetzt muss es nur noch wieder angehen, wenn es wieder frei rumliegt... wie mache ich das?
Entrance
ist Ejection
Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill