parallax component

This commit is contained in:
feroult
2017-11-15 17:42:52 -02:00
parent a0e24f7a0a
commit ce6dcbf458

View File

@@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:math';
import 'dart:ui';
@@ -65,3 +66,81 @@ abstract class SpriteComponent extends PositionComponent {
update(double t) {}
}
class ParallaxComponent extends PositionComponent {
final BASE_SPEED = 30;
final LAYER_DELTA = 40;
List<Image> images = new List();
List<double> scrolls = new List();
Size size;
bool loaded = false;
ParallaxComponent(this.size, List<String> filenames) {
_load(filenames);
}
void _load(List<String> filenames) {
var futures =
filenames.fold(new List<Future>(), (List<Future> result, filename) {
result.add(Flame.images.load(filename).then((image) {
images.add(image);
scrolls.add(0.0);
}));
return result;
});
Future.wait(futures).then((r) {
loaded = true;
});
}
@override
void render(Canvas canvas) {
if (!loaded) {
return;
}
prepareCanvas(canvas);
_drawLayers(canvas);
}
void _drawLayers(Canvas canvas) {
images.asMap().forEach((index, image) {
var scroll = scrolls[index];
Rect leftRect =
new Rect.fromLTWH(0.0, 0.0, (1 - scroll) * size.width, size.height);
Rect rightRect = new Rect.fromLTWH(
(1 - scroll) * size.width, 0.0, scroll * size.width, size.height);
paintImage(
canvas: canvas,
image: image,
rect: leftRect,
fit: BoxFit.cover,
alignment: Alignment.centerRight);
paintImage(
canvas: canvas,
image: image,
rect: rightRect,
fit: BoxFit.cover,
alignment: Alignment.centerLeft);
});
}
@override
void update(double delta) {
if (!loaded) {
return;
}
for (var i = 0; i < scrolls.length; i++) {
var scroll = scrolls[i];
scroll += (BASE_SPEED + i * LAYER_DELTA) * delta / size.width;
if (scroll > 1) {
scroll = scroll % 1;
}
scrolls[i] = scroll;
}
}
}