Fix player movement and rotation
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
+52
-3
@@ -1,6 +1,7 @@
|
||||
import "dart:math" as math;
|
||||
|
||||
import "package:flutter/material.dart";
|
||||
import "package:flutter/services.dart";
|
||||
|
||||
// dart format off
|
||||
const List<int> map = [
|
||||
@@ -65,6 +66,8 @@ class Player extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _PlayerState extends State<Player> {
|
||||
late final FocusNode _focusNode;
|
||||
|
||||
double playerAngle = 0;
|
||||
double get playerDeltaX => math.cos(playerAngle) * 5;
|
||||
double get playerDeltaY => math.sin(playerAngle) * 5;
|
||||
@@ -73,10 +76,56 @@ class _PlayerState extends State<Player> {
|
||||
|
||||
Offset playerPosition = const Offset(1.5 * mapSize, 1.5 * mapSize);
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_focusNode = FocusNode()..requestFocus();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_focusNode.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return CustomPaint(
|
||||
painter: PlayerPainter(offset: playerPosition, delta: playerDelta),
|
||||
return KeyboardListener(
|
||||
focusNode: _focusNode,
|
||||
onKeyEvent: (value) {
|
||||
if (value is! KeyDownEvent && value is! KeyRepeatEvent) return;
|
||||
|
||||
final LogicalKeyboardKey key = value.logicalKey;
|
||||
|
||||
if (key == LogicalKeyboardKey.keyA) {
|
||||
// Move left
|
||||
playerAngle -= 0.1;
|
||||
if (playerAngle < 0) {
|
||||
playerAngle += 2 * math.pi;
|
||||
}
|
||||
} else if (key == LogicalKeyboardKey.keyD) {
|
||||
// Move right
|
||||
playerAngle += 0.1;
|
||||
|
||||
if (playerAngle > 2 * math.pi) {
|
||||
playerAngle -= 2 * math.pi;
|
||||
}
|
||||
} else if (key == LogicalKeyboardKey.keyW) {
|
||||
// Move forward
|
||||
playerPosition += playerDelta;
|
||||
} else if (key == LogicalKeyboardKey.keyS) {
|
||||
// Move backwwards
|
||||
playerPosition -= playerDelta;
|
||||
}
|
||||
|
||||
setState(() {});
|
||||
},
|
||||
child: CustomPaint(
|
||||
painter: PlayerPainter(
|
||||
offset: playerPosition,
|
||||
delta: playerDelta,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -101,7 +150,7 @@ class PlayerPainter extends CustomPainter {
|
||||
// Player direction line
|
||||
canvas.drawLine(
|
||||
offset + const Offset(4, 4),
|
||||
delta * 5,
|
||||
offset + const Offset(4, 4) + (delta * 5),
|
||||
Paint()
|
||||
..color = Colors.yellow
|
||||
..strokeWidth = 2,
|
||||
|
||||
Reference in New Issue
Block a user