top drop menu

Recent Post

토요일, 11월 24

자바스크립트와 P5.js에서 게임패드 사용하기

일전에 뷰잉에서 게임이나 가끔 해볼까 하고 게임패드를 하나 구입했었다. 이 게임패드를 크롬 브라우저에서 자바스트립트를 이용해서 활용해 보기로 하자. 먼저 간단히 게임패드들의 버튼들을 인식하는 예제를 만들어 보자.

20181120_191657


<!doctype html>
<html lang="ko">
  <head>
   <meta name="viewport" content="width=device-width, user-scalable=no">
   <meta charset="UTF-8">
   <meta name="Description" content="">
   <title>P5.JS 연습</title>
   <style type="text/css">
        body{
       text-align: center;
     }
      p{
       font-size: .9em;
      }
      #defaultCanvas0{

     }

     #screen{
       width: 80px;
       height: 80px;
       margin: 0 auto;
       position: relative;
      }

     #ball {
         width: 80px;
         height: 80px;
         border-radius: 40px;
         background-color: red;
         position: relative;
         line-height: 75px;
         text-align: center;
         font-size: 40px;
       }
   </style>
   <!--공통-->
   <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.2/p5.min.js"></script> -->
   <!--프로젝트 스크립트-->
   <!-- <script src="sketch21.js"></script>
   <script src="gamepad.js"></script> -->
  </head>
  <body>
   <h1>P5.js Example 21</h1>
   <p id="gamepad-info">Waiting for Gamepad.</p>
   <div id="screen">
     <div id="ball"></div>
   </div>

  <script type="text/javascript">
     var gamepadInfo = document.getElementById("gamepad-info");
     var ball = document.getElementById("ball");
     // pos
     var a = 0;
     var b = 0;
     var start;
     var text = "";

    // webkitRequestAnimationFrame
     var rAF = window.mozRequestAnimationFrame ||
         window.webkitRequestAnimationFrame ||
         window.requestAnimationFrame;

    var rAFStop = window.mozCancelRequestAnimationFrame ||
       window.webkitCancelRequestAnimationFrame ||
       window.cancelRequestAnimationFrame;

    // Check connection
     window.addEventListener("gamepadconnected", function(e) {
       var gp = navigator.getGamepads()[e.gamepad.index];
           gamepadInfo.innerHTML = "Gamepad connected at index "+gp.index+": "+gp.id+", "+gp.buttons.length+" buttons, "+gp.axes.length+" axes";
    
       gameLoop();
     });

    // Check disconnection
     window.addEventListener("gamepaddisconnected", function() {
       gamepadInfo.innerHTML = "Waiting for gamepad.";

      //rAFStop(start);
     });

    function gameLoop() {
       if(navigator.webkitGetGamepads) {//이게 아니다.
         console.log(webkitGetGamepads);
       } else {
         var gp = navigator.getGamepads()[0];


         if(gp.axes[0] !=0 || gp.axes[1] != 0){
           a += gp.axes[0];
           b += gp.axes[1];
           text= "Ax";
         }

        if(gp.buttons[0].value > 0 || gp.buttons[0].pressed == true) {//A button
           text = "A";
         } else if(gp.buttons[1].value > 0 || gp.buttons[1].pressed == true) {//B button
           text = "B";
         } else if(gp.buttons[2].value > 0 || gp.buttons[2].pressed == true) {//X button
           text = "X";
         } else if(gp.buttons[3].value > 0 || gp.buttons[3].pressed == true) {//Y button
             text = "Y";
         }

      }

      ball.style.left = a*4 + "px";
       ball.style.top = b*4 + "px";
       ball.innerHTML = text;

      var start = rAF(gameLoop);
     };

  </script>
  
  </body>
</html>

간단히 div 로 만든 빨간 써클을 게임패드로 움직일 수 있는 예제이다.

이미지 127

왼편 조이스틱과 오른쪽 버튼들에게 기능을 지정해 주었다. 두번째 예제는 p5.js안에서 직접 코드를 작성하는 예제도 만들어 보자. 게임패드 각각의 버튼들의 값들을 출력해 주는 예제이다.


var pads, pad0;

function setup(){
     createCanvas(640, 480);
     textSize(14);
     stroke(80);
     strokeWeight(.3);
}

function draw(){
     background(0);
     fill(255);

    pads = navigator.getGamepads();
     pad0 = pads[0];
    
     text('ID: ', 10, 20);
     if(pad0){
         //console.log(pad0.buttons.length);
         text(pad0.id, 35, 20)
         text('-----', 15, 40);
         for(var i =0; i < pad0.buttons.length; i++){
             text('Button'+i+': ' + pad0.buttons[i].value, 15, 60 + 20 * i);
             //console.log(pad0.buttons.length);
         }text('-----', width/2, 40);
         for (var i = 0; i < pad0.axes.length; i++) {
             text('axes' + i + ': ' + pad0.axes[i], width/2, 60 + 20 * i);
         }
     }
}

이미지 128

연결된 게이패드의 버튼과 조이스틱을 움직여 보면 값들이 변하는 것을 확인 할 수 있다. 대부분의 버튼은 0과 1이다. 조이스틱은 –1에서 1사이의 값을 가진다. 이렇게 게임패드의 버튼들의 값이 p5.js로 전달 되었으니 이것을 이용해서 화면안에서 사용할 수 있게 된다.



Blogger Widget