Skip to content

Commit b9380aa

Browse files
committed
Add base recognizer
1 parent 5b5de8e commit b9380aa

10 files changed

Lines changed: 97 additions & 60 deletions
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import 'package:flame/components.dart';
2+
import 'package:flame/src/game/flame_game.dart';
3+
import 'package:flutter/foundation.dart';
4+
5+
abstract class Dispatcher<G extends FlameGame> extends Component
6+
with HasGameReference<G> {
7+
static void addDispatcher<T extends Component>(
8+
Component component,
9+
ComponentKey key,
10+
T Function() create,
11+
) {
12+
final game = component.findRootGame()!;
13+
if (game.findByKey(key) != null) {
14+
return;
15+
}
16+
final dispatcher = create();
17+
game.registerKey(key, dispatcher);
18+
game.add(dispatcher);
19+
}
20+
21+
static void removeDispatcher(
22+
FlameGame game,
23+
ComponentKey key, {
24+
VoidCallback? unregister,
25+
}) {
26+
unregister?.call();
27+
game.unregisterKey(key);
28+
}
29+
}

packages/flame/lib/src/events/flame_game_mixins/double_tap_dispatcher.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flame/components.dart';
22
import 'package:flame/events.dart';
33
import 'package:flame/game.dart';
4+
import 'package:flame/src/events/flame_game_mixins/dispatcher.dart';
45
import 'package:flutter/gestures.dart';
56

