Spaces:
Running
Running
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); | |
} | |
} |