123 lines
3.1 KiB
JavaScript
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();
|
|
}
|
|
}
|
|
}
|
|
} |