Created
February 16, 2013 08:49
-
-
Save ysugimoto/4966127 to your computer and use it in GitHub Desktop.
gamepad API sample ( for webkit only )
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function() { | |
var pointerMatrix = [ | |
[1,3,5,7,9,11,13,15,17,19,21,23], | |
[49,51,53,55,57,59,61,63,65,67,69,71], | |
[97,99,101,103,105,107,109,111,113,115,117], | |
[145,147,149,151,153,155,157,159,161,163,165], | |
[193,195,197,199,201,203,205,207,209,211,213], | |
[241,243,245,247,249,251,253,255,257,259,261] | |
]; | |
var rubMap = { | |
107: '<', 109: '<', 111: '<', 113: '<', 115: '<', | |
155: '<', 157: '<', 159: '<', 161: '<', 163: '<', | |
203: '<', 205: '<', 207: '<', 209: '<', 211: '<', | |
251: '>', 253: '>', 255: '>', 257: '>', 259: '>' | |
}; | |
var rubData = { | |
107: 'が', 109: 'ぎ', 111: 'ぐ', 113: 'げ', 115: 'ご', | |
155: 'ざ', 157: 'じ', 159: 'ず', 161: 'ぜ', 163: 'ぞ', | |
203: 'ば', 205: 'び', 207: 'ぶ', 209: 'べ', 211: 'ぼ', | |
251: 'ぱ', 253: 'ぴ', 255: 'ぷ', 257: 'ぺ', 259: 'ぽ' | |
}; | |
var doc = document; | |
var C; | |
var audio = new Audio(); | |
var se = new Audio(); | |
var canPlay = false; | |
audio.addEventListener('canplay', function() { | |
canPlay = true; | |
audio.loop = true; | |
audio.play(); | |
}, false); | |
audio.src = './dq2-lovesong.mp3'; | |
audio.addEventListener('ended', function() { | |
audio.currentTime = 0; | |
}, false); | |
se.src = './cursor.mp3'; | |
se.addEventListener('ended', function() { | |
se.currentTime = 0; | |
}, false); | |
function Controller() { | |
this.x = 0; | |
this.y = 0; | |
this.w = 1; | |
this.locked = false; | |
this.lastTimeStamp = 0; | |
this.InputThredshold = 100; | |
this.currentNode = doc.querySelector('span[data-pointer="' + pointerMatrix[this.y][this.x] + '"]'); | |
this.currentInput = doc.querySelector('span[data-wid="' + this.w + '"]'); | |
this.currentNode.firstChild.nodeValue = '}'; | |
this.currentInput.setAttribute('data-tmp', this.currentInput.firstChild.nodeValue); | |
this.currentInput.firstChild.nodeValue = '*'; | |
} | |
Controller.start = function() { | |
C = new Controller(); | |
}; | |
Controller.prototype = { | |
up: function() { | |
if ( ! pointerMatrix[this.y - 1] ) { | |
return; | |
} | |
if ( ! pointerMatrix[this.y - 1][this.x] ) { | |
this.setCursor(-1, -1); | |
} else { | |
this.setCursor(0, -1); | |
} | |
}, | |
down: function() { | |
if ( ! pointerMatrix[this.y + 1] ) { | |
return; | |
} | |
if ( ! pointerMatrix[this.y + 1][this.x] ) { | |
this.setCursor(-1, 1); | |
} else { | |
this.setCursor(0, 1); | |
} | |
}, | |
left: function() { | |
if ( ! pointerMatrix[this.y][this.x - 1] ) { | |
return; | |
} | |
this.setCursor(-1, 0); | |
}, | |
right: function() { | |
if ( ! pointerMatrix[this.y][this.x + 1] ) { | |
return; | |
} | |
this.setCursor(1, 0); | |
}, | |
setCursor : function(x, y) { | |
var n; | |
this.y += y; | |
this.x += x; | |
n = doc.querySelector('span[data-pointer="' + pointerMatrix[this.y][this.x] + '"]'); | |
n.firstChild.nodeValue = '}'; | |
this.currentNode.firstChild.nodeValue = ' '; | |
this.currentNode = n; | |
}, | |
input: function() { | |
var act = this.currentNode.getAttribute('data-action'); | |
var p = this.currentNode.getAttribute('data-pointer'); | |
var r; | |
se.play(); | |
if ( act && this[act] ) { | |
return this[act](); | |
} | |
this.currentInput.setAttribute('data-tmp', this.currentNode.nextElementSibling.firstChild.nodeValue); | |
if ( p in rubMap ) { | |
r = doc.querySelector('span[data-block="' + (this.currentInput.getAttribute('data-block') - 20) + '"]'); | |
r.firstChild.nodeValue = rubMap[p]; | |
r.setAttribute('data-rub', p); | |
} | |
this.forward(); | |
}, | |
back: function() { | |
if ( ! doc.querySelector('span[data-wid="' + (this.w - 1) + '"]') ) { | |
return; | |
} | |
this.currentInput.firstChild.nodeValue = this.currentInput.getAttribute('data-tmp'); | |
this.currentInput = doc.querySelector('span[data-wid="' + --this.w + '"]'); | |
this.currentInput.setAttribute('data-tmp', this.currentInput.firstChild.nodeValue); | |
this.currentInput.firstChild.nodeValue = '*'; | |
}, | |
forward: function() { | |
if ( ! doc.querySelector('span[data-wid="' + (this.w + 1) + '"]') ) { | |
return; | |
} | |
this.currentInput.firstChild.nodeValue = this.currentInput.getAttribute('data-tmp'); | |
this.currentInput = doc.querySelector('span[data-wid="' + ++this.w + '"]'); | |
this.currentInput.setAttribute('data-tmp', this.currentInput.firstChild.nodeValue); | |
this.currentInput.firstChild.nodeValue = '*'; | |
}, | |
erase: function() { | |
var r; | |
this.currentInput.setAttribute('data-tmp', ' '); | |
r = doc.querySelector('span[data-block="' + (this.currentInput.getAttribute('data-block') - 20) + '"]'); | |
r.firstChild.nodeValue = ' '; | |
r.removeAttribute('data-rub'); | |
this.back(); | |
}, | |
end: function() { | |
var inputs = doc.querySelectorAll('span[data-wid]'), | |
ind = -1, | |
di = -1, | |
data = [], | |
rub; | |
while( inputs[++ind] ) { | |
rub = doc.querySelector('span[data-block="' + (inputs[ind].getAttribute('data-block') - 20) + '"]'); | |
if ( rub.getAttribute('data-rub') in rubData ) { | |
data[++di] = rubData[rub.getAttribute('data-rub')]; | |
} else if ( inputs[ind].getAttribute('data-tmp') | |
&& inputs[ind].getAttribute('data-tmp') !== ' ' ) { | |
data[++di] = inputs[ind].getAttribute('data-tmp'); | |
} | |
} | |
if ( data.join('') === 'ざおりく' ) { | |
createNotification(); | |
} | |
}, | |
gamepadControl: function(gamepad) { | |
var t = (new Date()).getTime(); | |
if ( t - this.lastTimeStamp > this.InputThredshold ) { | |
if ( doc.getElementById('kanchigai') ) { | |
if ( gamepad.buttons[1] > 0 ) { | |
doc.getElementById('kanchigai').style.display = 'none'; | |
} | |
if ( C.locked === false ) { | |
setTimeout(function() { | |
doc.body.removeChild(doc.getElementById('kanchigai')); | |
C.locked = false; | |
}, 2000); | |
C.locked = true; | |
} | |
return; | |
} | |
if ( gamepad.axes[0] === -1 ) { | |
this.left(); | |
} else if ( gamepad.axes[0] === 1 ) { | |
this.right(); | |
} else if ( gamepad.axes[1] === -1 ) { | |
this.up(); | |
} else if ( gamepad.axes[1] === 1 ) { | |
this.down(); | |
} | |
if ( gamepad.buttons[1] > 0 ) { | |
this.input(); | |
} else if ( gamepad.buttons[2] > 0 ) { | |
this.erase(); | |
} | |
this.lastTimeStamp = t; | |
} | |
} | |
}; | |
window.Controller = Controller; | |
function createNotification() { | |
var d = doc.createElement('div'), | |
html; | |
html = [ | |
'&#############’<br>', | |
'” < $<br>', | |
'” かんちかい しています $<br>', | |
'” $<br>', | |
')%%%%%%%%%%%%%(<br>' | |
]; | |
d.id = 'kanchigai'; | |
d.innerHTML = html.join(''); | |
d.style.top = window.innerHeight / 4 + 80 + 'px'; | |
doc.body.appendChild(d); | |
} | |
function loop() { | |
var gamepad = navigator.webkitGetGamepads(), | |
i = 0; | |
for ( ; i < 4; ++i ) { | |
if ( ! gamepad[i]) { | |
continue; | |
} | |
C.gamepadControl(gamepad[i]); | |
break; | |
} | |
webkitRequestAnimationFrame(loop); | |
} | |
doc.addEventListener('DOMContentLoaded', function() { | |
var b = document.getElementById('sound'); | |
b.addEventListener('click', function() { | |
if ( ! canPlay ) { | |
return; | |
} | |
( audio.paused ) ? audio.play() : audio.pause(); | |
}, false); | |
Controller.start(); | |
loop(); | |
}, false); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment