mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-12 02:19:49 +08:00
parallax component
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user