You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
4.6 KiB
179 lines
4.6 KiB
import Phaser from "phaser";
|
|
import bg from "./images/bg.png";
|
|
import bottom from "./images/bottom.png";
|
|
import bottomMap from "./images/bottom.json";
|
|
import { fishFrames, cannonsFrames } from "./assets";
|
|
|
|
export default class Scene extends Phaser.Scene {
|
|
constructor() {
|
|
super({
|
|
key: "scene",
|
|
});
|
|
}
|
|
|
|
preload() {
|
|
this.load.image("bg", bg);
|
|
this.load.atlas("bottom", bottom, bottomMap);
|
|
Object.entries(fishFrames).forEach(
|
|
([k, { url, frameWidth, frameHeight }]) => {
|
|
this.load.spritesheet(k, url, { frameWidth, frameHeight });
|
|
}
|
|
);
|
|
Object.entries(cannonsFrames).forEach(
|
|
([k, { url, frameWidth, frameHeight }]) => {
|
|
this.load.spritesheet(k, url, { frameWidth, frameHeight });
|
|
}
|
|
);
|
|
}
|
|
get cannon() {
|
|
return this.cannons[this.cannonIndex];
|
|
}
|
|
create() {
|
|
this.layout();
|
|
this.addListeners();
|
|
this.animateFishes();
|
|
this.animateCannons();
|
|
this.addCannon();
|
|
this.addFish();
|
|
}
|
|
animateCannons() {
|
|
Object.entries(cannonsFrames).forEach(([k, { anims }]) => {
|
|
this.anims.create({
|
|
key: `${k}_fire`,
|
|
frames: this.anims.generateFrameNumbers(k, anims),
|
|
frameRate: 10,
|
|
repeat: 0,
|
|
});
|
|
});
|
|
}
|
|
animateFishes() {
|
|
Object.entries(fishFrames).forEach(([k, { swim, capture }]) => {
|
|
this.anims.create({
|
|
key: `${k}_swim`,
|
|
frames: this.anims.generateFrameNumbers(k, swim),
|
|
frameRate: 10,
|
|
repeat: -1,
|
|
});
|
|
this.anims.create({
|
|
key: `${k}_capture`,
|
|
frames: this.anims.generateFrameNumbers(k, capture),
|
|
frameRate: 10,
|
|
repeat: -1,
|
|
});
|
|
});
|
|
}
|
|
layout() {
|
|
this.addBg();
|
|
this.addBottomBar();
|
|
}
|
|
addListeners() {
|
|
this.input.on(
|
|
"gameobjectdown",
|
|
(_, obj) => {
|
|
switch (obj.name) {
|
|
case "minus":
|
|
obj.setFrame("cannon_minus_down.png");
|
|
break;
|
|
case "plus":
|
|
obj.setFrame("cannon_plus_down.png");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
},
|
|
this
|
|
);
|
|
this.input.on(
|
|
"gameobjectup",
|
|
(pointer, obj) => {
|
|
switch (obj.name) {
|
|
case "minus":
|
|
obj.setFrame("cannon_minus.png");
|
|
break;
|
|
case "plus":
|
|
obj.setFrame("cannon_plus.png");
|
|
break;
|
|
case "bg":
|
|
const theta = Math.atan2(
|
|
this.game.config.height - pointer.y,
|
|
this.game.config.width / 2 - pointer.x
|
|
);
|
|
this.cannon.setRotation(theta - Math.PI / 2);
|
|
this.cannon.anims.play(`${this.cannon.name}_fire`, true);
|
|
default:
|
|
break;
|
|
}
|
|
},
|
|
this
|
|
);
|
|
}
|
|
addBg() {
|
|
const bg = this.add.image(0, 0, "bg");
|
|
bg.name = "bg";
|
|
bg.setOrigin(0);
|
|
bg.displayWidth = this.game.config.width;
|
|
bg.displayHeight = this.game.config.height;
|
|
bg.setInteractive();
|
|
}
|
|
addBottomBar() {
|
|
const bottomBar = this.add.image(
|
|
this.game.config.width / 2,
|
|
this.game.config.height - 45,
|
|
"bottom",
|
|
"bottom-bar.png"
|
|
);
|
|
bottomBar.displayWidth = 958;
|
|
bottomBar.displayHeight = 90;
|
|
const minus = this.add.image(
|
|
this.game.config.width / 2 - 40,
|
|
this.game.config.height - 50,
|
|
"bottom",
|
|
"cannon_minus.png"
|
|
);
|
|
minus.name = "minus";
|
|
minus.setOrigin(0);
|
|
minus.displayWidth = 55;
|
|
minus.displayHeight = 38;
|
|
minus.setInteractive();
|
|
const plus = this.add.image(
|
|
this.game.config.width / 2 + 95,
|
|
this.game.config.height - 50,
|
|
"bottom",
|
|
"cannon_plus.png"
|
|
);
|
|
plus.name = "plus";
|
|
plus.setOrigin(0);
|
|
plus.displayWidth = 55;
|
|
plus.displayHeight = 38;
|
|
plus.setInteractive();
|
|
}
|
|
addFish() {
|
|
Object.entries(fishFrames).forEach(([k, { size, offsets }]) => {
|
|
const fish = this.physics.add.sprite(
|
|
(Math.random() * this.game.config.width) / 2 +
|
|
this.game.config.width / 4,
|
|
(Math.random() * this.game.config.width) / 2 +
|
|
this.game.config.width / 4,
|
|
"fish1"
|
|
);
|
|
fish.body.setSize(...size);
|
|
fish.body.setOffset(...offsets);
|
|
fish.anims.play(`${k}_swim`, true);
|
|
});
|
|
}
|
|
addCannon() {
|
|
this.cannonIndex = 0;
|
|
const [k, { size, offsets }] = Object.entries(cannonsFrames)[
|
|
this.cannonIndex
|
|
];
|
|
const cannon = this.physics.add.sprite(
|
|
this.game.config.width / 2 + 55,
|
|
this.game.config.height - 50,
|
|
k
|
|
);
|
|
cannon.body.setSize(...size);
|
|
cannon.body.setOffset(...offsets);
|
|
cannon.name = k;
|
|
this.cannon = cannon;
|
|
}
|
|
}
|
|
|