HTML5¿¡¼ °ÔÀÓÆе带 »ç¿ëÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾ú´Ù. ÀÚ¼¼ÇÑ ¼³¸íÀº »ý·«ÇÏ°í »ç¿ë ¹æ¹ý¸¸ ¼³¸íÇÑ´Ù. ½ÇÇàȸéÀº °ÔÀÓÆÐµå ¿ÞÂÊ ½ºÆ½À¸·Î »¡°£»ö È»ìÇ¥¸¦ ȸÀüÇÏ°í ÀÖ´Ù. °ÔÀÓÆÐµå ¿¬°áaddGamepadEvent();
function addGamepadEvent() { window.addEventListener("gamepadconnected", function (e) { Gamepad.init(); listenForGamepad(); }); } °ÔÀÓÆÐµå ·çÇÁÃʱâȽà °ÔÀÓÆе尡 È°¼ºÈ ¾ÈµÇ´õ¶óµµ updateLoop ÇÔ¼ö´Â °è¼Ó ºÒ¸®µµ·Ï init ÇÔ¼ö¿¡¼ ÃʱâÈ ÇÑ´Ù.init ÇÔ¼ö¿¡¼ listenForGamepad ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù. var listenForGamepad = function () {
updateLoop = function () { onIdle(); if(Gamepad.isActivate()) { Gamepad.preUpdate(); updateGamepad(); Gamepad.postUpdate(); } requestAnimationFrame(updateLoop); }; updateLoop(); }; function init() { //Add logic addGamepadEvent(); addKeyboardEvent(); listenForGamepad(); } °ÔÀÓÆÐµå »ç¿ëvar updateGamepad = function(){
if(Gamepad.click(GamepadKey.A)) showText('id_debug_key', 'pressd A key' ); if(Gamepad.click(GamepadKey.B)) showText('id_debug_key', 'pressd B key' ); else updateLeftStick(); //x, y is 0 or 1. //move by left Stick, Digital pad key var x = Gamepad.moveClick().x; var y = Gamepad.moveClick().y; if(x || y) { var str = 'moveClick x' + x + ', y:' + y; showText('id_debug_move', str); } } AÅ°°¡ Ŭ¸¯ µÇ¾ú´ÂÁö üũ Gamepad.click(GamepadKey.A) BÅ°°¡ Ŭ¸¯ µÇ¾ú´ÂÁö üũ Gamepad.click(GamepadKey.B) ¿ÞÂÊ ½ºÆ½À̳ª µðÁöÅÐ Æеå Å°°¡ ÀÛµ¿ÁßÀÌ¸é ¹æÇâ¿¡ µû¶ó "-1 ~1"À» ¸®ÅÏÇÑ´Ù. ÀÛµ¿ ¾ÈÇÏ°í ÀÖÀ¸¸é 0À» ¸®ÅÏÇÑ´Ù. ´Ü, y°ªÀº ¾ÕÀ¸·Î -1, µÚ·Î 1À» ¸®ÅÏÇÑ´Ù. Gamepad.moveClick().x Gamepad.moveClick().y »¡°£»ö È»ìÇ¥ ȸÀü¿ÞÂÊ ½ºÆ½À¸·Î È»ìÇ¥¸¦ ȸÀüÇÑ´Ù.isSnap º¯¼ö´Â °¢µµ ½º³ÀÀ» ÇÒÁö ¾ÈÇÒÁö °áÁ¤ÇÑ´Ù. getSnapDegree ÇÔ¼ö´Â ½º³ÀÇÑ °¢µµ¸¦ ³Ñ°Ü ÁØ´Ù. stride´Â ¸îµµ¾¿ snap ÇÒ°ÍÀÎÁö °áÁ¤ÇÑ´Ù. deadDegreeZoneÀº °¢µµ °æ°è¿¡¼´Â °¢µµ üũ¸¦ ÇÏÁö ¾Ê´Â´Ù. ( 0µµ¿Í 90ÀÇ °æ°è´Â 45µµÀÌ´Ù. 45µµ ÀüÈÄ·Î deadDegreeZone °¢µµ¿¡¼´Â º¯È¸¦ ¹«½ÃÇÑ´Ù. ) var lastDegree = 0;
var startTimer = { left: false //left Stick }; var duration = { left: 150 //left Stick }; var isSnap = { left: true //left Stick }; var getSnapDegree = function(degree, otherDegree, stride) { var curSnapDegree = Math.floor(degree/stride)*stride; if(curSnapDegree === otherDegree) return degree; else { var deadDegreeZone = 3; if(Math.abs(degree - otherDegree) < deadDegreeZone) return degree; return curSnapDegree; } } var updateLeftStick = function(){ if((Gamepad.getLeftStick().fx || Gamepad.getLeftStick().fy) && startTimer.left === false) { var degree = Gamepad.getLastLeftAngle(); degree = degree + 90; degree = Math.fmod(degree + 360, 360); //snap if(isSnap.left) { var snapDegree = getSnapDegree(degree, lastDegree, 90); if(snapDegree === degree) return; degree = snapDegree; } //print degree showText(id_debug_degree, degree); var el = document.getElementById('arrow_rot'); el.style.opacity = "0.5"; var start = Date.now(); startTimer.left = true; var timer = setInterval(function() { let timePassed = Date.now() - start; if (timePassed >= duration.left) { clearInterval(timer); lastDegree = degree; el.style.transform = 'rotate(' + String(degree) + 'deg)'; startTimer.left = false; el.style.opacity = "1"; return; } move(timePassed); }, 20); function move(timePassed) { var diff = degree - lastDegree; if(diff > 180) diff = -(360 - diff); if(diff < -180) diff = 360 + diff; var currDeg = lastDegree + diff * timePassed/duration.left; currDeg = Math.fmod(currDeg + 360, 360); el.style.transform = 'rotate(' + String(currDeg) + 'deg)'; } } }; °ÔÀÓÆеå ȸÀü ¿¹Á¦ test.html main.js gamepad.js gamepad_rotation.zip °ÔÀÓÆÐµå ¹öÆ° È£Ãâ ¿¹Á¦ : gamepad_rotation ¿¹Á¦¿¡¼ ȸÀü ·ÎÁ÷À» Á¦°ÅÇÑ ÄÚµåÀÌ´Ù. simple_test.html simple_main.js gamepad.js gamepad_simple.zip |