mirror of
				https://github.com/flame-engine/flame.git
				synced 2025-10-31 17:06:50 +08:00 
			
		
		
		
	Rename Tapable to Tappable (#868)
This commit is contained in:
		| @ -82,7 +82,7 @@ import 'package:ordered_set/ordered_set.dart'; | ||||
| import '../../extensions.dart'; | ||||
| import '../components/component.dart'; | ||||
| import '../components/mixins/has_game_ref.dart'; | ||||
| import '../components/mixins/tapable.dart'; | ||||
| import '../components/mixins/tappable.dart'; | ||||
| import '../components/position_component.dart'; | ||||
| import '../fps_counter.dart'; | ||||
| import 'camera.dart'; | ||||
|  | ||||
							
								
								
									
										18
									
								
								doc/input.md
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								doc/input.md
									
									
									
									
									
								
							| @ -138,9 +138,9 @@ class MyGame extends Game with TapDetector { | ||||
| You can also check more complete examples | ||||
| [here](https://github.com/flame-engine/flame/tree/main/examples/lib/stories/controls/). | ||||
|  | ||||
| ## Tapable, Draggable and Hoverable components | ||||
| ## Tappable, Draggable and Hoverable components | ||||
|  | ||||
| Any component derived from `BaseComponent` (most components) can add the `Tapable`, the | ||||
| Any component derived from `BaseComponent` (most components) can add the `Tappable`, the | ||||
| `Draggable`, and/or the `Hoverable` mixins to handle taps, drags and hovers on the component. | ||||
|  | ||||
| All overridden methods return a boolean to control if the event should be passed down further along | ||||
| @ -152,9 +152,9 @@ you should return `true`. | ||||
| The same applies if your component has children, then the event is first sent to the leaves in the | ||||
| children tree and then passed further down until a method returns `false`. | ||||
|  | ||||
| ### Tapable components | ||||
| ### Tappable components | ||||
|  | ||||
| By adding the `HasTapableComponents` mixin to your game, and using the mixin `Tapable` on your | ||||
| By adding the `HasTappableComponents` mixin to your game, and using the mixin `Tappable` on your | ||||
| components, you can override the following methods on your components: | ||||
|  | ||||
| ```dart | ||||
| @ -168,7 +168,7 @@ Minimal component example: | ||||
| ```dart | ||||
| import 'package:flame/components.dart'; | ||||
|  | ||||
| class TapableComponent extends PositionComponent with Tapable { | ||||
| class TappableComponent extends PositionComponent with Tappable { | ||||
|  | ||||
|   // update and render omitted | ||||
|  | ||||
| @ -188,19 +188,19 @@ class TapableComponent extends PositionComponent with Tapable { | ||||
|   } | ||||
| } | ||||
|  | ||||
| class MyGame extends BaseGame with HasTapableComponents { | ||||
| class MyGame extends BaseGame with HasTappableComponents { | ||||
|   MyGame() { | ||||
|     add(TapableComponent()); | ||||
|     add(TappableComponent()); | ||||
|   } | ||||
| } | ||||
| ``` | ||||
|  | ||||
| **Note**: `HasTapableComponents` uses an advanced gesture detector under the hood and as explained | ||||
| **Note**: `HasTappableComponents` uses an advanced gesture detector under the hood and as explained | ||||
| further up on this page it shouldn't be used alongside basic detectors. | ||||
|  | ||||
| ### Draggable components | ||||
|  | ||||
| Just like with `Tapable`, Flame offers a mixin for `Draggable`. | ||||
| Just like with `Tappable`, Flame offers a mixin for `Draggable`. | ||||
|  | ||||
| By adding the `HasDraggableComponents` mixin to your game, and by using the mixin `Draggable` on | ||||
| your components, they can override the simple methods that enable an easy to use drag api on your | ||||
|  | ||||
| @ -81,7 +81,7 @@ class Map extends Component { | ||||
|   } | ||||
| } | ||||
|  | ||||
| class Rock extends SquareComponent with Hitbox, Collidable, Tapable { | ||||
| class Rock extends SquareComponent with Hitbox, Collidable, Tappable { | ||||
|   static final unpressedPaint = Paint()..color = const Color(0xFF2222FF); | ||||
|   static final pressedPaint = Paint()..color = const Color(0xFF414175); | ||||
|  | ||||
| @ -112,7 +112,7 @@ class Rock extends SquareComponent with Hitbox, Collidable, Tapable { | ||||
| } | ||||
|  | ||||
| class CameraAndViewportGame extends BaseGame | ||||
|     with KeyboardEvents, HasCollidables, HasTapableComponents { | ||||
|     with KeyboardEvents, HasCollidables, HasTappableComponents { | ||||
|   late MovableSquare square; | ||||
|  | ||||
|   final Vector2 viewportResolution; | ||||
|  | ||||
| @ -11,7 +11,7 @@ import 'package:flutter/material.dart' hide Image, Draggable; | ||||
|  | ||||
| enum Shapes { circle, rectangle, polygon } | ||||
|  | ||||
| class OnlyShapes extends BaseGame with HasTapableComponents { | ||||
| class OnlyShapes extends BaseGame with HasTappableComponents { | ||||
|   final shapePaint = BasicPalette.red.paint()..style = PaintingStyle.stroke; | ||||
|   final _rng = Random(); | ||||
|  | ||||
| @ -52,7 +52,7 @@ class OnlyShapes extends BaseGame with HasTapableComponents { | ||||
|   } | ||||
| } | ||||
|  | ||||
| class MyShapeComponent extends ShapeComponent with Tapable { | ||||
| class MyShapeComponent extends ShapeComponent with Tappable { | ||||
|   MyShapeComponent(Shape shape, Paint shapePaint) : super(shape, shapePaint); | ||||
|  | ||||
|   @override | ||||
|  | ||||
| @ -7,7 +7,7 @@ import 'package:flame/game.dart'; | ||||
| import 'package:flame/gestures.dart'; | ||||
| import 'package:flame/palette.dart'; | ||||
|  | ||||
| class Square extends PositionComponent with HasGameRef<Priority>, Tapable { | ||||
| class Square extends PositionComponent with HasGameRef<Priority>, Tappable { | ||||
|   late final Paint paint; | ||||
|  | ||||
|   Square(Vector2 position) { | ||||
| @ -43,7 +43,7 @@ class Square extends PositionComponent with HasGameRef<Priority>, Tapable { | ||||
|   } | ||||
| } | ||||
|  | ||||
| class Priority extends BaseGame with HasTapableComponents { | ||||
| class Priority extends BaseGame with HasTappableComponents { | ||||
|   @override | ||||
|   Future<void> onLoad() async { | ||||
|     final squares = [ | ||||
|  | ||||
| @ -10,9 +10,9 @@ import 'keyboard.dart'; | ||||
| import 'mouse_movement.dart'; | ||||
| import 'multitap.dart'; | ||||
| import 'multitap_advanced.dart'; | ||||
| import 'overlapping_tapables.dart'; | ||||
| import 'overlapping_tappables.dart'; | ||||
| import 'scroll.dart'; | ||||
| import 'tapables.dart'; | ||||
| import 'tappables.dart'; | ||||
|  | ||||
| void addControlsStories(Dashbook dashbook) { | ||||
|   dashbook.storiesOf('Controls') | ||||
| @ -42,13 +42,13 @@ void addControlsStories(Dashbook dashbook) { | ||||
|       codeLink: baseLink('controls/multitap_advanced.dart'), | ||||
|     ) | ||||
|     ..add( | ||||
|       'Tapables', | ||||
|       (_) => GameWidget(game: TapablesGame()), | ||||
|       codeLink: baseLink('controls/tapables.dart'), | ||||
|       'Tappables', | ||||
|       (_) => GameWidget(game: TappablesGame()), | ||||
|       codeLink: baseLink('controls/tappables.dart'), | ||||
|     ) | ||||
|     ..add( | ||||
|       'Overlaping Tappables', | ||||
|       (_) => GameWidget(game: OverlappingTapablesGame()), | ||||
|       (_) => GameWidget(game: OverlappingTappablesGame()), | ||||
|       codeLink: baseLink('controls/overlaping_tappables.dart'), | ||||
|     ) | ||||
|     ..add( | ||||
|  | ||||
| @ -1,11 +1,11 @@ | ||||
| import 'dart:math' as math; | ||||
| 
 | ||||
| import 'package:flame/components.dart'; | ||||
| import 'package:flame/game.dart'; | ||||
| import 'package:flame/palette.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flame/game.dart'; | ||||
| 
 | ||||
| class TapableSquare extends PositionComponent with Tapable { | ||||
| class TappableSquare extends PositionComponent with Tappable { | ||||
|   static Paint _randomPaint() { | ||||
|     final rng = math.Random(); | ||||
|     final color = Color.fromRGBO( | ||||
| @ -19,7 +19,7 @@ class TapableSquare extends PositionComponent with Tapable { | ||||
| 
 | ||||
|   Paint currentPaint; | ||||
| 
 | ||||
|   TapableSquare({Vector2? position}) | ||||
|   TappableSquare({Vector2? position}) | ||||
|       : currentPaint = _randomPaint(), | ||||
|         super( | ||||
|           position: position ?? Vector2.all(100), | ||||
| @ -49,11 +49,11 @@ class TapableSquare extends PositionComponent with Tapable { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class OverlappingTapablesGame extends BaseGame with HasTapableComponents { | ||||
| class OverlappingTappablesGame extends BaseGame with HasTappableComponents { | ||||
|   @override | ||||
|   Future<void> onLoad() async { | ||||
|     add(TapableSquare(position: Vector2(100, 100))); | ||||
|     add(TapableSquare(position: Vector2(150, 150))); | ||||
|     add(TapableSquare(position: Vector2(100, 200))); | ||||
|     add(TappableSquare(position: Vector2(100, 100))); | ||||
|     add(TappableSquare(position: Vector2(150, 150))); | ||||
|     add(TappableSquare(position: Vector2(100, 200))); | ||||
|   } | ||||
| } | ||||
| @ -1,15 +1,15 @@ | ||||
| import 'package:flame/components.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flame/game.dart'; | ||||
| import 'package:flame/extensions.dart'; | ||||
| import 'package:flame/game.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| 
 | ||||
| class TapableSquare extends PositionComponent with Tapable { | ||||
| class TappableSquare extends PositionComponent with Tappable { | ||||
|   static final Paint _white = Paint()..color = const Color(0xFFFFFFFF); | ||||
|   static final Paint _grey = Paint()..color = const Color(0xFFA5A5A5); | ||||
| 
 | ||||
|   bool _beenPressed = false; | ||||
| 
 | ||||
|   TapableSquare({Vector2? position}) | ||||
|   TappableSquare({Vector2? position}) | ||||
|       : super( | ||||
|           position: position ?? Vector2.all(100), | ||||
|           size: Vector2.all(100), | ||||
| @ -41,10 +41,10 @@ class TapableSquare extends PositionComponent with Tapable { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class TapablesGame extends BaseGame with HasTapableComponents { | ||||
| class TappablesGame extends BaseGame with HasTappableComponents { | ||||
|   @override | ||||
|   Future<void> onLoad() async { | ||||
|     add(TapableSquare()..anchor = Anchor.center); | ||||
|     add(TapableSquare()..y = 350); | ||||
|     add(TappableSquare()..anchor = Anchor.center); | ||||
|     add(TappableSquare()..y = 350); | ||||
|   } | ||||
| } | ||||
| @ -6,6 +6,8 @@ | ||||
|  - Extract shared logic when handling components set in BaseComponent and BaseGame to ComponentSet. | ||||
|  - Rename `camera.shake(amount: x)` to `camera.shake(duration: x)` | ||||
|  - Fix `SpriteAnimationComponent` docs to use `Future.wait` | ||||
|  - Rename `Tapable` to `Tappable` | ||||
|  - Rename `HasTapableComponents` to `HasTappableComponents` | ||||
|  | ||||
| ## [1.0.0-releasecandidate.12] | ||||
|  - Fix link to code in example stories | ||||
|  | ||||
| @ -11,7 +11,7 @@ export 'src/components/mixins/has_game_ref.dart'; | ||||
| export 'src/components/mixins/hitbox.dart'; | ||||
| export 'src/components/mixins/hoverable.dart'; | ||||
| export 'src/components/mixins/single_child_particle.dart'; | ||||
| export 'src/components/mixins/tapable.dart'; | ||||
| export 'src/components/mixins/tappable.dart'; | ||||
| export 'src/components/nine_tile_box_component.dart'; | ||||
| export 'src/components/parallax_component.dart'; | ||||
| export 'src/components/particle_component.dart'; | ||||
|  | ||||
| @ -5,7 +5,7 @@ import '../../game/base_game.dart'; | ||||
| import '../../gestures/events.dart'; | ||||
| import '../base_component.dart'; | ||||
| 
 | ||||
| mixin Tapable on BaseComponent { | ||||
| mixin Tappable on BaseComponent { | ||||
|   bool onTapCancel() { | ||||
|     return true; | ||||
|   } | ||||
| @ -47,14 +47,14 @@ mixin Tapable on BaseComponent { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| mixin HasTapableComponents on BaseGame { | ||||
|   void _handleTapEvent(bool Function(Tapable child) tapEventHandler) { | ||||
| mixin HasTappableComponents on BaseGame { | ||||
|   void _handleTapEvent(bool Function(Tappable child) tapEventHandler) { | ||||
|     for (final c in components.reversed()) { | ||||
|       var shouldContinue = true; | ||||
|       if (c is BaseComponent) { | ||||
|         shouldContinue = c.propagateToChildren<Tapable>(tapEventHandler); | ||||
|         shouldContinue = c.propagateToChildren<Tappable>(tapEventHandler); | ||||
|       } | ||||
|       if (c is Tapable && shouldContinue) { | ||||
|       if (c is Tappable && shouldContinue) { | ||||
|         shouldContinue = tapEventHandler(c); | ||||
|       } | ||||
|       if (!shouldContinue) { | ||||
| @ -65,16 +65,16 @@ mixin HasTapableComponents on BaseGame { | ||||
| 
 | ||||
|   @mustCallSuper | ||||
|   void onTapCancel(int pointerId) { | ||||
|     _handleTapEvent((Tapable child) => child.handleTapCancel(pointerId)); | ||||
|     _handleTapEvent((Tappable child) => child.handleTapCancel(pointerId)); | ||||
|   } | ||||
| 
 | ||||
|   @mustCallSuper | ||||
|   void onTapDown(int pointerId, TapDownInfo info) { | ||||
|     _handleTapEvent((Tapable child) => child.handleTapDown(pointerId, info)); | ||||
|     _handleTapEvent((Tappable child) => child.handleTapDown(pointerId, info)); | ||||
|   } | ||||
| 
 | ||||
|   @mustCallSuper | ||||
|   void onTapUp(int pointerId, TapUpInfo info) { | ||||
|     _handleTapEvent((Tapable child) => child.handleTapUp(pointerId, info)); | ||||
|     _handleTapEvent((Tappable child) => child.handleTapUp(pointerId, info)); | ||||
|   } | ||||
| } | ||||
| @ -11,7 +11,7 @@ import '../components/mixins/draggable.dart'; | ||||
| import '../components/mixins/has_collidables.dart'; | ||||
| import '../components/mixins/has_game_ref.dart'; | ||||
| import '../components/mixins/hoverable.dart'; | ||||
| import '../components/mixins/tapable.dart'; | ||||
| import '../components/mixins/tappable.dart'; | ||||
| import '../fps_counter.dart'; | ||||
| import 'camera.dart'; | ||||
| import 'game.dart'; | ||||
| @ -111,10 +111,10 @@ class BaseGame extends Game with FPSCounter { | ||||
|         'You can only use the Hitbox/Collidable feature with games that has the HasCollidables mixin', | ||||
|       ); | ||||
|     } | ||||
|     if (c is Tapable) { | ||||
|     if (c is Tappable) { | ||||
|       assert( | ||||
|         this is HasTapableComponents, | ||||
|         'Tapable Components can only be added to a BaseGame with HasTapableComponents', | ||||
|         this is HasTappableComponents, | ||||
|         'Tappable Components can only be added to a BaseGame with HasTappableComponents', | ||||
|       ); | ||||
|     } | ||||
|     if (c is Draggable) { | ||||
|  | ||||
| @ -4,7 +4,6 @@ import 'package:flutter/widgets.dart'; | ||||
| import '../../../components.dart'; | ||||
| import '../../../extensions.dart'; | ||||
| import '../../components/mixins/draggable.dart'; | ||||
| import '../../components/mixins/tapable.dart'; | ||||
| import '../../extensions/offset.dart'; | ||||
| import '../../gestures/detectors.dart'; | ||||
| import '../../gestures/events.dart'; | ||||
| @ -24,7 +23,7 @@ bool hasBasicGestureDetectors(Game game) => | ||||
| bool hasAdvancedGesturesDetectors(Game game) => | ||||
|     game is MultiTouchTapDetector || | ||||
|     game is MultiTouchDragDetector || | ||||
|     game is HasTapableComponents || | ||||
|     game is HasTappableComponents || | ||||
|     game is HasDraggableComponents; | ||||
|  | ||||
| bool hasMouseDetectors(Game game) => | ||||
| @ -231,7 +230,7 @@ Widget applyAdvancedGesturesDetectors(Game game, Widget child) { | ||||
|       instance.onTapCancel = game.onTapCancel; | ||||
|       instance.onTap = game.onTap; | ||||
|     }); | ||||
|   } else if (game is HasTapableComponents) { | ||||
|   } else if (game is HasTappableComponents) { | ||||
|     addAndConfigureRecognizer( | ||||
|       () => MultiTapGestureRecognizer(), | ||||
|       (MultiTapGestureRecognizer instance) { | ||||
|  | ||||
| @ -7,9 +7,9 @@ import 'package:test/test.dart'; | ||||
| import '../util/mock_canvas.dart'; | ||||
| import '../util/mock_gesture_events.dart'; | ||||
|  | ||||
| class MyGame extends BaseGame with HasTapableComponents {} | ||||
| class MyGame extends BaseGame with HasTappableComponents {} | ||||
|  | ||||
| class MyTap extends PositionComponent with Tapable { | ||||
| class MyTap extends PositionComponent with Tappable { | ||||
|   late Vector2 gameSize; | ||||
|  | ||||
|   int tapTimes = 0; | ||||
| @ -47,9 +47,9 @@ class MyAsyncChild extends MyTap { | ||||
|   Future<void> onLoad() => Future.value(); | ||||
| } | ||||
|  | ||||
| class MyComposed extends PositionComponent with HasGameRef, Tapable {} | ||||
| class MyComposed extends PositionComponent with HasGameRef, Tappable {} | ||||
|  | ||||
| class MySimpleComposed extends BaseComponent with HasGameRef, Tapable {} | ||||
| class MySimpleComposed extends BaseComponent with HasGameRef, Tappable {} | ||||
|  | ||||
| // composed w/o HasGameRef | ||||
| class PlainComposed extends BaseComponent {} | ||||
|  | ||||
| @ -2,25 +2,25 @@ import 'package:flame/components.dart'; | ||||
| import 'package:flame/game.dart'; | ||||
| import 'package:test/test.dart'; | ||||
|  | ||||
| class _GameWithTapables extends BaseGame with HasTapableComponents {} | ||||
| class _GameWithTappables extends BaseGame with HasTappableComponents {} | ||||
|  | ||||
| class _GameWithoutTapables extends BaseGame {} | ||||
| class _GameWithoutTappables extends BaseGame {} | ||||
|  | ||||
| class TapableComponent extends PositionComponent with Tapable {} | ||||
| class TappableComponent extends PositionComponent with Tappable {} | ||||
|  | ||||
| void main() { | ||||
|   group('tapables test', () { | ||||
|   group('tappables test', () { | ||||
|     test('make sure they cannot be added to invalid games', () async { | ||||
|       final game1 = _GameWithTapables(); | ||||
|       final game1 = _GameWithTappables(); | ||||
|       game1.onResize(Vector2.all(100)); | ||||
|       // should be ok | ||||
|       await game1.add(TapableComponent()); | ||||
|       await game1.add(TappableComponent()); | ||||
|  | ||||
|       final game2 = _GameWithoutTapables(); | ||||
|       final game2 = _GameWithoutTappables(); | ||||
|       game2.onResize(Vector2.all(100)); | ||||
|  | ||||
|       expect( | ||||
|         () => game2.add(TapableComponent()), | ||||
|         () => game2.add(TappableComponent()), | ||||
|         throwsA(isA<AssertionError>()), | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
| @ -11,9 +11,9 @@ import 'package:test/test.dart'; | ||||
|  | ||||
| import '../util/mock_gesture_events.dart'; | ||||
|  | ||||
| class MyGame extends BaseGame with HasTapableComponents {} | ||||
| class MyGame extends BaseGame with HasTappableComponents {} | ||||
|  | ||||
| class MyComponent extends PositionComponent with Tapable, HasGameRef { | ||||
| class MyComponent extends PositionComponent with Tappable, HasGameRef { | ||||
|   bool tapped = false; | ||||
|   bool isUpdateCalled = false; | ||||
|   bool isRenderCalled = false; | ||||
| @ -59,7 +59,7 @@ class MyAsyncComponent extends MyComponent { | ||||
|   Future<void> onLoad() => Future.value(); | ||||
| } | ||||
|  | ||||
| class PositionComponentNoNeedForRect extends PositionComponent with Tapable {} | ||||
| class PositionComponentNoNeedForRect extends PositionComponent with Tappable {} | ||||
|  | ||||
| Vector2 size = Vector2(1.0, 1.0); | ||||
|  | ||||
|  | ||||
| @ -11,7 +11,7 @@ import 'draggable_sample.dart'; | ||||
| import 'mouse_joint_sample.dart'; | ||||
| import 'position_body_sample.dart'; | ||||
| import 'sprite_body_sample.dart'; | ||||
| import 'tapable_sample.dart'; | ||||
| import 'tappable_sample.dart'; | ||||
|  | ||||
| String link(String example) => | ||||
|     'https://github.com/flame-engine/flame_forge2d/tree/main/example/lib/$example'; | ||||
| @ -52,9 +52,9 @@ void main() async { | ||||
|       codeLink: link('position_body_sample.dart'), | ||||
|     ) | ||||
|     ..add( | ||||
|       'Tapable Body', | ||||
|       (DashbookContext ctx) => GameWidget(game: TapableSample()), | ||||
|       codeLink: link('tapable_sample.dart'), | ||||
|       'Tappable Body', | ||||
|       (DashbookContext ctx) => GameWidget(game: TappableSample()), | ||||
|       codeLink: link('tappable_sample.dart'), | ||||
|     ) | ||||
|     ..add( | ||||
|       'Draggable Body', | ||||
|  | ||||
| @ -1,26 +1,26 @@ | ||||
| import 'package:flame_forge2d/flame_forge2d.dart'; | ||||
| import 'package:forge2d/forge2d.dart'; | ||||
| import 'package:flame_forge2d/forge2d_game.dart'; | ||||
| import 'package:flame/palette.dart'; | ||||
| import 'package:flame/components.dart'; | ||||
| import 'package:flame/palette.dart'; | ||||
| import 'package:flame_forge2d/flame_forge2d.dart'; | ||||
| import 'package:flame_forge2d/forge2d_game.dart'; | ||||
| import 'package:forge2d/forge2d.dart'; | ||||
| 
 | ||||
| import 'balls.dart'; | ||||
| import 'boundaries.dart'; | ||||
| 
 | ||||
| class TapableSample extends Forge2DGame with HasTapableComponents { | ||||
|   TapableSample() : super(zoom: 20, gravity: Vector2(0, -10.0)); | ||||
| class TappableSample extends Forge2DGame with HasTappableComponents { | ||||
|   TappableSample() : super(zoom: 20, gravity: Vector2(0, -10.0)); | ||||
| 
 | ||||
|   @override | ||||
|   Future<void> onLoad() async { | ||||
|     final boundaries = createBoundaries(this); | ||||
|     boundaries.forEach(add); | ||||
|     final center = screenToWorld(viewport.effectiveSize / 2); | ||||
|     add(TapableBall(center)); | ||||
|     add(TappableBall(center)); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class TapableBall extends Ball with Tapable { | ||||
|   TapableBall(Vector2 position) : super(position) { | ||||
| class TappableBall extends Ball with Tappable { | ||||
|   TappableBall(Vector2 position) : super(position) { | ||||
|     originalPaint = BasicPalette.white.paint(); | ||||
|     paint = originalPaint; | ||||
|   } | ||||
| @ -171,7 +171,7 @@ Finally, we just render it on the game `render` function: | ||||
|  | ||||
| You now should see the button on the screen, but right now, it is pretty much useless as it has no action at all. | ||||
|  | ||||
| So, to change that, we will now add some interactivity to our game and make the button tapable/clickable. | ||||
| So, to change that, we will now add some interactivity to our game and make the button tappable/clickable. | ||||
|  | ||||
| Flame provides several input handlers, which you can check with more in depth on [our docs](https://github.com/flame-engine/flame/blob/main/doc/input.md). For this tutorial, we will be using the `TapDetector` which enables us to detect taps on the screen, as well as mouse click when running on web or desktop. | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Lukas Klingsbo
					Lukas Klingsbo