feat: Add scene with track loop and mine cart
This commit is contained in:
62
src/engine/systems/MineCartSystem.ts
Normal file
62
src/engine/systems/MineCartSystem.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
import Phaser from "phaser";
|
||||
import { GAME_CONFIG } from "../../core/config/GameConfig";
|
||||
import { TrackDirection } from "./TrackSystem";
|
||||
|
||||
export interface MineCartState {
|
||||
x: number;
|
||||
y: number;
|
||||
facing: { dx: number, dy: number };
|
||||
}
|
||||
|
||||
export class MineCartSystem {
|
||||
static updateOrientation(sprite: Phaser.GameObjects.Sprite, dx: number, dy: number, _connections: TrackDirection) {
|
||||
const { mineCarts } = GAME_CONFIG.rendering;
|
||||
|
||||
// Horizontal movement
|
||||
if (dx !== 0 && dy === 0) {
|
||||
sprite.setFrame(mineCarts.horizontal);
|
||||
sprite.setFlipX(dx < 0);
|
||||
sprite.setAngle(0);
|
||||
}
|
||||
// Vertical movement
|
||||
else if (dy !== 0 && dx === 0) {
|
||||
sprite.setFrame(mineCarts.vertical);
|
||||
sprite.setFlipY(false);
|
||||
sprite.setAngle(0);
|
||||
}
|
||||
// Turning (Corner case)
|
||||
else {
|
||||
sprite.setFrame(mineCarts.turning);
|
||||
// Logic for 56 (turned from right to down by default)
|
||||
// We need to rotate/flip to match the actual turn.
|
||||
// This is a bit complex without seeing the sprite, but we'll approximate:
|
||||
if (dx > 0 && dy > 0) sprite.setAngle(0); // Right to Down
|
||||
if (dx < 0 && dy < 0) sprite.setAngle(180); // Left to Up
|
||||
if (dx > 0 && dy < 0) sprite.setAngle(-90); // Right to Up
|
||||
if (dx < 0 && dy > 0) sprite.setAngle(90); // Left to Down
|
||||
}
|
||||
}
|
||||
|
||||
static getNextPosition(current: { x: number, y: number }, dx: number, dy: number, isTrack: (x: number, y: number) => boolean): { x: number, y: number, dx: number, dy: number } | null {
|
||||
const nextX = current.x + dx;
|
||||
const nextY = current.y + dy;
|
||||
|
||||
if (isTrack(nextX, nextY)) {
|
||||
return { x: nextX, y: nextY, dx, dy };
|
||||
}
|
||||
|
||||
// Try turning if blocked
|
||||
const possibleTurns = [
|
||||
{ tdx: dy, tdy: -dx }, // Left turn
|
||||
{ tdx: -dy, tdy: dx } // Right turn
|
||||
];
|
||||
|
||||
for (const turn of possibleTurns) {
|
||||
if (isTrack(current.x + turn.tdx, current.y + turn.tdy)) {
|
||||
return { x: current.x + turn.tdx, y: current.y + turn.tdy, dx: turn.tdx, dy: turn.tdy };
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user