From 60f77c36a957ec32e3f97ba03ccce76e2dfe3d6f Mon Sep 17 00:00:00 2001 From: asraelite Date: Wed, 7 Mar 2018 14:51:18 +0000 Subject: [PATCH] Add crashing --- dist/audio/crash2.mp3 | Bin 0 -> 10160 bytes js/assets.mjs | 8 +++++--- js/consts.mjs | 1 + js/game/control.mjs | 6 +++++- js/game/events.mjs | 9 ++++++++- js/game/index.mjs | 7 ++++--- js/graphics/world.mjs | 1 + js/world/particle.mjs | 31 +++++++++++++++++++++++++++++++ js/world/ship.mjs | 14 ++++++++++++-- 9 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 dist/audio/crash2.mp3 diff --git a/dist/audio/crash2.mp3 b/dist/audio/crash2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a9101fc397a1f58b616101a8eba20316770c22c3 GIT binary patch literal 10160 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 e{YL?la-HfQQ{D^x|EJ1YV**8 literal 0 HcmV?d00001 diff --git a/js/assets.mjs b/js/assets.mjs index ccabc99..1e5672b 100644 --- a/js/assets.mjs +++ b/js/assets.mjs @@ -40,7 +40,9 @@ export const audio = { endEdit: 'release1.mp3', newPlanet: 'up2.mp3', engine: 'rocket2.ogg', - music: 'music2.mp3' + music: 'music2.mp3', + toss: 'thunk1.mp3', + crash: 'crash2.mp3' }; export async function init() { @@ -52,7 +54,7 @@ export async function init() { parse(images, str => { let img = new Image(); img.src = 'img/' + str; - promises.push(new Promise((res, rej) => { + promises.push(new Promise((res) => { img.addEventListener('load', res); })); return img; @@ -61,7 +63,7 @@ export async function init() { let audio = new Howl({ src: ['audio/' + str] }); - promises.push(new Promise((res, rej) => { + promises.push(new Promise((res) => { audio.once('load', res); })); return audio; diff --git a/js/consts.mjs b/js/consts.mjs index 47d44bc..fabe2f8 100644 --- a/js/consts.mjs +++ b/js/consts.mjs @@ -22,6 +22,7 @@ export const ZOOM_SPEED = 0.01; // Ship landing. Angle in radians. export const TIP_ANGLE = 0.25; export const TIP_SPEED = 0.03; +export const CRASH_SPEED = 0.7; // Ship flight mechanics. Speed measured in units per tick. export const FUEL_BURN_RATE = 0.3; export const THRUST_POWER = 0.004; diff --git a/js/game/control.mjs b/js/game/control.mjs index 53411e6..47fbc1b 100644 --- a/js/game/control.mjs +++ b/js/game/control.mjs @@ -26,7 +26,7 @@ export function tick() { if (state.editing) { tickEditing(); - } else if (state.playing) { + } else if (state.playing && !state.gameOver) { tickPlaying(); } @@ -36,6 +36,10 @@ export function tick() { } } + if (state.gameOver) { + audio.stop('engine'); + } + if (pressed[mapping.toggleMusic]) { audio.toggle('music'); } diff --git a/js/game/events.mjs b/js/game/events.mjs index 45457b5..0b9d747 100644 --- a/js/game/events.mjs +++ b/js/game/events.mjs @@ -32,7 +32,7 @@ function notify(message, time = 80) { export function tick() { if (notification === null) return; - if (notLife-- <= 0) + if (notLife-- <= 0 || game.state.gameOver) notification.text = ''; } @@ -70,6 +70,12 @@ export function launchShip() { game.state.landed = false; } +export function crash() { + audio.play('crash'); + particle.createCrash(world.playerShip) + game.state.gameOver = true; +} + export function toggleEdit() { if (game.state.editing) { endEditing(); @@ -122,6 +128,7 @@ export function tilePlacement() { export function tossItem() { particle.createItemToss(world.playerShip); + audio.play('toss'); } export function collectItem(type, id, name) { diff --git a/js/game/index.mjs b/js/game/index.mjs index db1cf98..853c2b4 100644 --- a/js/game/index.mjs +++ b/js/game/index.mjs @@ -16,7 +16,8 @@ export async function init() { playing: false, editing: false, paused: false, - inventory: false + inventory: false, + gameOver: false }; graphics.init(); @@ -24,8 +25,8 @@ export async function init() { gui.init(); input.init(); - //events.playMusic(); - events.startGame(); + events.playMusic(); + //events.startGame(); //tick(); return; diff --git a/js/graphics/world.mjs b/js/graphics/world.mjs index 78b5758..941c44e 100644 --- a/js/graphics/world.mjs +++ b/js/graphics/world.mjs @@ -46,6 +46,7 @@ function renderEntity(entity) { } function renderShip(ship) { + if (ship.crashed) return; context.save(); context.translate(...ship.com); context.rotate(ship.r); diff --git a/js/world/particle.mjs b/js/world/particle.mjs index b9f8d22..40ebd55 100644 --- a/js/world/particle.mjs +++ b/js/world/particle.mjs @@ -27,6 +27,37 @@ export function createEndEditBurst(ship) { } } +export function createCrash(ship) { + for (let i = 0; i < ship.mass + 3; i++) { + particles.add(new Particle(...ship.poc, { + color: '#f2e860', + lifetime: Math.random() * 50 + 40, + size: Math.random() * 0.2 + 0.2, + spray: 0.9, + gravity: true + })); + } + for (let i = 0; i < ship.mass + 3; i++) { + particles.add(new Particle(...ship.poc, { + color: '#f75722', + lifetime: Math.random() * 50 + 40, + size: Math.random() * 0.2 + 0.2, + spray: 0.5, + gravity: true + })); + } + for (let i = 0; i < ship.mass * 2 + 3; i++) { + particles.add(new Particle(...ship.poc, { + color: '#888', + lifetime: Math.random() * 30 + 55, + size: Math.random() * 0.5 + 0.4, + spray: 2, + friction: 0.9, + gravity: false + })); + } +} + export function createPickupBurst(ship, point) { for (let i = 0; i < 20; i++) { particles.add(new Particle(...point, { diff --git a/js/world/ship.mjs b/js/world/ship.mjs index 1aa5a30..ea593b7 100644 --- a/js/world/ship.mjs +++ b/js/world/ship.mjs @@ -22,6 +22,7 @@ export default class Ship extends Body { this.rotationPower = 0; this.cargoCapacity = 0; this.thrust = 0; + this.crashed = false; } get com() { @@ -48,7 +49,7 @@ export default class Ship extends Body { } tick() { - window.q = []; + if (this.crashed) return; if (!state.editing) this.tickMotion(); if (!this.landed) this.tickGravity(world.celestials); if (!state.editing) this.resolveCollisions(); @@ -151,10 +152,19 @@ export default class Ship extends Body { let dis = body.distanceTo({ com: p }); if (dis < body.radius + 0.5 + consts.EPSILON) { this.approach(body, dis - (body.radius + 0.5)); + this.moduleCollided(module); this.halt(); this.resolveCelestialCollision(p, body, module); - this.lastContactModule = module; this.poc = p; + this.lastContactModule = module; + } + } + + moduleCollided(module) { + let speed = Math.sqrt(this.xvel ** 2 + this.yvel ** 2); + if (module.type !== 'thruster' || speed > consts.CRASH_SPEED) { + events.crash(); + this.crashed = true; } }