class FindBySize
{
constructor(width /*int*/, height /*int*/)
{
this.width = width;
this.height = height;
}
findPiece(skel /*SkeletalAnimationController*/, frame /*int*/)
{
var best = null;
var bestScore = null;
for (var piece of skel.pieces)
{
if (piece != null && piece.sequence[frame] != null)
{
//var piece = psData.piece.getBitmapInfo(skel);
var score = Math.abs(piece.w - this.width) + Math.abs(piece.h - this.height);
if (bestScore == null || score < bestScore)
{
best = piece;
bestScore = score;
}
}
}
return best;
}
}
class SkeletalAnimationPieceFollower extends Engine.Drawable
{
constructor()
{
super();
this.target = null;
this.finder = null;
this.lastFrame = -1;
this.lastSeq = -1;
}
init(target /*Drawable*/, finder /*PieceFinder*/)
{
this.target = target;
this.finder = finder;
this.lastFrame = -1;
this.lastSeq = -1;
if (this.target.loaded)
{
this.updatePiece(true);
}
else
{
this.target.onGraphicLoaded.addListener(this, this.targetLoaded);
}
Engine.EnterFrameManagerInstance.addPostFrame(this, this.postFrameUpdate);
}
targetLoaded(d /*Drawable*/)
{
d.onGraphicLoaded.removeListener(this, this.targetLoaded);
this.updatePiece(true);
}
updatePiece(force /*bool*/)
{
if (this.target == null || this.parent == null/* || !this.attachedToRoot*/) return;
var frame = this.target.frame; //currentFrame
var seq = this.target.getSequence();
if (force || frame != this.lastFrame || seq != this.lastSeq)
{
if (this.target.loaded)
{
var skel = this.target.skeletalController;//getSkelAnim();
if (skel != null)// && skel.currentSequence != null)
{
var best = this.finder.findPiece(skel, frame);
if (best != null)
{
var bestFrame = best.sequence[frame];
var pos = this.parent.globalToLocal(this.target.localToGlobal(parseFloat(bestFrame.tx), parseFloat(bestFrame.ty)));
this.setXYUnrounded(parseFloat(bestFrame.tx), parseFloat(bestFrame.ty));
this.scale.x = parseFloat(bestFrame.sx);
this.scale.y = parseFloat(bestFrame.sy);
this.rotationDegrees = parseFloat(bestFrame.rot) * -180.0 / Math.PI;
}
}
}
this.lastFrame = frame;
this.lastSeq = seq;
}
}
postFrameUpdate(timeElapsed /*float*/)
{
if (this.hasParent && this.target != null/* && this.attachedToRoot*/)
{
this.updatePiece(false);
this.manualAnimationUpdate();
}
}
clear()
{
if (this.target != null) this.target.onGraphicLoaded.removeListener(this, this.targetLoaded);
this.target = null;
this.finder = null;
Engine.EnterFrameManagerInstance.removePostFrame(this);
}
}