team9 / static /game /elmnts /character.js
cosimotaiuti's picture
Upload 114 files
601f069 verified
class Character {
constructor(gameState, characterImg) {
this.gameState = gameState;
this.characterImg = characterImg;
this.characterPos = null;
this.previousPos = null;
this.path = [];
this.isMoving = false;
this.moveInterval = null;
this.img = characterImg;
this.speed = 270;
}
getCharacterPosition() {
return this.characterPos;
}
moving_check() {
}
setCharacterPosition(pos) {
this.characterPos = pos;
}
getCurrentRoom() {
if (!this.characterPos) return null;
// Check each room's boundaries to find which room contains the current position
for (const room of this.gameState.map_data.rooms) {
if (this.characterPos.x >= room.start_col &&
this.characterPos.x <= room.end_col &&
this.characterPos.y >= room.start_row &&
this.characterPos.y <= room.end_row) {
return room.name;
}
}
return null; // Return null if not in any room
}
drawPath(CELL_SIZE) {
if (this.path.length > 0 && this.isMoving) {
noFill();
stroke(255, 0, 0);
strokeWeight(2);
line(
this.characterPos.x * CELL_SIZE + CELL_SIZE / 2,
this.characterPos.y * CELL_SIZE + CELL_SIZE / 2,
this.path[0].x * CELL_SIZE + CELL_SIZE / 2,
this.path[0].y * CELL_SIZE + CELL_SIZE / 2
);
for (let i = 0; i < this.path.length - 1; i++) {
line(
this.path[i].x * CELL_SIZE + CELL_SIZE / 2,
this.path[i].y * CELL_SIZE + CELL_SIZE / 2,
this.path[i + 1].x * CELL_SIZE + CELL_SIZE / 2,
this.path[i + 1].y * CELL_SIZE + CELL_SIZE / 2
);
}
strokeWeight(1);
}
}
moveCharacterAlongPath(callback=null) {
if (this.moveInterval) {
clearInterval(this.moveInterval);
}
this.isMoving = true;
this.moveInterval = setInterval(() => {
if (this.path.length === 0) {
this.isMoving = false;
clearInterval(this.moveInterval);
if (callback) callback();
return;
}
this.previousPos = { ...this.characterPos };
const nextPos = this.path.shift();
this.characterPos = nextPos;
this.moving_check();
}, this.speed);
}
findPath(start, end) {
const queue = [[start]];
const visited = new Set();
const key = pos => `${pos.x},${pos.y}`;
visited.add(key(start));
while (queue.length > 0) {
const currentPath = queue.shift();
const current = currentPath[currentPath.length - 1];
if (current.x === end.x && current.y === end.y) {
return currentPath;
}
const neighbors = [
{ x: current.x, y: current.y - 1 },
{ x: current.x + 1, y: current.y },
{ x: current.x, y: current.y + 1 },
{ x: current.x - 1, y: current.y }
];
for (const next of neighbors) {
if (next.x < 0 || next.x >= GRID_COLS || next.y < 0 || next.y >= GRID_ROWS) continue;
if (visited.has(key(next))) continue;
const cell = this.gameState.map_data.grid[next.y][next.x];
if (cell.type === 'wall') continue;
visited.add(key(next));
queue.push([...currentPath, next]);
}
}
return [];
}
moveToPosition(pos,callback=null) {
if (!pos || !this.characterPos) return false;
this.path = this.findPath(this.characterPos, pos);
if (this.path.length > 0) {
this.isMoving = true;
this.moveCharacterAlongPath(callback);
return true;
}
return false;
}
// Movement methods
moveToRoom(roomName) {
const targetRoom = this.gameState.map_data.rooms
.find(room => room.name.toLowerCase() === roomName.toLowerCase());
if (!targetRoom || !this.characterPos) return false;
const destination = targetRoom.label_position;
if (!destination) return false;
this.moveToPosition(destination);
}
}