mirror of
				https://github.com/flame-engine/flame.git
				synced 2025-10-31 00:48:47 +08:00 
			
		
		
		
	feat!: The HasTappableComponents mixin is no longer needed (#2450)
				
					
				
			This PR is the second in a series of refactors that aim to simplify event handling in Flame. The approach is as follows:
    Added the MultiTapDispatcher component, which contains the logic that used to be within the HasTappableComponents mixin. This component is internal; it mounts to a FlameGame directly, and ensures that it is a singleton.
    Whenever any TapCallbacks component is added to a game, it automatically adds the MultiTapDispatcher component (unless there is already one), which in turn registers a tap gesture detector with GestureDetectorBuilder and rebuilds the game widget.
The end result is that now in order to make a component tappable you only need to add the TapCallbacks mixin to that component, everything else will be handled by the framework.
Consequently, the HasTappableComponents mixin is now empty and marked as deprecated.
			
			
This commit is contained in:
		
							
								
								
									
										53
									
								
								examples/lib/stories/input/tap_callbacks_example.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								examples/lib/stories/input/tap_callbacks_example.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | ||||
| import 'package:flame/components.dart'; | ||||
| import 'package:flame/experimental.dart'; | ||||
| import 'package:flame/extensions.dart'; | ||||
| import 'package:flame/game.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
|  | ||||
| class TapCallbacksExample extends FlameGame { | ||||
|   static const String description = ''' | ||||
|     In this example we show the `Tappable` mixin functionality. You can add the | ||||
|     `Tappable` mixin to any `PositionComponent`.\n\n | ||||
|     Tap the squares to see them change their angle around their anchor. | ||||
|   '''; | ||||
|  | ||||
|   @override | ||||
|   Future<void> onLoad() async { | ||||
|     add(TappableSquare()..anchor = Anchor.center); | ||||
|     add(TappableSquare()..y = 350); | ||||
|   } | ||||
| } | ||||
|  | ||||
| class TappableSquare extends PositionComponent with TapCallbacks { | ||||
|   static final Paint _white = Paint()..color = const Color(0xFFFFFFFF); | ||||
|   static final Paint _grey = Paint()..color = const Color(0xFFA5A5A5); | ||||
|  | ||||
|   bool _beenPressed = false; | ||||
|  | ||||
|   TappableSquare({Vector2? position}) | ||||
|       : super( | ||||
|           position: position ?? Vector2.all(100), | ||||
|           size: Vector2.all(100), | ||||
|         ); | ||||
|  | ||||
|   @override | ||||
|   void render(Canvas canvas) { | ||||
|     canvas.drawRect(size.toRect(), _beenPressed ? _grey : _white); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   void onTapUp(_) { | ||||
|     _beenPressed = false; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   void onTapDown(_) { | ||||
|     _beenPressed = true; | ||||
|     angle += 1.0; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   void onTapCancel(_) { | ||||
|     _beenPressed = false; | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Lukas Klingsbo
					Lukas Klingsbo