Electric Froth

______ _ ______ ( / // _/_ o ( / _/_ / /-- // _ _, / _ , _, -/--_ __ / /_ (/____/(/_(/_(__(__/ (_(_(__ _/ / (_(_)(__/ /_

up

HaxePunk LinearTween Example

by Joel Kleier on 2012-10-29


Edit (2013-03-06): fixed signature for callback/event listener and move this to it's own post

HaxePunk Tweens

While exploring HaxePunk, I discovered that sometimes documentation can be a little lacking. So I just wanted to write this down for future reference:

Tweening is pretting simple. Each com.haxepunk.World and com.haxepunk.Entity is what is called a Tweener (com.haxepunk.Tweener).

There are already a bunch of different tweens in the com.haxepunk.tweens.* namespace.

Specifically, if you want to do motion, based on a path a character has to take, you can use the com.haxepunk.tweens.motion.LinearPath tween.

In the begin() method of an Entity you can do something like this:

#!haxe
// assuming _movetween is defined elsewhere in the class, and
// com.haxepunk.tweens.motion.LinearPath as been imported
_movetween = new LinearPath(tweenEnds);
_movetween.addPoint(this.x, this.y); // starting point
_movetween.addPoint(this.x+32, this.y); // left 32px
_movetween.addPoint(this.x+32, this.y-32); // left 32px, up 32px, ending point
_movetween.setMotion(0.5); // do this in .5 seconds
this.addTween(_movetween);

The tweenEnds parameter is just a reference to a function called when the tween ends:

#!haxe
function tweenEnds(event:Dynamic) {
    // set the final x/y values here since the update() method,
    // as detailed below, won't set the final variables since the IDLE
    // state is being started
    this.x = _movetween.x;
    this.y = _movetween.y;
    state = IDLE;
}

To call this, you just put something like the following in an Entities update() method:

#!haxe
if(startmoving) {
    state = MOVING;
    _movetween.start(); // reset the tween to the beginning and start running it
}
else {
    // the tween will contain the x and y values that are desired at a particular
    // point in time during the tween, and remember, you don't want to set the x
    // and y values immediately after calling start() on the tween -- it'll give
    // you a "hiccup" where your Entity moves to the final spot, then jumps
    // back and progresses allong the LinearPath.
    this.x = _movetween.x;
    this.y = _movetween.y;
}

Hopefully this has given a little insight for someone (like my future self) on how to use HaxePunk tweens.