Skip to content

Commit

Permalink
feat(flame_behaviors)!: migrate to flame v1.7.0 (#43)
Browse files Browse the repository at this point in the history
* feat!(flame_behaviors): migrate to flame v1.7.0

* feat(flame_behaviors)!: migrate to flame v1.7.0

* feat(flame_behaviors)!: migrate to flame v1.7.0
  • Loading branch information
wolfenrain committed May 11, 2023
1 parent 4ae0553 commit 08580f6
Show file tree
Hide file tree
Showing 12 changed files with 68 additions and 40 deletions.
5 changes: 4 additions & 1 deletion .github/cspell.json
Expand Up @@ -22,6 +22,9 @@
"Hitbox",
"gameplay",
"collidable",
"Draggables"
"Draggables",
"tappable",
"Tappable",
"hoverable"
]
}
22 changes: 17 additions & 5 deletions docs/input-behaviors.md
Expand Up @@ -3,20 +3,32 @@
The `flame_behaviors` package also provides input behaviors. These behaviors are a layer over the
existing Flame input mixins for components. These behaviors will trigger when the user interacts with their parent entity. So these events are always relative to the parent entity.

## TappableBehavior

The `TappableBehavior` allows developers to use the [tap events][flame_tap_docs] from Flame on their entities.

```dart
class MyTappableBehavior extends TappableBehavior<MyEntity> {
@override
void onTapDown(TapDownEvent event) {
// Do something on tap down update event.
}
}
```


## DraggableBehavior

The `DraggableBehavior` allows developers to use the [drag events][flame_drag_docs] from Flame on their entities.

```dart
class MyDraggableBehavior extends DraggableBehavior<MyEntity> {
@override
bool onDragUpdate(DragUpdateInfo info) {
void onDragUpdate(DragUpdateEvent event) {
// Do something on drag update event.
return super.onDragUpdate(info);
}
}
```

> **Note**: To use this behavior you need to add the `HasDraggables` mixin to your game class.
[flame_drag_docs]: https://docs.flame-engine.org/1.6.0/flame/inputs/gesture_input.html#draggable-components
[flame_drag_docs]: https://docs.flame-engine.org/1.7.0/flame/inputs/drag_events.html
[flame_tap_docs]: https://docs.flame-engine.org/1.7.0/flame/inputs/tap_events.html
Expand Up @@ -2,6 +2,7 @@ import 'dart:math';

import 'package:example/entities/entities.dart';
import 'package:example/main.dart';
import 'package:flame/experimental.dart' hide Circle, Rectangle;
import 'package:flame/extensions.dart';
import 'package:flame_behaviors/flame_behaviors.dart';

Expand All @@ -18,10 +19,8 @@ class SpawningBehavior extends TappableBehavior<ExampleGame> {
}

