diff --git a/lib/main.dart b/lib/main.dart index 936b443..f472a83 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import "dart:math" as math; import "package:flutter/material.dart"; +import "package:flutter/services.dart"; // dart format off const List map = [ @@ -65,6 +66,8 @@ class Player extends StatefulWidget { } class _PlayerState extends State { + 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 { 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,