134 lines
4.4 KiB
JavaScript
134 lines
4.4 KiB
JavaScript
import { Player } from '../player.js';
|
|
import { CycleManager } from '../cycle.js';
|
|
import { ObjectManager } from '../objects.js';
|
|
import { InventoryManager } from '../inventory.js';
|
|
|
|
export class Game extends Phaser.Scene {
|
|
constructor() {
|
|
super({ key: 'Game' });
|
|
this.cycleManager = null;
|
|
this.objectManager = null;
|
|
this.mainLayer = null;
|
|
}
|
|
|
|
preload() {
|
|
this.load.tilemapTiledJSON('game-map', 'assets/game-map.json');
|
|
this.load.spritesheet('player', 'assets/images/player.png', {
|
|
frameWidth: 100,
|
|
frameHeight: 100
|
|
});
|
|
this.load.spritesheet('objects', 'assets/images/objects.png', {
|
|
frameWidth: 100,
|
|
frameHeight: 100
|
|
});
|
|
|
|
// Images
|
|
this.load.image('terrain-tileset', 'assets/images/terrain.png');
|
|
this.load.image('backpack', 'assets/images/backpack.png');
|
|
this.load.image('inventory', 'assets/images/inventory.png');
|
|
this.load.image('craftDrop', 'assets/images/craftDrop.png');
|
|
// FX
|
|
this.load.audio('chop', 'assets/fx/chop.mp3');
|
|
this.load.audio('zip', 'assets/fx/zip.mp3');
|
|
this.load.audio('inventory', 'assets/fx/inventory.mp3');
|
|
|
|
// Music
|
|
this.load.audio('bgMusic', 'assets/music/bgMusic.mp3');
|
|
}
|
|
|
|
create() {
|
|
// Create tilemap
|
|
const map = this.make.tilemap({ key: 'game-map' });
|
|
|
|
// Add tileset to map
|
|
const terrainTileset = map.addTilesetImage('terrain', 'terrain-tileset');
|
|
|
|
// Create layer named "main"
|
|
this.mainLayer = map.createLayer('main', terrainTileset, 0, 0)
|
|
.setCollisionByProperty({ collides: true });
|
|
|
|
// Set world bounds based on tilemap dimensions
|
|
const worldWidth = map.widthInPixels;
|
|
const worldHeight = map.heightInPixels;
|
|
this.physics.world.setBounds(0, 0, worldWidth, worldHeight);
|
|
|
|
// Initialize object manager
|
|
this.objects = this.physics.add.group();
|
|
this.items = this.physics.add.group();
|
|
this.objectManager = new ObjectManager(this);
|
|
this.objectManager.init();
|
|
|
|
// Create player at center of screen
|
|
this.player = new Player(this, 1600, 3100);
|
|
|
|
// Initialize inventory manager
|
|
this.inventoryManager = new InventoryManager(this);
|
|
this.inventoryManager.init();
|
|
|
|
// Physics Collisions
|
|
this.physics.add.collider(this.player, this.mainLayer);
|
|
this.physics.add.collider(this.player, this.objects, (player, object) => {
|
|
player.stop();
|
|
this.objectManager.takeDamage(object, player);
|
|
});
|
|
this.physics.add.collider(this.player, this.items, (player, item) => {
|
|
if (item.props.collected === true) {
|
|
return;
|
|
}
|
|
item.props.collected = true;
|
|
player.stop();
|
|
this.inventoryManager.addItem(item);
|
|
const cam = this.cameras.main.worldView;
|
|
this.sound.play('zip');
|
|
this.tweens.add({
|
|
targets: item,
|
|
x: cam.x+cam.width-150,
|
|
y: cam.y+cam.height-150,
|
|
duration: 500,
|
|
onComplete: () => {
|
|
this.sound.play('inventory');
|
|
item.destroy();
|
|
}
|
|
});
|
|
});
|
|
|
|
// Make camera follow the player
|
|
this.cameras.main.startFollow(this.player);
|
|
this.cameras.main.setBounds(0, 0, worldWidth, worldHeight);
|
|
|
|
// Initialize cycle manager
|
|
this.cycleManager = new CycleManager(this);
|
|
this.cycleManager.init();
|
|
|
|
// Background Music
|
|
this.bgMusic = this.sound.add('bgMusic', { volume: 0.5 });
|
|
this.bgMusic.loop = true;
|
|
this.bgMusic.play();
|
|
}
|
|
|
|
update(time, delta) {
|
|
// Update player
|
|
if (this.player) {
|
|
this.player.update();
|
|
}
|
|
|
|
// Update cycle manager
|
|
if (this.cycleManager) {
|
|
this.cycleManager.update(delta);
|
|
|
|
// Apply tint to main layer when needed
|
|
if (this.mainLayer && this.cycleManager.getCurrentCycle() !== 'day') {
|
|
this.cycleManager.applyTint(this.mainLayer);
|
|
}
|
|
}
|
|
|
|
// Update object manager
|
|
if (this.objectManager) {
|
|
this.objectManager.update(delta);
|
|
}
|
|
|
|
if (this.inventoryManager) {
|
|
this.inventoryManager.update(delta);
|
|
}
|
|
}
|
|
} |