Files
flame/examples/lib/stories/controls/joystick_player.dart
Erick 444375dd14 Transforming PaletteEntry#paint into a full method and adding more colors to BasicPalette (#725)
* 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>
2021-03-27 14:53:29 -03:00

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());
}
}