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);
 | 
						|
	}
 | 
						|
}
 |