mirror of
https://github.com/flame-engine/flame.git
synced 2025-10-30 08:27:36 +08:00
feat: Add Transform2D.setFrom and Transform2D.clone (#1495)
This commit is contained in:
@ -11,7 +11,7 @@ import 'package:flutter/material.dart';
|
||||
import 'joystick_player.dart';
|
||||
|
||||
class JoystickAdvancedExample extends FlameGame
|
||||
with HasDraggables, HasTappables {
|
||||
with HasDraggables, HasTappables, HasCollisionDetection {
|
||||
static const String description = '''
|
||||
In this example we showcase how to use the joystick by creating
|
||||
`SpriteComponent`s that serve as the joystick's knob and background.
|
||||
@ -35,6 +35,7 @@ class JoystickAdvancedExample extends FlameGame
|
||||
columns: 6,
|
||||
rows: 1,
|
||||
);
|
||||
add(ScreenHitbox());
|
||||
joystick = JoystickComponent(
|
||||
knob: SpriteComponent(
|
||||
sprite: sheet.getSpriteById(1),
|
||||
|
||||
@ -1,29 +1,45 @@
|
||||
import 'package:flame/collisions.dart';
|
||||
import 'package:flame/components.dart';
|
||||
import 'package:flame/game.dart';
|
||||
|
||||
class JoystickPlayer extends SpriteComponent with HasGameRef {
|
||||
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;
|
||||
}
|
||||
: super(size: Vector2.all(100.0), anchor: Anchor.center);
|
||||
|
||||
@override
|
||||
Future<void> onLoad() async {
|
||||
sprite = await gameRef.loadSprite('layers/player.png');
|
||||
position = gameRef.size / 2;
|
||||
add(RectangleHitbox()..debugMode = true);
|
||||
}
|
||||
|
||||
@override
|
||||
void update(double dt) {
|
||||
if (!joystick.delta.isZero()) {
|
||||
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> _, PositionComponent __) {
|
||||
super.onCollisionStart(_, __);
|
||||
transform.setFrom(_lastTransform);
|
||||
size.setFrom(_lastSize);
|
||||
}
|
||||
|
||||
@override
|
||||
void onCollisionEnd(PositionComponent __) {
|
||||
super.onCollisionEnd(__);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
import 'dart:math' as math;
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:vector_math/vector_math_64.dart';
|
||||
|
||||
import 'notifying_vector2.dart';
|
||||
|
||||
/// This class describes a generic 2D transform, which is a combination of
|
||||
@ -53,6 +55,17 @@ class Transform2D extends ChangeNotifier {
|
||||
..scale = other.scale
|
||||
..offset = other.offset;
|
||||
|
||||
/// Clone of this.
|
||||
Transform2D clone() => Transform2D.copy(this);
|
||||
|
||||
/// Set this to the values of the [other] [Transform2D].
|
||||
void setFrom(Transform2D other) {
|
||||
angle = other.angle;
|
||||
position = other.position;
|
||||
scale = other.scale;
|
||||
offset = other.offset;
|
||||
}
|
||||
|
||||
/// Check whether this transform is equal to [other], up to the given
|
||||
/// [tolerance]. Setting tolerance to zero will check for exact equality.
|
||||
/// Transforms are considered equal if their rotation angles are the same
|
||||
|
||||
Reference in New Issue
Block a user