package arm; import iron.object.Object; import iron.object.Animation; import iron.Trait; import iron.system.Input; import iron.math.Vec4; import iron.math.Quat; class Character extends Trait { var currentAction:String; var animation:Animation; var speed = 0.0; var loc:Vec4 = new Vec4(); var lastLoc:Vec4 = null; var framesIdle = 0; // Number of frames character did not move @:prop var actionIdle:String = "idle"; @:prop var actionMove:String = "run"; public function new() { super(); currentAction = actionIdle; notifyOnInit(init); } function init() { animation = object.animation; // Try first child if we are running from armature if (animation == null) { if(object.children.length > 0) { animation = object.children[0].animation; } } if (animation == null) return; notifyOnUpdate(update); } function update() { // Get current position var tr = object.transform; loc.set(tr.worldx(), tr.worldy(), tr.worldz()); // Set previous position to current position if there is no previous position if (lastLoc == null) lastLoc = new Vec4(loc.x, loc.y, loc.z); // Check if character moved compared from last position speed = Vec4.distance(loc, lastLoc); // Update previous position to current position // in preparation for next check lastLoc.setFrom(loc); if (speed == 0) framesIdle++; else framesIdle = 0; // If state is idle and character is in movement, play move walk animation if (currentAction == actionIdle && framesIdle == 0) { currentAction = actionMove; if (actionMove != null) animation.play(actionMove); } // Otherwise if state is walking and character is idle, play idle animation else if (currentAction == actionMove && framesIdle > 2) { currentAction = actionIdle; if (actionIdle != null) animation.play(actionIdle); } } }