mirror of
				https://github.com/flame-engine/flame.git
				synced 2025-11-01 01:18:38 +08:00 
			
		
		
		
	 444375dd14
			
		
	
	444375dd14
	
	
	
		
			
			* Transforming PaletteEntry#paint into a full method * Fixing some errors that went unoticed * Update packages/flame/CHANGELOG.md Co-authored-by: Jochum van der Ploeg <jochum@vdploeg.net> * Update packages/flame/CHANGELOG.md Co-authored-by: Jochum van der Ploeg <jochum@vdploeg.net> * followup * format Co-authored-by: Jochum van der Ploeg <jochum@vdploeg.net>
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'dart:math';
 | |
| 
 | |
| import 'package:flame/components.dart';
 | |
| import 'package:flame/game.dart';
 | |
| import 'package:flame/joystick.dart';
 | |
| import 'package:flame/extensions.dart';
 | |
| import 'package:flame/palette.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| 
 | |
| final _whitePaint = BasicPalette.white.paint();
 | |
| final _bluePaint = BasicPalette.blue.paint();
 | |
| final _greenPaint = BasicPalette.green.paint();
 | |
| 
 | |
| class JoystickPlayer extends Component implements JoystickListener {
 | |
|   static const speed = 32.0;
 | |
|   static final Vector2 size = Vector2.all(50.0);
 | |
| 
 | |
|   double currentSpeed = 0;
 | |
|   double angle = 0;
 | |
|   bool move = false;
 | |
|   Paint paint;
 | |
|   late Rect rect;
 | |
| 
 | |
|   JoystickPlayer() : paint = _whitePaint;
 | |
| 
 | |
|   @override
 | |
|   void render(Canvas canvas) {
 | |
|     canvas.translate(rect.center.dx, rect.center.dy);
 | |
|     canvas.rotate(angle == 0.0 ? 0.0 : angle + (pi / 2));
 | |
|     canvas.translate(-rect.center.dx, -rect.center.dy);
 | |
|     canvas.drawRect(rect, paint);
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void update(double dt) {
 | |
|     super.update(dt);
 | |
|     if (move) {
 | |
|       moveFromAngle(dt);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void onGameResize(Vector2 gameSize) {
 | |
|     final offset = (gameSize - size) / 2;
 | |
|     rect = offset & size;
 | |
|     super.onGameResize(gameSize);
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void joystickAction(JoystickActionEvent event) {
 | |
|     if (event.event == ActionEvent.down) {
 | |
|       if (event.id == 1) {
 | |
|         paint = paint == _whitePaint ? _bluePaint : _whitePaint;
 | |
|       }
 | |
|       if (event.id == 2) {
 | |
|         paint = paint == _whitePaint ? _greenPaint : _whitePaint;
 | |
|       }
 | |
|     } else if (event.event == ActionEvent.move) {
 | |
|       if (event.id == 3) {
 | |
|         angle = event.angle;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void joystickChangeDirectional(JoystickDirectionalEvent event) {
 | |
|     move = event.directional != JoystickMoveDirectional.idle;
 | |
|     if (move) {
 | |
|       angle = event.angle;
 | |
|       currentSpeed = speed * event.intensity;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void moveFromAngle(double dtUpdate) {
 | |
|     final next = Vector2(cos(angle), sin(angle)) * (currentSpeed * dtUpdate);
 | |
|     rect = rect.shift(next.toOffset());
 | |
|   }
 | |
| }
 |