67
class DoubleTapDispatcherKey implements ComponentKey {
@@ -18,7 +19,7 @@ class DoubleTapDispatcherKey implements ComponentKey {
1819
/// the component tree that is mixed with [DoubleTapCallbacks]. This will be
1920
/// attached to the [FlameGame] instance automatically whenever any
2021
/// [DoubleTapCallbacks] are mounted into the component tree.
21-
class DoubleTapDispatcher extends Component with HasGameReference<FlameGame> {
22+
class DoubleTapDispatcher extends Dispatcher<FlameGame> {
2223
final _components = <DoubleTapCallbacks>{};
2324

2425
void _onDoubleTapDown(DoubleTapDownEvent event) {
@@ -45,7 +46,8 @@ class DoubleTapDispatcher extends Component with HasGameReference<FlameGame> {
4546
}
4647

4748
static void addDispatcher(Component component) {
48-
component.findRootGame()!.addDispatcher(
49+
Dispatcher.addDispatcher(
50+
component,
4951
const DoubleTapDispatcherKey(),
5052
DoubleTapDispatcher.new,
5153
);
@@ -67,8 +69,12 @@ class DoubleTapDispatcher extends Component with HasGameReference<FlameGame> {
6769

6870
@override
6971
void onRemove() {
70-
game.removeDispatcher<DoubleTapGestureRecognizer>(
72+
Dispatcher.removeDispatcher(
73+
game,
7174
const DoubleTapDispatcherKey(),
75+
unregister: () {
76+
game.gestureDetectors.unregister<DoubleTapGestureRecognizer>();
77+
},
7278
);
7379
}
7480
}

packages/flame/lib/src/events/flame_game_mixins/long_press_dispatcher.dart

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flame/components.dart';
22
import 'package:flame/src/events/component_mixins/long_press_callbacks.dart';
3+
import 'package:flame/src/events/flame_game_mixins/dispatcher.dart';
34
import 'package:flame/src/events/messages/long_press_cancel_event.dart';
45
import 'package:flame/src/events/messages/long_press_end_event.dart';
56
import 'package:flame/src/events/messages/long_press_move_update_event.dart';
@@ -13,12 +14,10 @@ import 'package:meta/meta.dart';
1314
/// that use the [LongPressCallbacks] mixin. It will be attached to the
1415
/// [FlameGame] instance automatically whenever any [LongPressCallbacks]
1516
/// components are mounted into the component tree.
16-
class LongPressDispatcher extends Component {
17+
class LongPressDispatcher extends Dispatcher<FlameGame> {
1718
/// Records all components currently being long-pressed, keyed by pointerId.
1819
final Set<TaggedComponent<LongPressCallbacks>> _records = {};
1920

20-
FlameGame get game => parent! as FlameGame;
21-
2221
/// Monotonically increasing id assigned to each new long press gesture.
2322
int _nextPointerId = 0;
2423

@@ -124,7 +123,8 @@ class LongPressDispatcher extends Component {
124123
//#endregion
125124

126125
static void addDispatcher(Component component) {
127-
component.findRootGame()!.addDispatcher(
126+
Dispatcher.addDispatcher(
127+
component,
128128
const LongPressDispatcherKey(),
129129
LongPressDispatcher.new,
130130
);
@@ -147,8 +147,12 @@ class LongPressDispatcher extends Component {
147147

148148
@override
149149
void onRemove() {
150-
game.removeDispatcher<LongPressGestureRecognizer>(
150+
Dispatcher.removeDispatcher(
151+
game,
151152
const LongPressDispatcherKey(),
153+
unregister: () {
154+
game.gestureDetectors.unregister<LongPressGestureRecognizer>();
155+
},
152156
);
153157
super.onRemove();
154158
}

packages/flame/lib/src/events/flame_game_mixins/multi_drag_dispatcher.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:async';
33
import 'package:flame/components.dart';
44
import 'package:flame/events.dart';
55
import 'package:flame/src/events/flame_drag_adapter.dart';
6+
import 'package:flame/src/events/flame_game_mixins/dispatcher.dart';
67
import 'package:flame/src/events/tagged_component.dart';
78
import 'package:flame/src/game/flame_game.dart';
89
import 'package:flame/src/game/game_render_box.dart';
@@ -24,7 +25,8 @@ class MultiDragDispatcherKey implements ComponentKey {
2425
/// [DragCallbacks] components in the component tree. It will be attached to
2526
/// the [FlameGame] instance automatically whenever any [DragCallbacks]
2627
/// components are mounted into the component tree.
27-
class MultiDragDispatcher extends Component implements MultiDragListener {
28+
class MultiDragDispatcher extends Dispatcher<FlameGame>
29+
implements MultiDragListener {
2830
/// The record of all components currently being touched.
2931
final Set<TaggedComponent<DragCallbacks>> _records = {};
3032

@@ -52,8 +54,6 @@ class MultiDragDispatcher extends Component implements MultiDragListener {
5254

5355
Stream<DragCancelEvent> get onCancel => _dragCancelController.stream;
5456

55-
FlameGame get game => parent! as FlameGame;
56-
5757
/// Called when the user initiates a drag gesture, for example by touching the
5858
/// screen and then moving the finger.
5959
///
@@ -187,7 +187,8 @@ class MultiDragDispatcher extends Component implements MultiDragListener {
187187
//#endregion
188188

189189
static void addDispatcher(Component component) {
190-
component.findRootGame()!.addDispatcher(
190+
Dispatcher.addDispatcher(
191+
component,
191192
const MultiDragDispatcherKey(),
192193
MultiDragDispatcher.new,
193194
);
@@ -205,8 +206,12 @@ class MultiDragDispatcher extends Component implements MultiDragListener {
205206

206207
@override
207208
void onRemove() {
208-
game.removeDispatcher<ImmediateMultiDragGestureRecognizer>(
209+
Dispatcher.removeDispatcher(
210+
game,
209211
const MultiDragDispatcherKey(),
212+
unregister: () {
213+
game.gestureDetectors.unregister<ImmediateMultiDragGestureRecognizer>();
214+
},
210215
);
211216
_dragUpdateController.close();
212217
_dragCancelController.close();

packages/flame/lib/src/events/flame_game_mixins/multi_tap_dispatcher.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flame/components.dart';
22
import 'package:flame/events.dart';
33
import 'package:flame/input.dart';
4+
import 'package:flame/src/events/flame_game_mixins/dispatcher.dart';
45
import 'package:flame/src/events/tagged_component.dart';
56
import 'package:flame/src/game/flame_game.dart';
67
import 'package:flame/src/game/game_render_box.dart';
@@ -18,12 +19,11 @@ class MultiTapDispatcherKey implements ComponentKey {
1819
other is MultiTapDispatcherKey && other.hashCode == hashCode;
1920
}
2021

21-
class MultiTapDispatcher extends Component implements MultiTapListener {
22+
class MultiTapDispatcher extends Dispatcher<FlameGame>
23+
implements MultiTapListener {
2224
/// The record of all components currently being touched.
2325
final Set<TaggedComponent<TapCallbacks>> _record = {};
2426

25-
FlameGame get game => parent! as FlameGame;
26-
2727
/// Called when the user touches the device screen within the game canvas,
2828
/// either with a finger, a stylus, or a mouse.
2929
///
@@ -150,7 +150,8 @@ class MultiTapDispatcher extends Component implements MultiTapListener {
150150
//#endregion
151151

152152
static void addDispatcher(Component component) {
153-
component.findRootGame()!.addDispatcher(
153+
Dispatcher.addDispatcher(
154+
component,
154155
const MultiTapDispatcherKey(),
155156
MultiTapDispatcher.new,
156157
);
@@ -177,8 +178,12 @@ class MultiTapDispatcher extends Component implements MultiTapListener {
177178

178179
@override
179180
void onRemove() {
180-
game.removeDispatcher<MultiTapGestureRecognizer>(
181+
Dispatcher.removeDispatcher(
182+
game,
181183
const MultiTapDispatcherKey(),
184+
unregister: () {
185+
game.gestureDetectors.unregister<MultiTapGestureRecognizer>();
186+
},
182187
);
183188
}
184189

packages/flame/lib/src/events/flame_game_mixins/pointer_move_dispatcher.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flame/components.dart';
22
import 'package:flame/events.dart';
3+
import 'package:flame/src/events/flame_game_mixins/dispatcher.dart';
34
import 'package:flame/src/events/tagged_component.dart';
45
import 'package:flame/src/game/flame_game.dart';
56
import 'package:flutter/gestures.dart' as flutter;
@@ -9,12 +10,10 @@ import 'package:meta/meta.dart';
910
/// [PointerMoveCallbacks] components in the component tree. It will be attached
1011
/// to the [FlameGame] instance automatically whenever any
1112
/// [PointerMoveCallbacks] components are mounted into the component tree.
12-
class PointerMoveDispatcher extends Component {
13+
class PointerMoveDispatcher extends Dispatcher<FlameGame> {
1314
/// The record of all components currently being hovered.
1415
final Set<TaggedComponent<PointerMoveCallbacks>> _records = {};
1516

16-
FlameGame get game => parent! as FlameGame;
17-
1817
@mustCallSuper
1918
void onMouseMove(PointerMoveEvent event) {
2019
final updated = <TaggedComponent<PointerMoveCallbacks>>{};
@@ -46,7 +45,8 @@ class PointerMoveDispatcher extends Component {
4645
}
4746

4847
static void addDispatcher(Component component) {
49-
component.findRootGame()!.addDispatcher(
48+
Dispatcher.addDispatcher(
49+
component,
5050
const MouseMoveDispatcherKey(),
5151
PointerMoveDispatcher.new,
5252
);
@@ -60,7 +60,7 @@ class PointerMoveDispatcher extends Component {
6060
@override
6161
void onRemove() {
6262
game.mouseDetector = null;
63-
game.unregisterKey(const MouseMoveDispatcherKey());
63+
Dispatcher.removeDispatcher(game, const MouseMoveDispatcherKey());
6464
}
6565
}
6666

packages/flame/lib/src/events/flame_game_mixins/scale_dispatcher.dart

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:math' as math;
33
import 'package:flame/components.dart';
44
import 'package:flame/events.dart';
55
import 'package:flame/game.dart';
6+
import 'package:flame/src/events/flame_game_mixins/dispatcher.dart';
67
import 'package:flame/src/events/interfaces/scale_listener.dart';
78
import 'package:flame/src/events/tagged_component.dart';
89
import 'package:flame/src/game/game_widget/gesture_detector_builder.dart';
@@ -46,12 +47,10 @@ class ScaleDispatcherKey implements ComponentKey {
4647
/// implementing [ScaleCallbacks]. It will be attached to
4748
/// the [FlameGame] instance automatically whenever any [ScaleCallbacks]
4849
/// components are mounted into the component tree.
49-
class ScaleDispatcher extends Component implements ScaleListener {
50+
class ScaleDispatcher extends Dispatcher<FlameGame> implements ScaleListener {
5051
/// Records all components currently being scaled, keyed by pointerId.
5152
final Set<TaggedComponent<ScaleCallbacks>> _records = {};
5253

53-
FlameGame get game => parent! as FlameGame;
54-
5554
/// Store the last drag events
5655
DragStartDetails? lastDragStart;
5756
DragUpdateDetails? lastDragUpdate;
@@ -295,7 +294,8 @@ class ScaleDispatcher extends Component implements ScaleListener {
295294
//#endregion
296295

297296
static void addDispatcher(Component component) {
298-
component.findRootGame()!.addDispatcher(
297+
Dispatcher.addDispatcher(
298+
component,
299299
const ScaleDispatcherKey(),
300300
ScaleDispatcher.new,
301301
);
@@ -341,7 +341,13 @@ class ScaleDispatcher extends Component implements ScaleListener {
341341

342342
@override
343343
void onRemove() {
344-
game.removeDispatcher<ScaleGestureRecognizer>(const ScaleDispatcherKey());
344+
Dispatcher.removeDispatcher(
345+
game,
346+
const ScaleDispatcherKey(),
347+
unregister: () {
348+
game.gestureDetectors.unregister<ScaleGestureRecognizer>();
349+
},
350+
);
345351
super.onRemove();
346352
}
347353

packages/flame/lib/src/events/flame_game_mixins/scroll_dispatcher.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flame/components.dart';
22
import 'package:flame/src/events/component_mixins/scroll_callbacks.dart';
3+
import 'package:flame/src/events/flame_game_mixins/dispatcher.dart';
34
import 'package:flame/src/events/messages/scroll_event.dart';
45
import 'package:flame/src/game/flame_game.dart';
56
import 'package:flutter/gestures.dart' as flutter;
@@ -9,9 +10,7 @@ import 'package:meta/meta.dart';
910
/// [ScrollCallbacks] components in the component tree. It will be attached
1011
/// to the [FlameGame] instance automatically whenever any
1112
/// [ScrollCallbacks] components are mounted into the component tree.
12-
class ScrollDispatcher extends Component {
13-
FlameGame get game => parent! as FlameGame;
14-
13+
class ScrollDispatcher extends Dispatcher<FlameGame> {
1514
@mustCallSuper
1615
void onPointerScroll(ScrollEvent event) {
1716
event.deliverAtPoint(
@@ -28,7 +27,8 @@ class ScrollDispatcher extends Component {
2827
}
2928

3029
static void addDispatcher(Component component) {
31-
component.findRootGame()!.addDispatcher(
30+
Dispatcher.addDispatcher(
31+
component,
3232
const ScrollDispatcherKey(),
3333
ScrollDispatcher.new,
3434
);
@@ -42,7 +42,7 @@ class ScrollDispatcher extends Component {
4242
@override
4343
void onRemove() {
4444
game.scrollDetector = null;
45-
game.unregisterKey(const ScrollDispatcherKey());
45+
Dispatcher.removeDispatcher(game, const ScrollDispatcherKey());
4646
}
4747
}
4848

packages/flame/lib/src/events/flame_game_mixins/secondary_tap_dispatcher.dart

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flame/components.dart';
22
import 'package:flame/events.dart';
33
import 'package:flame/game.dart';
4+
import 'package:flame/src/events/flame_game_mixins/dispatcher.dart';
45
import 'package:flutter/gestures.dart';
56

67
class SecondaryTapDispatcherKey implements ComponentKey {
@@ -19,8 +20,7 @@ class SecondaryTapDispatcherKey implements ComponentKey {
1920
/// [SecondaryTapCallbacks]. This will be attached to the [FlameGame] instance
2021
/// automatically whenever any [SecondaryTapCallbacks] are mounted into the
2122
/// component tree.
22-
class SecondaryTapDispatcher extends Component
23-
with HasGameReference<FlameGame> {
23+
class SecondaryTapDispatcher extends Dispatcher<FlameGame> {
2424
final _components = <SecondaryTapCallbacks>{};
2525

2626
void _onSecondaryTapDown(SecondaryTapDownEvent event) {
@@ -47,7 +47,8 @@ class SecondaryTapDispatcher extends Component
4747
}
4848

4949
static void addDispatcher(Component component) {
50-
component.findRootGame()!.addDispatcher(
50+
Dispatcher.addDispatcher(
51+
component,
5152
const SecondaryTapDispatcherKey(),
5253
SecondaryTapDispatcher.new,
5354
);
@@ -70,8 +71,12 @@ class SecondaryTapDispatcher extends Component
7071

7172
@override
7273
void onRemove() {
73-
game.removeDispatcher<TapGestureRecognizer>(
74+
Dispatcher.removeDispatcher(
75+
game,
7476
const SecondaryTapDispatcherKey(),
77+
unregister: () {
78+
game.gestureDetectors.unregister<TapGestureRecognizer>();
79+
},
7580
);
7681
}
7782
}

0 commit comments

Comments
 (0)