mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-02 03:15:43 +08:00
The viewport should receive events before the world, otherwise all huds will get the events after the world components, if there are any world components underneath them.
43 lines
1.1 KiB
Dart
43 lines
1.1 KiB
Dart
import 'package:flame/collisions.dart';
|
|
import 'package:flame/components.dart';
|
|
import 'package:flame/game.dart';
|
|
|
|
class JoystickPlayer extends SpriteComponent
|
|
with HasGameRef, CollisionCallbacks {
|
|
/// Pixels/s
|
|
double maxSpeed = 300.0;
|
|
late final Vector2 _lastSize = size.clone();
|
|
late final Transform2D _lastTransform = transform.clone();
|
|
|
|
final JoystickComponent joystick;
|
|
|
|
JoystickPlayer(this.joystick)
|
|
: super(size: Vector2.all(100.0), anchor: Anchor.center);
|
|
|
|
@override
|
|
Future<void> onLoad() async {
|
|
sprite = await gameRef.loadSprite('layers/player.png');
|
|
add(RectangleHitbox());
|
|
}
|
|
|
|
@override
|
|
void update(double dt) {
|
|
if (!joystick.delta.isZero() && activeCollisions.isEmpty) {
|
|
_lastSize.setFrom(size);
|
|
_lastTransform.setFrom(transform);
|
|
position.add(joystick.relativeDelta * maxSpeed * dt);
|
|
angle = joystick.delta.screenAngle();
|
|
}
|
|
}
|
|
|
|
@override
|
|
void onCollisionStart(
|
|
Set<Vector2> intersectionPoints,
|
|
PositionComponent other,
|
|
) {
|
|
super.onCollisionStart(intersectionPoints, other);
|
|
transform.setFrom(_lastTransform);
|
|
size.setFrom(_lastSize);
|
|
}
|
|
}
|