@@ -6,10 +6,12 @@ import 'package:flutter/services.dart';
|
||||
import 'package:wolf_dart/classes/linear_coordinates.dart';
|
||||
import 'package:wolf_dart/classes/matrix.dart';
|
||||
import 'package:wolf_dart/features/difficulty/difficulty.dart';
|
||||
import 'package:wolf_dart/features/entities/collectible.dart';
|
||||
import 'package:wolf_dart/features/entities/enemies/enemy.dart';
|
||||
import 'package:wolf_dart/features/entities/entity.dart';
|
||||
import 'package:wolf_dart/features/entities/entity_registry.dart';
|
||||
import 'package:wolf_dart/features/map/wolf_map.dart';
|
||||
import 'package:wolf_dart/features/player/player.dart';
|
||||
import 'package:wolf_dart/features/renderer/raycast_painter.dart';
|
||||
import 'package:wolf_dart/sprite_gallery.dart';
|
||||
|
||||
@@ -38,13 +40,11 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
|
||||
final double fov = math.pi / 3;
|
||||
|
||||
late LinearCoordinates player;
|
||||
late double playerAngle;
|
||||
late Player player;
|
||||
|
||||
bool _isLoading = true;
|
||||
bool _spaceWasPressed = false;
|
||||
|
||||
int playerHealth = 100;
|
||||
double damageFlashOpacity = 0.0;
|
||||
|
||||
List<Entity> entities = [];
|
||||
@@ -76,17 +76,26 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
|
||||
// Player Spawn
|
||||
if (objId >= 19 && objId <= 22) {
|
||||
player = (x: x + 0.5, y: y + 0.5);
|
||||
double spawnAngle = 0.0;
|
||||
switch (objId) {
|
||||
case 19:
|
||||
playerAngle = 3 * math.pi / 2;
|
||||
spawnAngle = 3 * math.pi / 2;
|
||||
break;
|
||||
case 20:
|
||||
playerAngle = 0.0;
|
||||
spawnAngle = 0.0;
|
||||
break;
|
||||
case 21:
|
||||
playerAngle = math.pi / 2;
|
||||
spawnAngle = math.pi / 2;
|
||||
break;
|
||||
case 22:
|
||||
playerAngle = math.pi;
|
||||
spawnAngle = math.pi;
|
||||
break;
|
||||
}
|
||||
player = Player(
|
||||
x: x + 0.5,
|
||||
y: y + 0.5,
|
||||
angle: spawnAngle,
|
||||
);
|
||||
} else {
|
||||
Entity? newEntity = EntityRegistry.spawn(
|
||||
objId,
|
||||
@@ -160,7 +169,8 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
}
|
||||
}
|
||||
}
|
||||
player = nearestSafeSpot;
|
||||
player.x = nearestSafeSpot.x;
|
||||
player.y = nearestSafeSpot.y;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,21 +207,21 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
final pressedKeys = HardwareKeyboard.instance.logicalKeysPressed;
|
||||
|
||||
if (pressedKeys.contains(LogicalKeyboardKey.keyW)) {
|
||||
moveStepX += math.cos(playerAngle) * moveSpeed;
|
||||
moveStepY += math.sin(playerAngle) * moveSpeed;
|
||||
moveStepX += math.cos(player.angle) * moveSpeed;
|
||||
moveStepY += math.sin(player.angle) * moveSpeed;
|
||||
}
|
||||
if (pressedKeys.contains(LogicalKeyboardKey.keyS)) {
|
||||
moveStepX -= math.cos(playerAngle) * moveSpeed;
|
||||
moveStepY -= math.sin(playerAngle) * moveSpeed;
|
||||
moveStepX -= math.cos(player.angle) * moveSpeed;
|
||||
moveStepY -= math.sin(player.angle) * moveSpeed;
|
||||
}
|
||||
if (pressedKeys.contains(LogicalKeyboardKey.keyA)) {
|
||||
playerAngle -= turnSpeed;
|
||||
player.angle -= turnSpeed;
|
||||
}
|
||||
if (pressedKeys.contains(LogicalKeyboardKey.keyD)) {
|
||||
playerAngle += turnSpeed;
|
||||
player.angle += turnSpeed;
|
||||
}
|
||||
if (playerAngle < 0) playerAngle += 2 * math.pi;
|
||||
if (playerAngle > 2 * math.pi) playerAngle -= 2 * math.pi;
|
||||
if (player.angle < 0) player.angle += 2 * math.pi;
|
||||
if (player.angle > 2 * math.pi) player.angle -= 2 * math.pi;
|
||||
|
||||
// 2. UPDATED WALL COLLISION
|
||||
const double margin = 0.3;
|
||||
@@ -221,7 +231,7 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
: (newX - margin).toInt();
|
||||
|
||||
if (_isWalkable(checkX, player.y.toInt())) {
|
||||
player = (x: newX, y: player.y);
|
||||
player.x = newX;
|
||||
}
|
||||
|
||||
double newY = player.y + moveStepY;
|
||||
@@ -230,15 +240,15 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
: (newY - margin).toInt();
|
||||
|
||||
if (_isWalkable(player.x.toInt(), checkY)) {
|
||||
player = (x: player.x, y: newY);
|
||||
player.y = newY;
|
||||
}
|
||||
|
||||
// 3. UPDATED DOOR INTERACTION
|
||||
bool isSpacePressed = pressedKeys.contains(LogicalKeyboardKey.space);
|
||||
|
||||
if (isSpacePressed && !_spaceWasPressed) {
|
||||
int targetX = (player.x + math.cos(playerAngle)).toInt();
|
||||
int targetY = (player.y + math.sin(playerAngle)).toInt();
|
||||
int targetX = (player.x + math.cos(player.angle)).toInt();
|
||||
int targetY = (player.y + math.sin(player.angle)).toInt();
|
||||
|
||||
if (targetY > 0 &&
|
||||
targetY < currentLevel.length &&
|
||||
@@ -256,15 +266,37 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
_spaceWasPressed = isSpacePressed;
|
||||
|
||||
// --- 4. UPDATE ENTITY LOGIC ---
|
||||
List<Entity> itemsToRemove = []; // Collect items to delete after the loop
|
||||
|
||||
for (Entity entity in entities) {
|
||||
if (entity is Enemy) {
|
||||
entity.update(
|
||||
elapsedMs: elapsed.inMilliseconds,
|
||||
player: player,
|
||||
player: player.position,
|
||||
isWalkable: _isWalkable,
|
||||
onDamagePlayer: _takeDamage,
|
||||
);
|
||||
}
|
||||
// NEW: Add Collectible Interaction Logic
|
||||
else if (entity is Collectible) {
|
||||
double dx = player.x - entity.x;
|
||||
double dy = player.y - entity.y;
|
||||
double dist = math.sqrt(dx * dx + dy * dy);
|
||||
|
||||
// If player is close enough to the item
|
||||
if (dist < 0.5) {
|
||||
if (player.tryPickup(entity)) {
|
||||
itemsToRemove.add(entity);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove the items that were successfully picked up
|
||||
if (itemsToRemove.isNotEmpty) {
|
||||
setState(() {
|
||||
entities.removeWhere((e) => itemsToRemove.contains(e));
|
||||
});
|
||||
}
|
||||
|
||||
// Fade out the damage flash smoothly
|
||||
@@ -277,11 +309,8 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
|
||||
// A helper method to handle getting shot
|
||||
void _takeDamage(int damage) {
|
||||
playerHealth -= damage;
|
||||
damageFlashOpacity = 0.5; // Trigger the red flash
|
||||
if (playerHealth <= 0) {
|
||||
print("YOU DIED! (We should add a game over screen later)");
|
||||
}
|
||||
player.takeDamage(damage);
|
||||
damageFlashOpacity = 0.5;
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -310,7 +339,6 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
map: currentLevel,
|
||||
textures: gameMap.textures,
|
||||
player: player,
|
||||
playerAngle: playerAngle,
|
||||
fov: fov,
|
||||
doorOffsets: doorOffsets,
|
||||
entities: entities,
|
||||
|
||||
Reference in New Issue
Block a user