forked from LeenkxTeam/LNXSDK
118 lines
2.6 KiB
Haxe
118 lines
2.6 KiB
Haxe
|
package iron.object;
|
||
|
|
||
|
import iron.Scene;
|
||
|
import iron.data.Data;
|
||
|
import iron.data.SceneFormat;
|
||
|
import iron.system.Time;
|
||
|
|
||
|
@:allow(iron.Scene)
|
||
|
class Tilesheet {
|
||
|
|
||
|
public var tileX = 0.0; // Tile offset on tilesheet texture 0-1
|
||
|
public var tileY = 0.0;
|
||
|
|
||
|
public var raw: TTilesheetData;
|
||
|
public var action: TTilesheetAction = null;
|
||
|
var ready: Bool;
|
||
|
|
||
|
public var paused = false;
|
||
|
public var frame = 0;
|
||
|
var time = 0.0;
|
||
|
var onActionComplete: Void->Void = null;
|
||
|
|
||
|
public function new(sceneName: String, tilesheet_ref: String, tilesheet_action_ref: String) {
|
||
|
ready = false;
|
||
|
Data.getSceneRaw(sceneName, function(format: TSceneFormat) {
|
||
|
for (ts in format.tilesheet_datas) {
|
||
|
if (ts.name == tilesheet_ref) {
|
||
|
raw = ts;
|
||
|
Scene.active.tilesheets.push(this);
|
||
|
play(tilesheet_action_ref);
|
||
|
ready = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public function play(action_ref: String, onActionComplete: Void->Void = null) {
|
||
|
this.onActionComplete = onActionComplete;
|
||
|
for (a in raw.actions) {
|
||
|
if (a.name == action_ref) {
|
||
|
action = a;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
setFrame(action.start);
|
||
|
paused = false;
|
||
|
time = 0.0;
|
||
|
}
|
||
|
|
||
|
public function pause() {
|
||
|
paused = true;
|
||
|
}
|
||
|
|
||
|
public function resume() {
|
||
|
paused = false;
|
||
|
}
|
||
|
|
||
|
public function remove() {
|
||
|
Scene.active.tilesheets.remove(this);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the frame of the current active tilesheet action. Automatically un-pauses action.
|
||
|
* @param frame Frame offset with 0 as the first frame of the active action.
|
||
|
**/
|
||
|
public function setFrameOffset(frame: Int) {
|
||
|
setFrame(action.start + frame);
|
||
|
paused = false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the current frame.
|
||
|
* @return Frame offset with 0 as the first frame of the active action.
|
||
|
*/
|
||
|
public function getFrameOffset(): Int {
|
||
|
return frame - action.start;
|
||
|
}
|
||
|
|
||
|
function update() {
|
||
|
if (!ready || paused || action.start >= action.end) return;
|
||
|
|
||
|
time += Time.realDelta;
|
||
|
|
||
|
var frameTime = 1 / raw.framerate;
|
||
|
var framesToAdvance = 0;
|
||
|
|
||
|
// Check how many animation frames passed during the last render frame
|
||
|
// and catch up if required. The remaining `time` that couldn't fit in
|
||
|
// another animation frame will be used in the next `update()`.
|
||
|
while (time >= frameTime) {
|
||
|
time -= frameTime;
|
||
|
framesToAdvance++;
|
||
|
}
|
||
|
|
||
|
if (framesToAdvance != 0) {
|
||
|
setFrame(frame + framesToAdvance);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function setFrame(f: Int) {
|
||
|
frame = f;
|
||
|
|
||
|
// Action end
|
||
|
if (frame > action.end && action.start < action.end) {
|
||
|
if (onActionComplete != null) onActionComplete();
|
||
|
if (action.loop) setFrame(action.start);
|
||
|
else paused = true;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var tx = frame % raw.tilesx;
|
||
|
var ty = Std.int(frame / raw.tilesx);
|
||
|
tileX = tx * (1 / raw.tilesx);
|
||
|
tileY = ty * (1 / raw.tilesy);
|
||
|
}
|
||
|
}
|