japanese-drum-game/public/src/js/controller.js

214 lines
4.8 KiB
JavaScript
Raw Normal View History

2018-09-13 01:10:00 +08:00
class Controller{
constructor(selectedSong, songData, autoPlayEnabled, multiplayer){
this.selectedSong = selectedSong
this.songData = songData
this.autoPlayEnabled = autoPlayEnabled
this.multiplayer = multiplayer
var backgroundURL = "/songs/" + this.selectedSong.folder + "/bg.png"
var songParser = new ParseSong(songData)
this.parsedSongData = songParser.getData()
assets.songs.forEach(song => {
if(song.id == this.selectedSong.folder){
this.mainAsset = song.sound
}
})
2015-07-17 16:22:46 +08:00
2018-09-13 01:10:00 +08:00
this.game = new Game(this, this.selectedSong, this.parsedSongData)
this.view = new View(this, backgroundURL, this.selectedSong.title, this.selectedSong.difficulty)
this.mekadon = new Mekadon(this, this.game)
this.keyboard = new Keyboard(this)
}
run(syncWith){
this.loadUIEvents()
this.game.run()
this.view.run()
this.startMainLoop()
if(syncWith){
syncWith.game.getElapsedTime = () => {
return this.game.elapsedTime
}
this.game.setElapsedTime =
syncWith.game.setElapsedTime = time => {
this.game.elapsedTime.ms = time
syncWith.game.elapsedTime.ms = time
}
syncWith.run()
this.syncWith = syncWith
}
}
loadUIEvents(){
this.continueBtn = document.getElementById("continue-butt")
this.restartBtn = document.getElementById("restart-butt")
2018-09-18 06:37:59 +08:00
this.songSelBtn = document.getElementById("song-selection-butt")
pageEvents.add(this.continueBtn, "click", () => {
this.togglePauseMenu()
2018-09-13 01:10:00 +08:00
})
2018-09-18 06:37:59 +08:00
pageEvents.add(this.restartBtn, "click", () => {
2018-09-13 01:10:00 +08:00
assets.sounds["don"].play()
this.restartSong()
})
2018-09-18 06:37:59 +08:00
pageEvents.add(this.songSelBtn, "click", () => {
assets.sounds["don"].play()
this.songSelection()
2018-09-13 01:10:00 +08:00
})
}
startMainLoop(){
this.mainLoopStarted = false
this.mainLoopRunning = true
this.mainLoop()
}
2018-09-15 22:34:53 +08:00
stopMainLoop(){
this.mainLoopRunning = false
this.mainAsset.stop()
if(this.syncWith){
this.syncWith.stopMainLoop()
}
}
2018-09-13 01:10:00 +08:00
mainLoop(){
if(this.mainLoopRunning){
2018-09-18 06:37:59 +08:00
if(this.multiplayer !== 2){
2018-09-13 01:10:00 +08:00
requestAnimationFrame(() => {
if(this.syncWith){
this.syncWith.game.elapsedTime.ms = this.game.elapsedTime.ms
}
this.mainLoop()
if(this.syncWith){
this.syncWith.mainLoop()
}
})
}
var ms = this.game.getElapsedTime().ms
2018-09-22 04:31:35 +08:00
2018-09-13 01:10:00 +08:00
if(!this.game.isPaused()){
2018-09-22 04:31:35 +08:00
this.keyboard.checkGameKeys()
2018-09-13 01:10:00 +08:00
if(ms >= 0 && !this.mainLoopStarted){
this.mainLoopStarted = true
}
if(ms < 0){
this.game.updateTime()
}
if(this.mainLoopStarted){
this.game.update()
2018-09-18 06:37:59 +08:00
if(!this.mainLoopRunning){
return
}
2018-09-13 01:10:00 +08:00
this.game.playMainMusic()
}
this.view.refresh()
}
this.keyboard.checkMenuKeys()
}
}
togglePauseMenu(){
this.togglePause()
this.view.togglePauseMenu()
}
2018-09-18 06:37:59 +08:00
gameEnded(){
2018-09-13 01:10:00 +08:00
var score = this.getGlobalScore()
var vp
2018-09-18 06:37:59 +08:00
if(score.fail === 0){
2018-09-13 01:10:00 +08:00
vp = "fullcombo"
this.playSoundMeka("fullcombo", 1.350)
2018-09-15 22:34:53 +08:00
}else if(score.hp >= 50){
2018-09-13 01:10:00 +08:00
vp = "clear"
2018-09-15 22:34:53 +08:00
}else{
2018-09-13 01:10:00 +08:00
vp = "fail"
}
assets.sounds["game" + vp].play()
2018-09-18 06:37:59 +08:00
}
displayResults(){
this.clean()
if(this.multiplayer !== 2){
new Scoresheet(this, this.getGlobalScore(), this.multiplayer)
}
2018-09-13 01:10:00 +08:00
}
displayScore(score, notPlayed){
this.view.displayScore(score, notPlayed)
}
songSelection(){
2018-09-18 06:37:59 +08:00
this.clean()
2018-09-13 01:10:00 +08:00
new SongSelect()
}
restartSong(){
2018-09-18 06:37:59 +08:00
this.clean()
if(this.multiplayer){
new loadSong(this.selectedSong, false, true)
}else{
loader.changePage("game")
var taikoGame = new Controller(this.selectedSong, this.songData, this.autoPlayEnabled)
taikoGame.run()
}
2018-09-13 01:10:00 +08:00
}
playSoundMeka(soundID, time){
var meka = ""
if(this.autoPlayEnabled && !this.multiplayer){
meka = "-meka"
}
assets.sounds[soundID + meka].play(time)
}
togglePause(){
if(this.syncWith){
this.syncWith.game.togglePause()
}
this.game.togglePause()
}
getKeys(){
return this.keyboard.getKeys()
}
2018-09-22 04:31:35 +08:00
setKey(keyCode, down, ms){
return this.keyboard.setKey(keyCode, down, ms)
2018-09-13 01:10:00 +08:00
}
getBindings(){
return this.keyboard.getBindings()
}
getSongData(){
return this.game.getSongData()
}
getElapsedTime(){
return this.game.getElapsedTime()
}
getCircles(){
return this.game.getCircles()
}
getCurrentCircle(){
return this.game.getCurrentCircle()
}
isWaiting(key, type){
return this.keyboard.isWaiting(key, type)
2018-09-13 01:10:00 +08:00
}
waitForKeyup(key, type){
this.keyboard.waitForKeyup(key, type)
}
getKeyTime(){
return this.keyboard.getKeyTime()
}
getCombo(){
return this.game.getCombo()
}
getGlobalScore(){
return this.game.getGlobalScore()
}
autoPlay(circle){
if(this.multiplayer){
p2.play(circle, this.mekadon)
}else{
this.mekadon.play(circle)
}
}
2018-09-18 06:37:59 +08:00
clean(){
this.stopMainLoop()
this.keyboard.clean()
this.view.clean()
pageEvents.remove(this.continueBtn, "click")
delete this.continueBtn
pageEvents.remove(this.restartBtn, "click")
delete this.restartBtn
pageEvents.remove(this.songSelBtn, "click")
delete this.songSelBtn
}
2018-09-13 01:10:00 +08:00
}