Add keyboard and gamepad settings

This commit is contained in:
LoveEevee 2019-04-05 22:53:51 +03:00
parent 3f533a0255
commit 879186c313
16 changed files with 468 additions and 135 deletions

View File

@ -16,3 +16,6 @@
#touch-pause-btn{ #touch-pause-btn{
background-image: url("touch_pause.png"); background-image: url("touch_pause.png");
} }
.settings-outer{
background-image: url("bg_settings.png");
}

View File

@ -92,6 +92,7 @@ kbd{
color: #000; color: #000;
} }
.taibtn:hover, .taibtn:hover,
.taibtn.selected,
#tutorial-end-button:hover, #tutorial-end-button:hover,
#tutorial-end-button.selected{ #tutorial-end-button.selected{
position: relative; position: relative;
@ -148,6 +149,19 @@ kbd{
cursor: text; cursor: text;
overflow: hidden; overflow: hidden;
} }
@keyframes border-pulse{
0%{border-color: #ff0}
50%{border-color: rgba(255, 255, 0, 0)}
100%{border-color: #ff0}
}
@keyframes border-pulse2{
0%{border-color: #e29e06}
50%{border-color: rgba(226, 158, 6, 0)}
100%{border-color: #e29e06}
}
.settings-outer{
background-size: 50vh;
}
.setting-box{ .setting-box{
display: flex; display: flex;
height: 2em; height: 2em;
@ -165,7 +179,7 @@ kbd{
#tutorial-content:not(:hover) .setting-box.selected, #tutorial-content:not(:hover) .setting-box.selected,
.setting-box:hover{ .setting-box:hover{
background: #ffb547; background: #ffb547;
border-color: #21211a; animation: 2s linear border-pulse infinite;
} }
.setting-name{ .setting-name{
position: relative; position: relative;
@ -183,12 +197,25 @@ kbd{
padding-left: 0.3em; padding-left: 0.3em;
} }
.setting-value{ .setting-value{
display: flex;
background: #fff; background: #fff;
width: 50%; width: 50%;
border-radius: 0.2em; border-radius: 0.2em;
padding: 0.5em; padding: 0.5em;
box-sizing: border-box; box-sizing: border-box;
} }
.setting-value.selected{
width: calc(50% + 0.2em);
margin: -0.1em;
border: 0.2em solid #e29e06;
padding: 0.4em;
animation: 2s linear border-pulse2 infinite;
}
.setting-value>div{
padding: 0 0.4em;
overflow: hidden;
text-overflow: ellipsis;
}
@keyframes bgscroll{ @keyframes bgscroll{
from{ from{
background-position: 0 top; background-position: 0 top;

View File

@ -32,22 +32,77 @@
var versionUrl = gameConfig._version.url var versionUrl = gameConfig._version.url
this.getLink(this.linkIssues).href = versionUrl + "issues" this.getLink(this.linkIssues).href = versionUrl + "issues"
var kbdSettings = settings.getItem("keyboardSettings")
this.kbd = {
confirm: ["enter", " ", kbdSettings.don_l[0], kbdSettings.don_r[0]],
previous: ["arrowleft", "arrowup", kbdSettings.ka_l[0]],
next: ["arrowright", "arrowdown", kbdSettings.ka_r[0]],
back: ["backspace", "escape"]
}
pageEvents.add(this.linkIssues, ["click", "touchend"], this.linkButton.bind(this)) pageEvents.add(this.linkIssues, ["click", "touchend"], this.linkButton.bind(this))
pageEvents.add(this.linkEmail, ["click", "touchend"], this.linkButton.bind(this)) pageEvents.add(this.linkEmail, ["click", "touchend"], this.linkButton.bind(this))
pageEvents.once(this.endButton, ["mousedown", "touchstart"]).then(this.onEnd.bind(this)) pageEvents.add(this.endButton, ["mousedown", "touchstart"], this.onEnd.bind(this))
pageEvents.keyOnce(this, 13, "down").then(this.onEnd.bind(this)) pageEvents.keyAdd(this, "all", "down", this.keyEvent.bind(this))
this.items = [this.linkIssues, this.linkEmail, this.endButton]
this.selected = 2
this.gamepad = new Gamepad({ this.gamepad = new Gamepad({
"confirm": ["start", "b", "ls", "rs"] "confirm": ["b", "ls", "rs"],
}, this.onEnd.bind(this)) "previous": ["u", "l", "lb", "lt", "lsu", "lsl"],
"next": ["d", "r", "rb", "rt", "lsd", "lsr"],
"back": ["start", "a"]
}, this.keyPressed.bind(this))
pageEvents.send("about", this.addDiag()) pageEvents.send("about", this.addDiag())
} }
keyEvent(event){
if(event.keyCode === 27 || event.keyCode === 8 || event.keyCode === 9){
// Escape, Backspace, Tab
event.preventDefault()
}
if(!event.repeat){
for(var i in this.kbd){
if(this.kbd[i].indexOf(event.key.toLowerCase()) !== -1){
this.keyPressed(true, i)
break
}
}
}
}
keyPressed(pressed, name){
if(!pressed){
return
}
var selected = this.items[this.selected]
if(name === "confirm"){
if(selected === this.endButton){
this.onEnd()
}else{
this.getLink(selected).click()
pageEvents.send("about-link", selected)
assets.sounds["se_don"].play()
}
}else if(name === "previous" || name === "next"){
selected.classList.remove("selected")
this.selected = this.mod(this.items.length, this.selected + (name === "next" ? 1 : -1))
this.items[this.selected].classList.add("selected")
assets.sounds["se_ka"].play()
}else if(name === "back"){
this.onEnd()
}
}
mod(length, index){
return ((index % length) + length) % length
}
onEnd(event){ onEnd(event){
var touched = false var touched = false
if(event && event.type === "touchstart"){ if(event){
event.preventDefault() if(event.type === "touchstart"){
touched = true event.preventDefault()
touched = true
}else if(event.which !== 1){
return
}
} }
this.clean() this.clean()
assets.sounds["se_don"].play() assets.sounds["se_don"].play()
@ -154,7 +209,8 @@
linkButton(event){ linkButton(event){
if(event.target === event.currentTarget){ if(event.target === event.currentTarget){
this.getLink(event.currentTarget).click() this.getLink(event.currentTarget).click()
pageEvents.send("about-link", event) pageEvents.send("about-link", event.currentTarget)
assets.sounds["se_don"].play()
} }
} }
clean(){ clean(){
@ -166,7 +222,7 @@
if(this.textarea){ if(this.textarea){
pageEvents.remove(this.textarea, ["focus", "blur"]) pageEvents.remove(this.textarea, ["focus", "blur"])
} }
pageEvents.keyRemove(this, 13) pageEvents.keyRemove(this, "all")
delete this.endButton delete this.endButton
delete this.diagTxt delete this.diagTxt
delete this.version delete this.version

View File

@ -3,22 +3,23 @@ class Keyboard{
this.controller = controller this.controller = controller
this.game = this.controller.game this.game = this.controller.game
var kbdSettings = settings.getItem("keyboardSettings")
this.kbd = { this.kbd = {
"don_l": 70, // F "ka_l": kbdSettings.ka_l[0],
"don_r": 74, // J "don_l": kbdSettings.don_l[0],
"ka_l": 68, // D "don_r": kbdSettings.don_r[0],
"ka_r": 75, // K "ka_r": kbdSettings.ka_r[0],
"pause": 81, // Q "pause": "q",
"back": 8, // Backspace "back": "backspace",
"previous": 37, // Left "previous": "arrowleft",
"next": 39, // Right "next": "arrowright",
"confirm": 13 // Enter "confirm": "enter"
} }
this.kbdAlias = { this.kbdAlias = {
"pause": [27], // Esc "pause": ["escape"],
"previous": [38], // Up "previous": ["arrowup"],
"next": [40], // Down "next": ["arrowdown"],
"confirm": [32] // Space "confirm": [" "]
} }
this.keys = {} this.keys = {}
this.waitKeyupScore = {} this.waitKeyupScore = {}
@ -30,11 +31,24 @@ class Keyboard{
} }
this.keyboardEvents = 0 this.keyboardEvents = 0
var layout = settings.getItem("gamepadLayout")
var gameBtn = {} var gameBtn = {}
gameBtn[this.kbd["don_l"]] = ["u", "d", "l", "r", "ls"] if(layout === "b"){
gameBtn[this.kbd["don_r"]] = ["a", "b", "x", "y", "rs"] gameBtn[this.kbd["don_l"]] = ["d", "r", "ls"]
gameBtn[this.kbd["ka_l"]] = ["lb", "lt"] gameBtn[this.kbd["don_r"]] = ["a", "x", "rs"]
gameBtn[this.kbd["ka_r"]] = ["rb", "rt"] gameBtn[this.kbd["ka_l"]] = ["u", "l", "lb", "lt"]
gameBtn[this.kbd["ka_r"]] = ["b", "y", "rb", "rt"]
}else if(layout === "c"){
gameBtn[this.kbd["don_l"]] = ["d", "l", "ls"]
gameBtn[this.kbd["don_r"]] = ["a", "b", "rs"]
gameBtn[this.kbd["ka_l"]] = ["u", "r", "lb", "lt"]
gameBtn[this.kbd["ka_r"]] = ["x", "y", "rb", "rt"]
}else{
gameBtn[this.kbd["don_l"]] = ["u", "d", "l", "r", "ls"]
gameBtn[this.kbd["don_r"]] = ["a", "b", "x", "y", "rs"]
gameBtn[this.kbd["ka_l"]] = ["lb", "lt"]
gameBtn[this.kbd["ka_r"]] = ["rb", "rt"]
}
this.gamepad = new Gamepad(gameBtn) this.gamepad = new Gamepad(gameBtn)
this.gamepadInterval = setInterval(this.gamepadKeys.bind(this), 1000 / 60 / 2) this.gamepadInterval = setInterval(this.gamepadKeys.bind(this), 1000 / 60 / 2)
@ -63,7 +77,7 @@ class Keyboard{
// Escape, Backspace, Tab // Escape, Backspace, Tab
event.preventDefault() event.preventDefault()
} }
var key = this.kbdSearch[event.keyCode] var key = this.kbdSearch[event.key.toLowerCase()]
if(key && !event.repeat && this.buttonEnabled(key)){ if(key && !event.repeat && this.buttonEnabled(key)){
var ms = this.game.getAccurateTime() var ms = this.game.getAccurateTime()
this.setKey(key, event.type === "keydown", ms) this.setKey(key, event.type === "keydown", ms)

View File

@ -204,6 +204,7 @@ class Loader{
} }
settings = new Settings() settings = new Settings()
pageEvents.setKbd()
Promise.all(this.promises).then(() => { Promise.all(this.promises).then(() => {
this.canvasTest.drawAllImages().then(result => { this.canvasTest.drawAllImages().then(result => {

View File

@ -7,6 +7,7 @@ class PageEvents{
this.add(window, "keydown", this.keyEvent.bind(this)) this.add(window, "keydown", this.keyEvent.bind(this))
this.add(window, "keyup", this.keyEvent.bind(this)) this.add(window, "keyup", this.keyEvent.bind(this))
this.add(window, "mousemove", this.mouseEvent.bind(this)) this.add(window, "mousemove", this.mouseEvent.bind(this))
this.kbd = []
} }
add(target, type, callback){ add(target, type, callback){
if(Array.isArray(type)){ if(Array.isArray(type)){
@ -81,7 +82,7 @@ class PageEvents{
}) })
} }
keyEvent(event){ keyEvent(event){
if ([68, 70, 74, 75].indexOf(event.keyCode) > -1) { // D, F, J, K if(this.kbd.indexOf(event.key.toLowerCase()) !== -1){
this.lastKeyEvent = Date.now() this.lastKeyEvent = Date.now()
} }
this.keyListeners.forEach(addedKeyCode => { this.keyListeners.forEach(addedKeyCode => {
@ -146,4 +147,13 @@ class PageEvents{
send(name, detail){ send(name, detail){
dispatchEvent(new CustomEvent(name, {detail: detail})) dispatchEvent(new CustomEvent(name, {detail: detail}))
} }
setKbd(){
var kbdSettings = settings.getItem("keyboardSettings")
this.kbd = [
kbdSettings.ka_l[0],
kbdSettings.don_l[0],
kbdSettings.don_r[0],
kbdSettings.ka_r[0]
]
}
} }

View File

@ -31,8 +31,12 @@ class Scoresheet{
this.draw = new CanvasDraw() this.draw = new CanvasDraw()
this.canvasCache = new CanvasCache() this.canvasCache = new CanvasCache()
var kbdSettings = settings.getItem("keyboardSettings")
this.kbd = {
confirm: ["enter", " ", "escape", "backspace", kbdSettings.don_l[0], kbdSettings.don_r[0]]
}
this.gamepad = new Gamepad({ this.gamepad = new Gamepad({
"13": ["a", "b", "start", "ls", "rs"] confirm: ["a", "b", "start", "ls", "rs"]
}) })
this.difficulty = { this.difficulty = {
@ -72,23 +76,22 @@ class Scoresheet{
touchEvents: controller.view.touchEvents touchEvents: controller.view.touchEvents
}) })
} }
keyDown(event, code){ keyDown(event, key){
if(!code){ if(!key){
if(event.repeat){ if(event.repeat){
return return
} }
code = event.keyCode for(var i in this.kbd){
if(this.kbd[i].indexOf(event.key.toLowerCase()) !== -1){
key = i
break
}
}
} }
var key = { if(event && event.keyCode === 27 || event.keyCode === 8 || event.keyCode === 9){
confirm: code == 13 || code == 32 || code == 70 || code == 74,
// Enter, Space, F, J
cancel: code == 27 || code == 8
// Esc, Backspace
}
if(key.cancel && event){
event.preventDefault() event.preventDefault()
} }
if(key.confirm || key.cancel){ if(key === "confirm"){
this.toNext() this.toNext()
} }
} }

View File

@ -37,6 +37,9 @@ class Session{
pageEvents.send("session") pageEvents.send("session")
} }
mouseDown(event){ mouseDown(event){
if(event.type === "mousedown" && event.which !== 1){
return
}
if(event.target === this.sessionInvite){ if(event.target === this.sessionInvite){
this.sessionInvite.focus() this.sessionInvite.focus()
}else{ }else{

View File

@ -13,6 +13,22 @@ class Settings{
type: "toggle", type: "toggle",
default: !ios, default: !ios,
touch: true touch: true
},
keyboardSettings: {
type: "keyboard",
default: {
ka_l: ["d"],
don_l: ["f"],
don_r: ["j"],
ka_r: ["k"]
},
touch: false
},
gamepadLayout: {
type: "select",
options: ["a", "b", "c"],
default: "a",
gamepad: true
} }
} }
@ -24,6 +40,17 @@ class Settings{
if(i in storage){ if(i in storage){
if(current.type === "select" && current.options.indexOf(storage[i]) === -1){ if(current.type === "select" && current.options.indexOf(storage[i]) === -1){
this.storage[i] = null this.storage[i] = null
}else if(current.type === "keyboard"){
var obj = {}
for(var j in current.default){
if(storage[i][j] && storage[i][j][0]){
obj[j] = storage[i][j]
}else{
obj = null
break
}
}
this.storage[i] = obj
}else{ }else{
this.storage[i] = storage[i] this.storage[i] = storage[i]
} }
@ -52,13 +79,24 @@ class Settings{
class SettingsView{ class SettingsView{
constructor(touchEnabled){ constructor(touchEnabled){
this.touchEnabled = touchEnabled this.touchEnabled = touchEnabled
loader.changePage("settings", true) loader.changePage("settings", false)
assets.sounds["bgm_settings"].playLoop(0.1, false, 0, 1.392, 26.992) assets.sounds["bgm_settings"].playLoop(0.1, false, 0, 1.392, 26.992)
this.endButton = document.getElementById("tutorial-end-button") this.endButton = document.getElementById("tutorial-end-button")
if(touchEnabled){ if(touchEnabled){
document.getElementById("tutorial-outer").classList.add("touch-enabled") document.getElementById("tutorial-outer").classList.add("touch-enabled")
} }
var gamepadEnabled = false
if("getGamepads" in navigator){
var gamepads = navigator.getGamepads()
for(var i = 0; i < gamepads.length; i++){
if(gamepads[i]){
gamepadEnabled = true
break
}
}
}
this.mode = "settings"
var tutorialTitle = document.getElementById("tutorial-title") var tutorialTitle = document.getElementById("tutorial-title")
tutorialTitle.innerText = strings.gameSettings tutorialTitle.innerText = strings.gameSettings
@ -71,7 +109,12 @@ class SettingsView{
this.items = [] this.items = []
this.selected = 0 this.selected = 0
for(let i in settings.items){ for(let i in settings.items){
if(!touchEnabled && settings.items[i].touch){ var current = settings.items[i]
if(
!touchEnabled && current.touch === true ||
touchEnabled && current.touch === false ||
!gamepadEnabled && current.gamepad === true
){
continue continue
} }
var settingBox = document.createElement("div") var settingBox = document.createElement("div")
@ -84,15 +127,17 @@ class SettingsView{
settingBox.appendChild(nameDiv) settingBox.appendChild(nameDiv)
var valueDiv = document.createElement("div") var valueDiv = document.createElement("div")
valueDiv.classList.add("setting-value") valueDiv.classList.add("setting-value")
valueDiv.innerText = this.getValue(i) this.getValue(i, valueDiv)
settingBox.appendChild(valueDiv) settingBox.appendChild(valueDiv)
content.appendChild(settingBox) content.appendChild(settingBox)
if(this.items.length === this.selected){ if(this.items.length === this.selected){
settingBox.classList.add("selected") settingBox.classList.add("selected")
} }
pageEvents.add(settingBox, ["mousedown", "touchstart"], event => { pageEvents.add(settingBox, ["mousedown", "touchstart"], event => {
event.preventDefault() if(event.which === 1){
this.setValue(i) event.preventDefault()
this.setValue(i)
}
}) })
this.items.push({ this.items.push({
id: i, id: i,
@ -105,13 +150,8 @@ class SettingsView{
settingBox: this.endButton settingBox: this.endButton
}) })
this.kbd = { this.setKbd()
"confirm": [13, 32, 70, 74], // Enter, Space, F, J pageEvents.add(this.endButton, ["mousedown", "touchstart"], this.onEnd.bind(this))
"previous": [37, 38, 68], // Left, Up, D
"next": [39, 40, 75], // Right, Down, K
"back": [8, 27] // Backspace, Esc
}
pageEvents.once(this.endButton, ["mousedown", "touchstart"]).then(this.onEnd.bind(this))
pageEvents.keyAdd(this, "all", "down", this.keyEvent.bind(this)) pageEvents.keyAdd(this, "all", "down", this.keyEvent.bind(this))
this.gamepad = new Gamepad({ this.gamepad = new Gamepad({
"confirm": ["b", "ls", "rs"], "confirm": ["b", "ls", "rs"],
@ -122,27 +162,65 @@ class SettingsView{
pageEvents.send("settings") pageEvents.send("settings")
} }
getValue(name){ setKbd(){
var kbdSettings = settings.getItem("keyboardSettings")
this.kbd = {
"confirm": ["enter", " ", kbdSettings.don_l[0], kbdSettings.don_r[0]],
"previous": ["arrowleft", "arrowup", kbdSettings.ka_l[0]],
"next": ["arrowright", "arrowdown", kbdSettings.ka_r[0]],
"back": ["backspace", "escape"]
}
}
getValue(name, valueDiv){
var current = settings.items[name] var current = settings.items[name]
var value = settings.getItem(name) var value = settings.getItem(name)
if(current.type === "select"){ if(current.type === "select"){
value = strings.settings[name][value] value = strings.settings[name][value]
}else if(current.type === "toggle"){ }else if(current.type === "toggle"){
value = value ? strings.settings.on : strings.settings.off value = value ? strings.settings.on : strings.settings.off
}else if(current.type === "keyboard"){
valueDiv.innerHTML = ""
for(var i in value){
var key = document.createElement("div")
key.style.color = i === "ka_l" || i === "ka_r" ? "#009aa5" : "#ef2c10"
key.innerText = value[i][0].toUpperCase()
valueDiv.appendChild(key)
}
return
} }
return value valueDiv.innerText = value
} }
setValue(name){ setValue(name){
var current = settings.items[name] var current = settings.items[name]
var value = settings.getItem(name) var value = settings.getItem(name)
var selectedIndex = this.items.findIndex(item => item.id === name)
var selected = this.items[selectedIndex]
if(this.mode !== "settings"){
if(this.selected === selectedIndex){
this.keyboardBack(selected)
}
return
}
if(this.selected !== selectedIndex){
this.items[this.selected].settingBox.classList.remove("selected")
this.selected = selectedIndex
selected.settingBox.classList.add("selected")
}
if(current.type === "select"){ if(current.type === "select"){
value = current.options[this.mod(current.options.length, current.options.indexOf(value) + 1)] value = current.options[this.mod(current.options.length, current.options.indexOf(value) + 1)]
}else if(current.type === "toggle"){ }else if(current.type === "toggle"){
value = !value value = !value
}else if(current.type === "keyboard"){
this.mode = "keyboard"
selected.settingBox.style.animation = "none"
selected.valueDiv.classList.add("selected")
this.keyboardKeys = {}
this.keyboardSet()
assets.sounds["se_don"].play()
return
} }
settings.setItem(name, value) settings.setItem(name, value)
this.selected = this.items.findIndex(item => item.id === name) this.getValue(name, this.items[this.selected].valueDiv)
this.items[this.selected].valueDiv.innerText = this.getValue(name)
assets.sounds["se_ka"].play() assets.sounds["se_ka"].play()
} }
keyEvent(event){ keyEvent(event){
@ -152,11 +230,23 @@ class SettingsView{
} }
if(!event.repeat){ if(!event.repeat){
for(var i in this.kbd){ for(var i in this.kbd){
if(this.kbd[i].indexOf(event.keyCode) !== -1){ if(this.kbd[i].indexOf(event.key.toLowerCase()) !== -1){
this.keyPressed(true, i) if(this.mode !== "keyboard" || i === "back"){
break this.keyPressed(true, i)
return
}
} }
} }
if(this.mode === "keyboard"){
var currentKey = event.key.toLowerCase()
for(var i in this.keyboardKeys){
if(this.keyboardKeys[i][0] === currentKey || !currentKey){
return
}
}
this.keyboardKeys[this.keyboardCurrent] = [currentKey]
this.keyboardSet()
}
} }
} }
keyPressed(pressed, name){ keyPressed(pressed, name){
@ -164,26 +254,64 @@ class SettingsView{
return return
} }
var selected = this.items[this.selected] var selected = this.items[this.selected]
if(name === "confirm"){ if(this.mode === "settings"){
if(selected.id === "back"){ if(name === "confirm"){
if(selected.id === "back"){
this.onEnd()
}else{
this.setValue(selected.id)
}
}else if(name === "previous" || name === "next"){
selected.settingBox.classList.remove("selected")
this.selected = this.mod(this.items.length, this.selected + (name === "next" ? 1 : -1))
this.items[this.selected].settingBox.classList.add("selected")
assets.sounds["se_ka"].play()
}else if(name === "back"){
this.onEnd() this.onEnd()
}else{
this.setValue(selected.id)
} }
}else if(name === "previous" || name === "next"){ }else if(this.mode === "keyboard"){
selected.settingBox.classList.remove("selected") if(name === "back"){
this.selected = this.mod(this.items.length, this.selected + (name === "next" ? 1 : -1)) this.keyboardBack(selected)
this.items[this.selected].settingBox.classList.add("selected") }
assets.sounds["se_ka"].play()
}else if(name === "back"){
this.onEnd()
} }
} }
keyboardSet(){
var selected = this.items[this.selected]
var current = settings.items[selected.id]
selected.valueDiv.innerHTML = ""
for(var i in current.default){
var key = document.createElement("div")
key.style.color = i === "ka_l" || i === "ka_r" ? "#009aa5" : "#ef2c10"
if(this.keyboardKeys[i]){
key.innerText = this.keyboardKeys[i][0].toUpperCase()
selected.valueDiv.appendChild(key)
}else{
key.innerText = "[" + strings.settings[selected.id][i] + "]"
selected.valueDiv.appendChild(key)
this.keyboardCurrent = i
return
}
}
settings.setItem(selected.id, this.keyboardKeys)
this.keyboardBack(selected)
this.setKbd()
pageEvents.setKbd()
}
keyboardBack(selected){
this.mode = "settings"
selected.settingBox.style.animation = ""
selected.valueDiv.classList.remove("selected")
this.getValue(selected.id, selected.valueDiv)
}
onEnd(event){ onEnd(event){
var touched = false var touched = false
if(event && event.type === "touchstart"){ if(event){
event.preventDefault() if(event.type === "touchstart"){
touched = true event.preventDefault()
touched = true
}else if(event.which !== 1){
return
}
} }
this.clean() this.clean()
assets.sounds["se_don"].play() assets.sounds["se_don"].play()

View File

@ -289,16 +289,26 @@ class SongSelect{
this.startPreview(true) this.startPreview(true)
this.pressedKeys = {} this.pressedKeys = {}
var kbdSettings = settings.getItem("keyboardSettings")
this.kbd = {
confirm: ["enter", " ", kbdSettings.don_l[0], kbdSettings.don_r[0]],
back: ["escape"],
left: ["arrowleft", kbdSettings.ka_l[0]],
right: ["arrowright", kbdSettings.ka_r[0]],
up: ["arrowup"],
down: ["arrowdown"],
session: ["backspace"]
}
this.gamepad = new Gamepad({ this.gamepad = new Gamepad({
"13": ["b", "start", "ls", "rs"], confirm: ["b", "start", "ls", "rs"],
"27": ["a"], back: ["a"],
"37": ["l", "lb", "lt", "lsl"], left: ["l", "lb", "lt", "lsl"],
"39": ["r", "rb", "rt", "lsr"], right: ["r", "rb", "rt", "lsr"],
"38": ["u", "lsu"], up: ["u", "lsu"],
"40": ["d", "lsd"], down: ["d", "lsd"],
"8": ["back"], session: ["back"],
"ctrl": ["y"], ctrl: ["y"],
"shift": ["x"] shift: ["x"]
}) })
if(!assets.customSongs){ if(!assets.customSongs){
@ -331,57 +341,46 @@ class SongSelect{
} }
} }
keyDown(event, code){ keyDown(event, key){
if(code){ if(key){
var modifiers = { var modifiers = {
shift: this.pressedKeys["shift"], shift: this.pressedKeys["shift"],
ctrl: this.pressedKeys["ctrl"] ctrl: this.pressedKeys["ctrl"]
} }
}else{ }else{
code = event.keyCode
var modifiers = { var modifiers = {
shift: event.shiftKey, shift: event.shiftKey,
ctrl: event.ctrlKey ctrl: event.ctrlKey
} }
for(var i in this.kbd){
if(this.kbd[i].indexOf(event.key.toLowerCase()) !== -1){
key = i
break
}
}
} }
if(code === "ctrl" || code === "shift" || !this.redrawRunning){ if(key === "ctrl" || key === "shift" || !this.redrawRunning){
return return
} }
var key = { if(event && (event.keyCode === 27 || event.keyCode === 8 || event.keyCode === 9)){
confirm: code == 13 || code == 32 || code == 70 || code == 74,
// Enter, Space, F, J
cancel: code == 27,
// Esc
session: code == 8,
// Backspace
left: code == 37 || code == 68,
// Left, D
right: code == 39 || code == 75,
// Right, K
up: code == 38,
// Up
down: code == 40
// Down
}
if(event && (code == 27 || code == 8 || code == 9)){
// Escape, Backspace, Tab // Escape, Backspace, Tab
event.preventDefault() event.preventDefault()
} }
if(this.state.screen === "song"){ if(this.state.screen === "song"){
if(key.confirm){ if(key === "confirm"){
this.toSelectDifficulty() this.toSelectDifficulty()
}else if(key.cancel){ }else if(key === "back"){
this.toTitleScreen() this.toTitleScreen()
}else if(key.session){ }else if(key === "session"){
this.toSession() this.toSession()
}else if(key.left){ }else if(key === "left"){
this.moveToSong(-1) this.moveToSong(-1)
}else if(key.right){ }else if(key === "right"){
this.moveToSong(1) this.moveToSong(1)
} }
}else if(this.state.screen === "difficulty"){ }else if(this.state.screen === "difficulty"){
if(key.confirm){ if(key === "confirm"){
if(this.selectedDiff === 0){ if(this.selectedDiff === 0){
this.toSongSelect() this.toSongSelect()
}else if(this.selectedDiff === 1){ }else if(this.selectedDiff === 1){
@ -389,14 +388,14 @@ class SongSelect{
}else{ }else{
this.toLoadSong(this.selectedDiff - this.diffOptions.length, modifiers.shift, modifiers.ctrl) this.toLoadSong(this.selectedDiff - this.diffOptions.length, modifiers.shift, modifiers.ctrl)
} }
}else if(key.cancel || key.session){ }else if(key === "back" || key === "session"){
this.toSongSelect() this.toSongSelect()
}else if(key.left){ }else if(key === "left"){
this.moveToDiff(-1) this.moveToDiff(-1)
}else if(key.right){ }else if(key === "right"){
this.moveToDiff(1) this.moveToDiff(1)
}else if(this.selectedDiff === 1 && (key.up || key.down)){ }else if(this.selectedDiff === 1 && (key === "up" || key === "down")){
this.toOptions(key.up ? -1 : 1) this.toOptions(key === "up" ? -1 : 1)
} }
} }
} }

View File

@ -110,6 +110,19 @@
touchAnimation: { touchAnimation: {
name: "タッチアニメーション" name: "タッチアニメーション"
}, },
keyboardSettings: {
name: "キーボード設定",
ka_l: "ふち(左)",
don_l: "面(左)",
don_r: "面(右)",
ka_r: "ふち(右)"
},
gamepadLayout: {
name: "そうさタイプ設定",
a: "タイプA",
b: "タイプB",
c: "タイプC"
},
on: "オン", on: "オン",
off: "オフ", off: "オフ",
ok: "OK" ok: "OK"
@ -233,6 +246,19 @@ function StringsEn(){
touchAnimation: { touchAnimation: {
name: "Touch Animation" name: "Touch Animation"
}, },
keyboardSettings: {
name: "Keyboard Settings",
ka_l: "Left Rim",
don_l: "Left Surface",
don_r: "Right Surface",
ka_r: "Right Rim"
},
gamepadLayout: {
name: "Gamepad Layout",
a: "Type A",
b: "Type B",
c: "Type C"
},
on: "On", on: "On",
off: "Off", off: "Off",
ok: "OK" ok: "OK"
@ -356,6 +382,19 @@ function StringsCn(){
touchAnimation: { touchAnimation: {
name: "触摸动画" name: "触摸动画"
}, },
keyboardSettings: {
name: "Keyboard Settings",
ka_l: "Left Rim",
don_l: "Left Surface",
don_r: "Right Surface",
ka_r: "Right Rim"
},
gamepadLayout: {
name: "操作类型设定",
a: "类型A",
b: "类型B",
c: "类型C"
},
on: "开", on: "开",
off: "关", off: "关",
ok: "确定" ok: "确定"
@ -479,6 +518,19 @@ function StringsTw(){
touchAnimation: { touchAnimation: {
name: "觸摸動畫" name: "觸摸動畫"
}, },
keyboardSettings: {
name: "Keyboard Settings",
ka_l: "Left Rim",
don_l: "Left Surface",
don_r: "Right Surface",
ka_r: "Right Rim"
},
gamepadLayout: {
name: "操作類型設定",
a: "類型A",
b: "類型B",
c: "類型C"
},
on: "開", on: "開",
off: "關", off: "關",
ok: "確定" ok: "確定"
@ -602,6 +654,19 @@ function StringsKo(){
touchAnimation: { touchAnimation: {
name: "터치 애니메이션" name: "터치 애니메이션"
}, },
keyboardSettings: {
name: "Keyboard Settings",
ka_l: "Left Rim",
don_l: "Left Surface",
don_r: "Right Surface",
ka_r: "Right Rim"
},
gamepadLayout: {
name: "조작 타입 설정",
a: "타입 A",
b: "타입 B",
c: "타입 C"
},
on: "온", on: "온",
off: "오프", off: "오프",
ok: "확인" ok: "확인"

View File

@ -31,8 +31,12 @@ class Titlescreen{
pageEvents.add(this.langDropdown, "change", this.langChange.bind(this)) pageEvents.add(this.langDropdown, "change", this.langChange.bind(this))
assets.sounds["v_title"].play() assets.sounds["v_title"].play()
var kbdSettings = settings.getItem("keyboardSettings")
this.kbd = {
confirm: ["enter", " ", kbdSettings.don_l[0], kbdSettings.don_r[0]]
}
this.gamepad = new Gamepad({ this.gamepad = new Gamepad({
"13": ["a", "b", "x", "y", "start", "ls", "rs"] confirm: ["a", "b", "x", "y", "start", "ls", "rs"]
}, pressed => { }, pressed => {
if(pressed){ if(pressed){
this.onPressed() this.onPressed()
@ -49,15 +53,19 @@ class Titlescreen{
} }
} }
keyDown(event, code){ keyDown(event, key){
if(event && event.target === this.langDropdown){ if(!key){
return if(event.repeat || event.target === this.langDropdown){
return
}
for(var i in this.kbd){
if(this.kbd[i].indexOf(event.key.toLowerCase()) !== -1){
key = i
break
}
}
} }
if(!code){ if(key === "confirm"){
code = event.keyCode
}
if(code == 13 || code == 32 || code == 70 || code == 74){
// Enter, Space, F, J
this.onPressed() this.onPressed()
} }
} }

View File

@ -10,7 +10,14 @@ class Tutorial{
tutorialTitle.innerText = strings.howToPlay tutorialTitle.innerText = strings.howToPlay
tutorialTitle.setAttribute("alt", strings.howToPlay) tutorialTitle.setAttribute("alt", strings.howToPlay)
var tutorialContent = document.getElementById("tutorial-content") var tutorialContent = document.getElementById("tutorial-content")
var keys = ["F", "J", "D", "K", "Q", "SHIFT", "CTRL"] var kbdSettings = settings.getItem("keyboardSettings")
var keys = [
kbdSettings.don_l[0].toUpperCase(),
kbdSettings.don_r[0].toUpperCase(),
kbdSettings.ka_l[0].toUpperCase(),
kbdSettings.ka_r[0].toUpperCase(),
"Q", "SHIFT", "CTRL"
]
var keyIndex = 0 var keyIndex = 0
strings.tutorial.basics.forEach(string => { strings.tutorial.basics.forEach(string => {
var par = document.createElement("p") var par = document.createElement("p")
@ -42,8 +49,13 @@ class Tutorial{
this.endButton.innerText = strings.tutorial.ok this.endButton.innerText = strings.tutorial.ok
this.endButton.setAttribute("alt", strings.tutorial.ok) this.endButton.setAttribute("alt", strings.tutorial.ok)
pageEvents.once(this.endButton, ["mousedown", "touchstart"]).then(this.onEnd.bind(this)) pageEvents.add(this.endButton, ["mousedown", "touchstart"], this.onEnd.bind(this))
pageEvents.keyOnce(this, 13, "down").then(this.onEnd.bind(this)) pageEvents.keyAdd(this, "all", "down", event => {
if(event.keyCode === 13 || event.keyCode === 27 || event.keyCode === 8){
// Enter, Esc, Backspace
this.onEnd.bind(this)
}
})
this.gamepad = new Gamepad({ this.gamepad = new Gamepad({
"confirm": ["start", "b", "ls", "rs"] "confirm": ["start", "b", "ls", "rs"]
@ -60,9 +72,13 @@ class Tutorial{
} }
onEnd(event){ onEnd(event){
var touched = false var touched = false
if(event && event.type === "touchstart"){ if(event){
event.preventDefault() if(event.type === "touchstart"){
touched = true event.preventDefault()
touched = true
}else if(event.which !== 1){
return
}
} }
this.clean() this.clean()
assets.sounds["se_don"].play() assets.sounds["se_don"].play()
@ -75,7 +91,7 @@ class Tutorial{
this.gamepad.clean() this.gamepad.clean()
assets.sounds["bgm_setsume"].stop() assets.sounds["bgm_setsume"].stop()
pageEvents.remove(this.endButton, ["mousedown", "touchstart"]) pageEvents.remove(this.endButton, ["mousedown", "touchstart"])
pageEvents.keyRemove(this, 13) pageEvents.keyRemove(this, "all")
delete this.endButton delete this.endButton
} }
} }

View File

@ -11,6 +11,6 @@
<a href="mailto:taiko@bui.pm">taiko@bui.pm</a> <a href="mailto:taiko@bui.pm">taiko@bui.pm</a>
</div> </div>
</div> </div>
<div id="tutorial-end-button" class="taibtn stroke-sub"></div> <div id="tutorial-end-button" class="taibtn stroke-sub selected"></div>
</div> </div>
</div> </div>

View File

@ -1,4 +1,4 @@
<div id="tutorial-outer"> <div id="tutorial-outer" class="settings-outer">
<div id="tutorial"> <div id="tutorial">
<div id="tutorial-title" class="stroke-sub"></div> <div id="tutorial-title" class="stroke-sub"></div>
<div id="tutorial-content"></div> <div id="tutorial-content"></div>

View File

@ -2,6 +2,6 @@
<div id="tutorial"> <div id="tutorial">
<div id="tutorial-title" class="stroke-sub"></div> <div id="tutorial-title" class="stroke-sub"></div>
<div id="tutorial-content"></div> <div id="tutorial-content"></div>
<div id="tutorial-end-button" class="taibtn stroke-sub"></div> <div id="tutorial-end-button" class="taibtn stroke-sub selected"></div>
</div> </div>
</div> </div>