diff --git a/app/lib/game/board.dart b/app/lib/game/board.dart index 4ee2f305..6e887e18 100644 --- a/app/lib/game/board.dart +++ b/app/lib/game/board.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:flame/components.dart'; import 'package:flame/events.dart'; import 'package:flame/experimental.dart'; import 'package:flame/game.dart'; @@ -10,8 +11,11 @@ import 'package:qeck/game/player.dart'; import 'package:qeck/game/wall.dart'; import 'package:qeck/services/network.dart'; +class BoardCollisions extends Component with HasCollisionDetection {} + class BoardGame extends FlameGame with KeyboardEvents, HasCollisionDetection { final NetworkingService networkingService; + final BoardCollisions collisions = BoardCollisions(); final BoardPlayer _player = BoardPlayer(); final Vector2 _tileSize = Vector2.all(16); @@ -40,6 +44,7 @@ class BoardGame extends FlameGame with KeyboardEvents, HasCollisionDetection { _player.position = Vector2(spawn?.x ?? 0, spawn?.y ?? 0); world.add(component); + world.add(collisions); world.add(_player); camera.follow(_player.positionProvider); camera.viewfinder.zoom = 8; @@ -48,7 +53,7 @@ class BoardGame extends FlameGame with KeyboardEvents, HasCollisionDetection { for (final object in component.tileMap.getLayer('Collisions')?.objects ?? []) { - world.add(BoardWall( + collisions.add(BoardWall( position: Vector2(object.x, object.y), size: Vector2(object.width, object.height), )); @@ -87,7 +92,15 @@ class BoardGame extends FlameGame with KeyboardEvents, HasCollisionDetection { handled = true; } movement.normalize(); - _player.move(movement); + if (keysPressed.contains(LogicalKeyboardKey.shiftLeft)) { + movement *= 2; + } + if (event is RawKeyUpEvent && + event.logicalKey == LogicalKeyboardKey.space) { + _player.toggleSit(); + } else { + _player.move(movement); + } return handled ? KeyEventResult.handled : KeyEventResult.ignored; } } diff --git a/app/lib/game/player.dart b/app/lib/game/player.dart index 551c8528..2cd4a105 100644 --- a/app/lib/game/player.dart +++ b/app/lib/game/player.dart @@ -9,7 +9,6 @@ import 'package:flame/flame.dart'; import 'package:flame/geometry.dart'; import 'package:flame/text.dart'; import 'package:qeck/game/board.dart'; -import 'package:qeck/game/wall.dart'; import 'package:qeck/services/network.dart'; class _PreviousPlayerPositionComponent extends ReadOnlyPositionProvider { @@ -141,16 +140,18 @@ class BoardPlayer direction: next.normalized(), origin: position, ); - final result = - game.collisionDetection.raycast(ray, maxDistance: length + 4); + final result = game.collisions.collisionDetection + .raycast(ray, maxDistance: length + 4); if (result == null) { position.add(next); } } - if (velocity.x == 0 && velocity.y == 0) { - current = (PlayerState.idle, direction); - } else { - current = (PlayerState.walking, direction); + if (state != PlayerState.sitting) { + if (velocity.x == 0 && velocity.y == 0) { + current = (PlayerState.idle, direction); + } else { + current = (PlayerState.walking, direction); + } } super.update(dt); } @@ -158,7 +159,6 @@ class BoardPlayer bool get wasFlipped => direction == PlayerDirection.left; void move(Vector3 velocity) { - this.velocity = velocity.xy; final lastFlipped = wasFlipped; if (velocity.x > 0) { current = (state, PlayerDirection.right); @@ -171,5 +171,18 @@ class BoardPlayer flipHorizontally(); _text.flipHorizontally(); } + if (state == PlayerState.sitting) { + return; + } + this.velocity = velocity.xy; + } + + void toggleSit() { + if (state == PlayerState.sitting) { + current = (PlayerState.idle, direction); + } else { + current = (PlayerState.sitting, direction); + velocity = Vector2.zero(); + } } }