Use cannonball image for broadside projectiles
This commit is contained in:
parent
cdd5963e0f
commit
e85920f4f3
@ -2,6 +2,7 @@ import Phaser from 'phaser';
|
|||||||
import './style.css';
|
import './style.css';
|
||||||
import airshipSheetUrl from './assets/airships.svg?url';
|
import airshipSheetUrl from './assets/airships.svg?url';
|
||||||
import explosionSheetUrl from './assets/explosions.svg?url';
|
import explosionSheetUrl from './assets/explosions.svg?url';
|
||||||
|
import cannonballUrl from './assets/cannonball.png?url';
|
||||||
import { airshipLog, registerDebugSnapshot } from './diagnostics.js';
|
import { airshipLog, registerDebugSnapshot } from './diagnostics.js';
|
||||||
import {
|
import {
|
||||||
DEFAULT_PIRATE_SHOT_DAMAGE,
|
DEFAULT_PIRATE_SHOT_DAMAGE,
|
||||||
@ -80,12 +81,12 @@ class GameScene extends Phaser.Scene {
|
|||||||
frameWidth: 64,
|
frameWidth: 64,
|
||||||
frameHeight: 64,
|
frameHeight: 64,
|
||||||
});
|
});
|
||||||
|
this.load.image('cannonball', cannonballUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
create() {
|
create() {
|
||||||
this.physics.world.setBounds(0, 0, WORLD_SIZE, WORLD_SIZE);
|
this.physics.world.setBounds(0, 0, WORLD_SIZE, WORLD_SIZE);
|
||||||
this.drawWorld();
|
this.drawWorld();
|
||||||
this.createTextures();
|
|
||||||
this.createAnimations();
|
this.createAnimations();
|
||||||
|
|
||||||
this.player = this.physics.add.sprite(1200, 1550, 'airships', 0);
|
this.player = this.physics.add.sprite(1200, 1550, 'airships', 0);
|
||||||
@ -359,24 +360,6 @@ class GameScene extends Phaser.Scene {
|
|||||||
island2.fillEllipse(1940, 1830, 210, 112);
|
island2.fillEllipse(1940, 1830, 210, 112);
|
||||||
}
|
}
|
||||||
|
|
||||||
createTextures() {
|
|
||||||
const playerShot = this.make.graphics({ x: 0, y: 0, add: false });
|
|
||||||
playerShot.fillStyle(0xffd36a, 1);
|
|
||||||
playerShot.fillCircle(5, 5, 5);
|
|
||||||
playerShot.lineStyle(1, 0xfff0b0, 1);
|
|
||||||
playerShot.strokeCircle(5, 5, 4);
|
|
||||||
playerShot.generateTexture('player-shot', 10, 10);
|
|
||||||
playerShot.destroy();
|
|
||||||
|
|
||||||
const pirateShot = this.make.graphics({ x: 0, y: 0, add: false });
|
|
||||||
pirateShot.fillStyle(0xff6b62, 1);
|
|
||||||
pirateShot.fillCircle(5, 5, 5);
|
|
||||||
pirateShot.lineStyle(1, 0xffb0aa, 1);
|
|
||||||
pirateShot.strokeCircle(5, 5, 4);
|
|
||||||
pirateShot.generateTexture('pirate-shot', 10, 10);
|
|
||||||
pirateShot.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
update(_time, deltaMs) {
|
update(_time, deltaMs) {
|
||||||
const dt = Math.min(deltaMs / 1000, 0.05);
|
const dt = Math.min(deltaMs / 1000, 0.05);
|
||||||
const hadQueuedPlayerHit = this.pendingPlayerHits.length > 0;
|
const hadQueuedPlayerHit = this.pendingPlayerHits.length > 0;
|
||||||
@ -521,7 +504,7 @@ class GameScene extends Phaser.Scene {
|
|||||||
|
|
||||||
if (distance < broadsideRange && broadsideError < broadsideTolerance && this.time.now - lastShot > reloadMs) {
|
if (distance < broadsideRange && broadsideError < broadsideTolerance && this.time.now - lastShot > reloadMs) {
|
||||||
const side = relative >= 0 ? 1 : -1;
|
const side = relative >= 0 ? 1 : -1;
|
||||||
this.fireBroadside(pirate, side, this.pirateShots, 'pirate-shot', projectileDamage, 0.9);
|
this.fireBroadside(pirate, side, this.pirateShots, 'cannonball', projectileDamage, 0.9);
|
||||||
pirate.setData('lastShot', this.time.now);
|
pirate.setData('lastShot', this.time.now);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -530,7 +513,7 @@ class GameScene extends Phaser.Scene {
|
|||||||
playerBroadside(side) {
|
playerBroadside(side) {
|
||||||
const broadside = side < 0 ? 'port' : 'starboard';
|
const broadside = side < 0 ? 'port' : 'starboard';
|
||||||
if (this.time.now - this.lastPlayerShot[broadside] < this.playerBroadsideReloadMs) return;
|
if (this.time.now - this.lastPlayerShot[broadside] < this.playerBroadsideReloadMs) return;
|
||||||
this.fireBroadside(this.player, side, this.playerShots, 'player-shot', 16, 1.0);
|
this.fireBroadside(this.player, side, this.playerShots, 'cannonball', 16, 1.0);
|
||||||
this.lastPlayerShot[broadside] = this.time.now;
|
this.lastPlayerShot[broadside] = this.time.now;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -554,7 +537,7 @@ class GameScene extends Phaser.Scene {
|
|||||||
const x = ship.x + Math.cos(base) * 34;
|
const x = ship.x + Math.cos(base) * 34;
|
||||||
const y = ship.y + Math.sin(base) * 34;
|
const y = ship.y + Math.sin(base) * 34;
|
||||||
const shot = group.create(x, y, texture);
|
const shot = group.create(x, y, texture);
|
||||||
shot.setDepth(8);
|
shot.setDepth(8).setDisplaySize(14, 14);
|
||||||
shot.body.setAllowGravity(false);
|
shot.body.setAllowGravity(false);
|
||||||
shot.setData('bornAt', this.time.now);
|
shot.setData('bornAt', this.time.now);
|
||||||
shot.setData('damage', projectileDamage);
|
shot.setData('damage', projectileDamage);
|
||||||
|
|||||||
@ -182,6 +182,18 @@ test('player firing and reload HUD share one reload duration source', async () =
|
|||||||
assert.match(source, /Math\.max\(1, this\.playerBroadsideReloadMs\)/);
|
assert.match(source, /Math\.max\(1, this\.playerBroadsideReloadMs\)/);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('player and pirate broadsides use the cannonball image asset', async () => {
|
||||||
|
const source = await read('src/game-v4.js');
|
||||||
|
|
||||||
|
assert.match(source, /import cannonballUrl from '.\/assets\/cannonball\.png\?url'/);
|
||||||
|
assert.match(source, /this\.load\.image\('cannonball', cannonballUrl\)/);
|
||||||
|
assert.match(source, /this\.fireBroadside\(this\.player, side, this\.playerShots, 'cannonball'/);
|
||||||
|
assert.match(source, /this\.fireBroadside\(pirate, side, this\.pirateShots, 'cannonball'/);
|
||||||
|
assert.match(source, /shot\.setDepth\(8\)\.setDisplaySize\(14, 14\)/);
|
||||||
|
assert.doesNotMatch(source, /generateTexture\('player-shot'/);
|
||||||
|
assert.doesNotMatch(source, /generateTexture\('pirate-shot'/);
|
||||||
|
});
|
||||||
|
|
||||||
test('mobile HUD skips hidden Phaser rendering and throttles DOM state publishing', async () => {
|
test('mobile HUD skips hidden Phaser rendering and throttles DOM state publishing', async () => {
|
||||||
const source = await read('src/game-v4.js');
|
const source = await read('src/game-v4.js');
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user