p5winter/screenGame.js

123 lines
3.1 KiB
JavaScript

import {
ScoreUi,
CurrentSongUi
} from './ui.js'
import { KEYS, GRACE_BEAT } from './config.js'
import { PressIndicator, Highway } from './highway.js';
import { Note } from './note.js';
import { ScoreManager } from './score.js'
import chartmgr from './chartmgr.js';
import { debugMsg } from './debug.js';
export class GameScreen {
constructor(chart) {
this.chart = chart;
this.score = new ScoreManager();
this.scoreUi = new ScoreUi();
this.curBeat = 1;
this.background = 10;
this.started = false;
this.pressIndicators = [];
// populate press indicators
KEYS.forEach((_, i) => {
this.pressIndicators.push(new PressIndicator(i));
})
// load song
this.notes = []
if(this.chart) {
this.chart.notes.forEach(n => {
this.notes.push(new Note(n.lane, n.beat))
})
}
this.song = loadSound("./charts/" + this.chart.id + "/" + this.chart.file, null, null, (percent) => {
this.loadPercent = percent
console.log(percent)
});
this.loadPercent = 0;
}
draw() {
this.background = lerp(this.background, 50, 0.02)
background(this.background)
if(this.background > 40 &&
!this.started && this.song.isLoaded() && this.chart.id != "test") {
this.song.play();
this.started = true;
}
Highway.draw(this.curBeat);
// notes
for(let i = 0; i < this.notes.length; i++) {
this.notes[i].draw(this.curBeat)
}
// key indicators
for(let i = 0; i < this.pressIndicators.length; i++) {
let pi = this.pressIndicators[i];
pi.draw(keyIsDown(KEYS[i]))
};
// draw score
this.scoreUi.draw();
if(!this.chart) {
return debugMsg("no chart data!")
} else if (!this.song) {
return debugMsg("audio not loaded!")
}
CurrentSongUi.draw(chartmgr.covers.get(this.chart.id), this.chart.name, this.chart.artist);
}
calcBeat() {
if(this.song) {
let beatSecs = 60 / this.chart.bpm;
this.curBeat = (this.song.currentTime() / beatSecs) + 1
}
}
checkHit() {
let pressTime = this.song.currentTime();
let pressBeat = (pressTime / (60 / this.chart.bpm)) + 1
// scan for notes
if(this.notes.length < 1) return;
let targetNotes = []
targetNotes.push(this.notes[0])
while(true) {
if(this.notes.length < 2)
break;
if(!this.notes[targetNotes.length])
break;
if(
this.notes[targetNotes.length].beat == targetNotes[targetNotes.length - 1].beat
&& this.notes[targetNotes.length].beat == targetNotes[targetNotes.length - 1].beat) {
targetNotes.push(this.notes[targetNotes.length])
} else {
break;
}
}
for(let i = 0; i < targetNotes.length; i++) {
let k = targetNotes[i];
if(targetNotes[0].beat + GRACE_BEAT > pressBeat
&& targetNotes[0].beat - GRACE_BEAT < pressBeat
&& keyIsDown(KEYS[k.lane])){
// hit note!
this.notes.find(n=> n.symbol == k.symbol).pressed = true;
this.notes.find(n=> n.symbol == k.symbol).remove();
this.pressIndicators[k.lane].hit = true;
this.score.onHit();
}
}
}
}