@override
bool onTapDown(TapDownInfo info) {
parent.add(nextRandomEntity(info.eventPosition.game));

return super.onTapDown(info);
void onTapDown(TapDownEvent event) {
parent.add(nextRandomEntity(event.canvasPosition));
}

PositionedEntity nextRandomEntity(Vector2 position) {
Expand Down
@@ -1,4 +1,5 @@
import 'package:example/entities/entities.dart';
import 'package:flame/experimental.dart' hide Circle;
import 'package:flame/extensions.dart';
import 'package:flame_behaviors/flame_behaviors.dart';

Expand All @@ -13,27 +14,26 @@ class DraggingBehavior extends DraggableBehavior<Circle> {
}

@override
bool onDragStart(DragStartInfo info) {
void onDragStart(DragStartEvent event) {
originalVelocity = movement?.velocity.clone();
movement?.velocity.setFrom(Vector2.zero());
return false;
return super.onDragStart(event);
}

@override
bool onDragCancel() {
void onDragCancel(DragCancelEvent event) {
movement?.velocity.setFrom(originalVelocity ?? Vector2.zero());
return false;
return super.onDragCancel(event);
}

@override
bool onDragEnd(DragEndInfo info) {
movement?.velocity.setFrom(info.velocity);
return false;
void onDragEnd(DragEndEvent event) {
movement?.velocity.setFrom(event.velocity);
return super.onDragEnd(event);
}

@override
bool onDragUpdate(DragUpdateInfo info) {
parent.position.add(info.delta.game);
return false;
void onDragUpdate(DragUpdateEvent event) {
parent.position.add(event.delta);
}
}
@@ -1,4 +1,5 @@
import 'package:example/entities/entities.dart';
import 'package:flame/experimental.dart' hide Rectangle;
import 'package:flame/extensions.dart';
import 'package:flame_behaviors/flame_behaviors.dart';

Expand All @@ -13,13 +14,12 @@ class FreezingBehavior extends TappableBehavior<Rectangle> {
}

@override
bool onTapDown(TapDownInfo info) {
void onTapDown(TapDownEvent event) {
if (movement?.velocity.isZero() ?? false) {
movement?.velocity.setFrom(originalVelocity ?? Vector2.zero());
} else {
originalVelocity = movement?.velocity.clone();
movement?.velocity.setFrom(Vector2.zero());
}
return false;
}
}
3 changes: 1 addition & 2 deletions packages/flame_behaviors/example/lib/main.dart
Expand Up @@ -4,8 +4,7 @@ import 'package:flame/game.dart';
import 'package:flame_behaviors/flame_behaviors.dart';
import 'package:flutter/material.dart';

class ExampleGame extends FlameGame
with EntityMixin, HasCollisionDetection, HasDraggables, HasTappables {
class ExampleGame extends FlameGame with EntityMixin, HasCollisionDetection {
@override
Future<void> onLoad() async {
await add(FpsTextComponent(position: Vector2.zero()));
Expand Down
6 changes: 6 additions & 0 deletions packages/flame_behaviors/lib/src/behaviors/behavior.dart
Expand Up @@ -25,10 +25,16 @@ abstract class Behavior<Parent extends EntityMixin> extends Component
}

@override
@Deprecated('Will be removed in a future version of Flame')
bool containsPoint(Vector2 point) {
return parent.containsPoint(point);
}

@override
bool containsLocalPoint(Vector2 point) {
return parent.containsLocalPoint(point);
}

@override
bool get debugMode => parent.debugMode;
}
@@ -1,12 +1,8 @@
import 'package:flame/components.dart';
import 'package:flame/experimental.dart';
import 'package:flame_behaviors/flame_behaviors.dart';

/// {@template draggable_behavior}
/// A behavior that makes an [Entity] draggable.
///
/// When using this behavior, also add `HasDraggables` to your game, which
/// handles propagation of drag events from the root game to individual
/// behaviors.
/// {@endtemplate}
abstract class DraggableBehavior<Parent extends EntityMixin>
extends Behavior<Parent> with Draggable {}
extends Behavior<Parent> with DragCallbacks {}
@@ -1,12 +1,8 @@
import 'package:flame/components.dart';
import 'package:flame/experimental.dart';
import 'package:flame_behaviors/flame_behaviors.dart';

/// {@template tappable_behavior}
/// A behavior that makes an [Entity] tappable.
///
/// When using this behavior, also add `HasTappables` to your game, which
/// handles propagation of tap events from the root game to individual
/// behaviors.
/// {@endtemplate}
abstract class TappableBehavior<Parent extends EntityMixin>
extends Behavior<Parent> with Tappable {}
extends Behavior<Parent> with TapCallbacks {}
2 changes: 1 addition & 1 deletion packages/flame_behaviors/pubspec.yaml
Expand Up @@ -10,7 +10,7 @@ environment:
sdk: ">=2.17.0 <3.0.0"

dependencies:
flame: ">=1.6.0 <2.0.0"
flame: ">=1.7.0 <2.0.0"
flutter:
sdk: flutter

Expand Down
19 changes: 18 additions & 1 deletion packages/flame_behaviors/test/src/behaviors/behavior_test.dart
@@ -1,4 +1,4 @@
// ignore_for_file: cascade_invocations
// ignore_for_file: cascade_invocations, deprecated_member_use_from_same_package

import 'package:flame/components.dart';
import 'package:flame_behaviors/flame_behaviors.dart';
Expand Down Expand Up @@ -49,6 +49,23 @@ void main() {
},
);

flameTester.testGameWidget(
'contains local point is relative to parent',
setUp: (game, tester) async {
final behavior = _TestBehavior();
final entity = _TestEntity(behaviors: [behavior]);
await game.ensureAdd(entity);
},
verify: (game, tester) async {
final entity = game.firstChild<_TestEntity>()!;
final behavior = entity.firstChild<_TestBehavior>()!;

expect(behavior.containsLocalPoint(Vector2.zero()), isTrue);
expect(behavior.containsLocalPoint(Vector2(31, 31)), isTrue);
expect(behavior.containsLocalPoint(Vector2(32, 32)), isFalse);
},
);

flameTester.testGameWidget(
'debugMode is provided by the parent',
setUp: (game, tester) async {
Expand Down
4 changes: 2 additions & 2 deletions packages/flame_behaviors/test/src/entity_test.dart
Expand Up @@ -56,7 +56,7 @@ void main() {
await game.ensureAdd(entity);

final behavior = _TestBehavior();
await expectLater(
expect(
entity.findBehavior<_TestBehavior>,
throwsBehaviorNotFoundFor<_TestBehavior>(),
);
Expand All @@ -67,7 +67,7 @@ void main() {
verify: (game, tester) async {
final entity = game.firstChild<_TestEntity>()!;

await expectLater(
expect(
entity.findBehavior<_TestBehavior>,
throwsBehaviorNotFoundFor<_TestBehavior>(),
);
Expand Down

0 comments on commit 08580f6

Please sign in to comment.