openrowingmonitor/app/client/arcade/StrokeFighterStartScene.js

97 lines
2.2 KiB
JavaScript

'use strict'
/*
Open Rowing Monitor, https://github.com/laberning/openrowingmonitor
Implements the Start Screen of the Stroke Fighter Game
*/
import addSpaceBackground from './SpaceBackground.js'
/**
* Creates the main scene of Storke Fighter
* @param {import('kaboom').KaboomCtx} k Kaboom Context
*/
export default function StrokeFighterStartScene (k) {
addSpaceBackground(k)
k.add([
k.text('Stroke Fighter', { size: 50, font: 'sinko' }),
k.pos(k.width() / 2, 50),
k.origin('center')
])
k.add([
k.text('start rowing...', { size: 40, font: 'sinko' }),
k.pos(k.width() / 2, 110),
k.origin('center')
])
const shipsPos = k.vec2(450, 260)
const ship1 = k.add([
k.sprite('playerShip2_orange'),
k.pos(shipsPos),
k.origin('center')
])
addBullet(ship1.pos.sub(0, 65))
const ship2 = k.add([
k.sprite('playerShip2_orange'),
k.pos(shipsPos.add(0, 140)),
k.origin('center')
])
addBullet(ship2.pos.sub(20, 40))
addBullet(ship2.pos.sub(-20, 40))
const ship3 = k.add([
k.sprite('playerShip2_orange'),
k.pos(shipsPos.add(0, 280)),
k.origin('center')
])
addBullet(ship3.pos.sub(0, 65))
addBullet(ship3.pos.sub(20, 40))
addBullet(ship3.pos.sub(-20, 40))
const explainPos = k.vec2(40, 260)
k.add([
k.text('light stroke = ', { size: 28, font: 'sinko' }),
k.pos(explainPos),
k.origin('left')
])
k.add([
k.text('normal stroke = ', { size: 28, font: 'sinko' }),
k.pos(explainPos.add(0, 140)),
k.origin('left')
])
k.add([
k.text('heavy stroke = ', { size: 28, font: 'sinko' }),
k.pos(explainPos.add(0, 280)),
k.origin('left')
])
function addBullet (pos) {
k.add([
k.sprite('laserRed01'),
k.pos(pos),
k.origin('center')
])
}
let lastStrokeState = 'DRIVING'
function appState (appState) {
if (appState?.metrics.strokeState === undefined) {
return
}
if (lastStrokeState === 'DRIVING' && appState.metrics.strokeState === 'RECOVERY') {
driveFinished(appState.metrics)
}
lastStrokeState = appState.metrics.strokeState
}
function driveFinished (metrics) {
k.wait(2, () => { k.go('strokeFighterBattle') })
}
return {
appState
}
}