Möchte man dass Lara bei einer Berührung mit einem bestimmten Moveable Slot verletzt wird kann man dieses Script benutzen.
Man muss nur die Slot ID des Moveables angeben (siehe WadTool) -> in meinen Fall ist es die ID 1208:
Dann kann man mit dem Ändern der Variable healthpointsLostPerFrame festlegen wieviel Schaden Lara pro Berührung (je Frame) verlieren soll.
In unserem Fall soll Lara Schaden erhalten wenn sie ein Objekt vom Typ ANIMATING9 (ID 1208) berührt.
Ändert bitte den Inhalt von
auf euren Slot ab, weitere Slots könnt ihr so hinzufügen:
Weiterhin könnt ihr euren Schaden den ihr pro Berührung (je Frame) Lara schadet hiermit anpassen:
local healthpointsLostPerFrame = 5
Die 5 sagt aus, dass Lara pro Berührung 5 HP verliert (bzw. jeden Frame).
Hier ist das vollständige Script, baut es in eure Level.lua ein:
1 Script
LevelFuncs.OnStart = function()
SetCollideWithItems()
end
LevelFuncs.__Collided = function(obj1, obj2)
local healthpointsLostPerFrame = 5
if obj2:GetObjectID() ~= ObjID.LARA then
return
end
PlaySound(31,obj2:GetPosition())
EmitBlood((obj2:GetJointPosition(math.random(0,14))),20)
obj2:SetHP(obj2:GetHP() - healthpointsLostPerFrame)
end
function SetCollideWithItems()
local moveableSlots = {
1208 --'ANIMATING9'
}
for index, moveableSlot in pairs(moveableSlots) do
local moveables = GetMoveablesBySlot(moveableSlot)
for index, moveable in pairs(moveables) do
moveable:SetOnCollidedWithObject(LevelFuncs.__Collided)
end
end
end
Display More
2 Erklärung
In der OnStart Funktion definieren wir dass die Funktion SetCollideWithItems beim Start des Level getriggert wird.
In dieser Funktion legen wir die Moveable Slots fest:
Möchte man mehrere Slots benutzen so kann man den Table einfach ergänzen:
Danach werden über die For Schleifen alle Objekte der angegeben Slots geholt und die Funktion wird für jedes einzelne Objekt aufgerufen:
moveable:SetOnCollidedWithObject(LevelFuncs.__Collided)
Was macht diese Funktion? Sie ist etwas schwerer zu verstehen.
Die Funktion setzt für jedes einzelne "moveable" eine sogenannte "Callback Funktion" wenn dieses Objekt mit einem anderem Objekt kollidiert.
Callback Funktionen sind wie "Events" die gesetzt werden. Jedes mal wenn im Spiel etwas passiert (in dem Fall, "moveable" kollidiert mit einem anderen Objekt) wird die Callback Funktion (in dem Fall LevelFuncs.__Collided) aufgerufen.
Diese Callback Funktion erwartet immer zwei Parameter obj1, obj2:
obj1 enthält das Objekt was ihr übergeben habt - in dem Fall das ANIMATING9 und obj2 enthält das "andere" Objekt - und das kann im Verlauf also im Spiel, immer ein anderes sein. Zb. Ein Gegner, oder Lara, oder oder oder.
obj1 ist daher IMMER fest definiert (das Objekt was ihr vor der Funktion SetOnCollidedWithObject definiert, in unserem Fall die Variable "moveable" welches eben ein Objekt des Slots 1208 enthält (ANIMATING9)
obj2 enthält das Objekt, welches gerade im Spiel mit dem obj1 kollidiert ist, und kann daher je Aufruf ein anderes Objekt enthalten.
Und genau deswegen fragen wir auch ab, ob es NICHT unsere Lara ist, denn wenn nicht, soll nix mehr passieren:
Wenn es Lara ist, wird der Code weiter ausgeführt und es wird ein Sound (LARA_INJURY) abgespielt, es wird Blut imitiert und die HP wird von Lara (in dem Fall obj2) abgezogen:
PlaySound(31,obj2:GetPosition())
EmitBlood((obj2:GetJointPosition(math.random(0,14))),20)
obj2:SetHP(obj2:GetHP() - healthpointsLostPerFrame)
Umbennung der Variablen oder Funktionsnamen
Die Variablen obj1 und obj2 können auch gerne umbenannt werden, das ist gar kein Problem! Die Callback Funktion __Collided erwartet nur genau 2 Parameter, wie diese heißen, ist komplett euch überlassen! Das bedeutet: Statt obj1 und obj2 könnt ihr auch a und b, oder CollideObjectReceiver und CollideObjectWith nehmen, oder sonst Namen die euch einfallen. Euer Phantasie sind da keine Grenzen gesetzt.
Apropos - ihr könnt die Callback Funktion natürlich auch nach belieben umbenennen, ihr müsst diese nur an beiden Stellen ändern. In der Funktionsdefinition LevelFuncs.__Collided = function(obj1, obj2) und im Funktionsaufruf moveable:SetOnCollidedWithObject(LevelFuncs.__Collided)
Das wars im Prinzip. Viel Spaß beim Ausprobieren!
Ihr könnt natürlich auch andere lustige Dinge in der Callback Funktion ausprobieren.
Wie zb. das Explodieren von dem Objekt welches Lara berührt. (oder oder oder..., probiert einfach was aus)
Das würde zb. so gehen:
Nützliche Sound Infos:
Möchtet ihr nicht, dass der Sound mit der ID 31 immer jeden Frame neu abgespielt wird, (was sich tatsächlich falsch anhört) könnt ihr dazu folgende Einstellung im SoundTool vornehmen:
Mode "One shot wait": Dadurch überprüft die Engine, ob der Ton bereits in einem 1-Square-Radius abgespielt wird. Wenn ja, wird er nicht erneut abgespielt.
Achtet auch darauf dass die "Chance" in den Sound Settings im SoundTool einen Einfluss hat wie oft der Ton abgespielt wird. (Wenn die Chance nicht bei 100 liegt, wird der Sound bei einer kurzen Berührung evtl. nicht abgespielt!)
Es gibt noch andere Modes:
Mode "One shot rewound":
Bedeutet, dass der aktuell abgespielte Ton beim Starten des neuen Tons gestoppt wird, wenn er bereits in einem Radius von 1 Quadrat abgespielt wird
Mode "Loop":
Im Loop-Modus wird die Wiedergabe so lange fortgesetzt, bis der Ton nicht mehr ausgelöst wird (d. h. wenn er bei jedem Frame ausgelöst wird, wird er wiederholt, anstatt erneut ausgelöst zu werden damit es keine Ohrenschmerzen gibt ).
Auf diese Weise kann man einen sich wiederholenden Ton erzeugen, während sich Objekte berühren. Dies kann beispielsweise bei Elektrizitätsgeräuschen praktisch sein.