mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-01 10:38:17 +08:00
Update flame_noise to use the latest version of fast_noise, basically replacing the Perlin-specific effect controller with a generic `NoiseEffectController` that can take in any noise class (leveraging the new Noise2 interface). Just update from `PerlinNoiseEffectController` to `NoiseEffectController` and provide the noise/parameters you want directly into the `noise` field. --------- Co-authored-by: Lukas Klingsbo <me@lukas.fyi>
177 lines
4.7 KiB
Dart
177 lines
4.7 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:flame/components.dart';
|
|
import 'package:flame/effects.dart';
|
|
import 'package:flame/game.dart';
|
|
import 'package:flame/geometry.dart';
|
|
import 'package:flame_noise/flame_noise.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
class MoveEffectExample extends FlameGame {
|
|
static const description = '''
|
|
Top square has `MoveEffect.to` effect that makes the component move along a
|
|
straight line back and forth. The effect uses a non-linear progression
|
|
curve, which makes the movement non-uniform.
|
|
|
|
The middle green square has a combination of two movement effects: a
|
|
`MoveEffect.to` and a `MoveEffect.by` which forces it to periodically jump.
|
|
|
|
The purple square executes a sequence of shake effects.
|
|
|
|
At the bottom there are 60 more components which demonstrate movement along
|
|
an arbitrary path using `MoveEffect.along`.
|
|
''';
|
|
|
|
MoveEffectExample()
|
|
: super(
|
|
camera: CameraComponent.withFixedResolution(
|
|
width: 400,
|
|
height: 600,
|
|
)..viewfinder.anchor = Anchor.topLeft,
|
|
world: _MoveEffectWorld(),
|
|
);
|
|
}
|
|
|
|
class _MoveEffectWorld extends World {
|
|
@override
|
|
void onLoad() {
|
|
final paint1 = Paint()
|
|
..style = PaintingStyle.stroke
|
|
..strokeWidth = 5.0
|
|
..color = Colors.deepOrange;
|
|
final paint2 = Paint()
|
|
..style = PaintingStyle.stroke
|
|
..strokeWidth = 5.0
|
|
..color = Colors.greenAccent;
|
|
final paint3 = Paint()..color = const Color(0xffb372dc);
|
|
|
|
// Red square, moving back and forth
|
|
add(
|
|
RectangleComponent.square(
|
|
position: Vector2(20, 50),
|
|
size: 20,
|
|
paint: paint1,
|
|
)..add(
|
|
MoveEffect.to(
|
|
Vector2(380, 50),
|
|
EffectController(
|
|
duration: 3,
|
|
reverseDuration: 3,
|
|
infinite: true,
|
|
curve: Curves.easeOut,
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
// Green square, moving and jumping
|
|
add(
|
|
RectangleComponent.square(
|
|
position: Vector2(20, 150),
|
|
size: 20,
|
|
paint: paint2,
|
|
)
|
|
..add(
|
|
MoveEffect.to(
|
|
Vector2(380, 150),
|
|
EffectController(
|
|
duration: 3,
|
|
reverseDuration: 3,
|
|
infinite: true,
|
|
),
|
|
),
|
|
)
|
|
..add(
|
|
MoveEffect.by(
|
|
Vector2(0, -50),
|
|
EffectController(
|
|
duration: 0.25,
|
|
reverseDuration: 0.25,
|
|
startDelay: 1,
|
|
atMinDuration: 2,
|
|
curve: Curves.ease,
|
|
infinite: true,
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
// Purple square, vibrating from two noise controllers.
|
|
add(
|
|
RectangleComponent.square(
|
|
size: 15,
|
|
position: Vector2(40, 240),
|
|
paint: paint3,
|
|
)..add(
|
|
SequenceEffect(
|
|
[
|
|
MoveEffect.by(
|
|
Vector2(5, 0),
|
|
NoiseEffectController(
|
|
duration: 1,
|
|
noise: PerlinNoise(frequency: 20),
|
|
),
|
|
),
|
|
MoveEffect.by(Vector2.zero(), LinearEffectController(2)),
|
|
MoveEffect.by(
|
|
Vector2(0, 10),
|
|
NoiseEffectController(
|
|
duration: 1,
|
|
noise: PerlinNoise(frequency: 10),
|
|
),
|
|
),
|
|
],
|
|
infinite: true,
|
|
),
|
|
),
|
|
);
|
|
|
|
// A circle of moving rectangles.
|
|
final path2 = Path()..addOval(const Rect.fromLTRB(80, 230, 320, 470));
|
|
for (var i = 0; i < 20; i++) {
|
|
add(
|
|
RectangleComponent.square(size: 10)
|
|
..position = Vector2(i * 10, 0)
|
|
..paint = (Paint()..color = Colors.tealAccent)
|
|
..add(
|
|
MoveAlongPathEffect(
|
|
path2,
|
|
EffectController(
|
|
duration: 6,
|
|
startDelay: i * 0.3,
|
|
infinite: true,
|
|
),
|
|
absolute: true,
|
|
oriented: true,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
// A star of moving rectangles.
|
|
final path1 = Path()..moveTo(200, 250);
|
|
for (var i = 1; i <= 5; i++) {
|
|
final x = 200 + 100 * sin(i * tau * 2 / 5);
|
|
final y = 350 - 100 * cos(i * tau * 2 / 5);
|
|
path1.lineTo(x, y);
|
|
}
|
|
for (var i = 0; i < 40; i++) {
|
|
add(
|
|
CircleComponent(radius: 5)
|
|
..position = Vector2(i * 10, 0)
|
|
..add(
|
|
MoveAlongPathEffect(
|
|
path1,
|
|
EffectController(
|
|
duration: 10,
|
|
startDelay: i * 0.2,
|
|
infinite: true,
|
|
),
|
|
absolute: true,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
}
|