>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 EjectionPowered by mwForum 2.29.7 © 1999-2015 Markus Wichitill