75 lines
2.4 KiB
JavaScript
75 lines
2.4 KiB
JavaScript
import Base from '../objects/Base.js';
|
||
import Bullet from '../objects/Bullet.js';
|
||
import Enemy from '../objects/Enemy.js';
|
||
import LevelManager from '../managers/LevelManager.js';
|
||
import XPManager from '../managers/XPManager.js';
|
||
import SpawnManager from '../managers/SpawnManager.js';
|
||
import UIManager from '../managers/UIManager.js';
|
||
import { ASSET_PATH } from '../config.js';
|
||
|
||
export default class GameScene extends Phaser.Scene {
|
||
constructor() { super('Game'); }
|
||
|
||
preload() {
|
||
// Spritesheets
|
||
this.load.spritesheet('base', `${ASSET_PATH}sprites/base_spritesheet.png`, { frameWidth:128, frameHeight:128 });
|
||
this.load.spritesheet('enemy', `${ASSET_PATH}sprites/enemy_spritesheet.png`, { frameWidth:96, frameHeight:96 });
|
||
this.load.image('bullet', `${ASSET_PATH}sprites/bullet.png`);
|
||
|
||
// Audio
|
||
this.load.audio('shoot', `${ASSET_PATH}audio/shoot.mp3`);
|
||
this.load.audio('explosion', `${ASSET_PATH}audio/explosion.wav`);
|
||
|
||
// JSON data
|
||
this.load.json('levels', `${ASSET_PATH}data/levels.json`);
|
||
this.load.json('units', `${ASSET_PATH}data/units.json`);
|
||
}
|
||
|
||
create() {
|
||
// Managers
|
||
this.xpManager = new XPManager(this);
|
||
this.levelManager = new LevelManager(this, this.cache.json.get('levels'));
|
||
this.spawnManager = new SpawnManager(this, this.cache.json.get('units'));
|
||
this.uiManager = new UIManager(this, this.xpManager);
|
||
|
||
// Groups
|
||
this.enemies = this.physics.add.group();
|
||
this.bullets = this.physics.add.group();
|
||
|
||
// Base (center‑bottom)
|
||
const baseX = this.scale.width / 2;
|
||
const baseY = this.scale.height - 80;
|
||
this.base = new Base(this, baseX, baseY, 'base');
|
||
this.add.existing(this.base);
|
||
|
||
// Collisions
|
||
this.physics.add.overlap(this.bullets, this.enemies, this.handleBulletHit, null, this);
|
||
this.physics.add.overlap(this.enemies, this.base, this.handleEnemyReachBase, null, this);
|
||
|
||
// Start first level
|
||
this.levelManager.startLevel(1);
|
||
this.spawnManager.startSpawning(this.levelManager.currentConfig.spawnInterval);
|
||
}
|
||
|
||
update(time, delta) {
|
||
this.base.update(time, delta);
|
||
}
|
||
|
||
handleBulletHit(bullet, enemy) {
|
||
bullet.destroy();
|
||
enemy.takeDamage(bullet.damage);
|
||
if (enemy.isDead()) {
|
||
this.xpManager.addXP(enemy.xpValue);
|
||
enemy.destroy();
|
||
}
|
||
}
|
||
|
||
handleEnemyReachBase(enemy, base) {
|
||
base.takeDamage(enemy.collisionDamage || 20);
|
||
enemy.destroy();
|
||
if (base.isDestroyed()) {
|
||
this.scene.start('GameOver');
|
||
}
|
||
}
|
||
}
|