gamepad

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