build method
override
Declares this node's children and behavior.
Runs once on mount, and again on every rebuild.
super.build() is required, as skipping it drops whatever the superclass
declared.
Implementation
@override
void build() {
super.build();
tick((dt) {
if (_finished) return;
final amount = dt * speed;
if (amount <= 0 || !amount.isFinite) return;
_elapsed += amount;
// Every pass re-reads the fields, so a handler calling play() redirects
// this loop instead of racing it.
while (true) {
final duration = _sprite.duration(_row, _frame);
if (duration <= 0 || !duration.isFinite) {
_elapsed = 0;
return;
}
if (_elapsed < duration) return;
_elapsed -= duration;
final next = _frame + 1;
if (next < _sprite.frames(_row)) {
_frame = next;
_source = null;
onFrame.emit(next);
} else if (loops) {
_frame = 0;
_source = null;
onFrame.emit(0);
onLoop.emit();
} else {
_elapsed = 0;
_finished = true;
onFinish.emit();
if (cleanup) {
detach();
}
return;
}
}
});
void painter(Canvas canvas, Paint paint) {
canvas.drawImageRect(
_sprite.image(_row),
_source ??= _sprite.rect(_row, _frame),
_destination ??= .fromLTWH(0, 0, width, height),
paint,
);
}
draw((canvas) {
palette.draw(canvas, painter);
});
debugDraw((canvas) {
canvas.drawRect(.fromLTWH(0, 0, width, height), DEBUG_TRANSFORM_PAINT);
});
}