2013-04-06 3 views
1

Javascript로 Ping Pong 게임을 만들고 있는데, 화면에서 튀는 공이 있고 래퍼의 아래쪽 테두리를 만지지 못하게 할 수 있습니다. 상자. 여기 JS - jQuery/키가 누름/POLL 함수인지 감지하는 방법

는 화살표 키 ...하지만 무엇 RAQUET를 누를 때 왼쪽에서 오른쪽으로 RAQUET 이동을 가정하는 코드 (튀는 공은 문제는, 나는 이미 프로그래밍 한하지 않음) 원래의 위치에서 왼쪽 또는 오른쪽으로 많은 픽셀처럼 보이게하는 것입니다. 내 말은, 그것이 유창하게 움직이지 않는다는 것입니다, 그것은 단지 왼쪽이나 오른쪽으로 30 또는 100 픽셀처럼 보입니다.

function gameLoop() { 

    //**********DETECTS IF LEFT OR RIGHT KEYS ARE PRESSED************ 

    $(document).keydown(function(e) { 
     if(e.keyCode == 37) { //LEFT 
      userBoxPosX -= userBoxSpeedX; 
     } 
     if(e.keyCode == 39) { //RIGHT 
      userBoxPosX += userBoxSpeedX; 
     } 
    }); 

    //THE USERBOX IS A DIV THAT WE WILL USE AS RAQUET 
    userBox.css('left', userBoxPosX + "px"); 

    setTimeout(gameLoop, 50); //THIS FUNCTION CALLS ITSELF EVERY 50 milliseconds (20FPS) 

} 

어떻게하면 유창하게 움직일 수 있습니까? 화살표 키를 눌렀을 때?

더 많은 정보가 필요하거나 프로젝트 업로드가 필요할 경우 알려 주시면 알 수 있습니다.

+0

한 번에 한 픽셀 씩 이동 했습니까? 프레임 당 얼마나 멀리 움직입니까? – Aiias

+0

'$ (document) .keydown()'을 루프 안에 넣지 않아도됩니다. 한 번 수행하면 사용자가 키를 누를 때마다 콜백이 호출됩니다. – Barmar

+0

보세요, 변수 "userBoxSpeedX"는 1로 설정됩니다. 즉, 원래 위치 (userBoxPosX)에서 1 픽셀 이동하고 작동하지 않습니다. Barmar,하지만 나는 그것을 처리 할 수 ​​없습니다. 정상적인 사건. 게임이기 때문에 이벤트 중심의 애플리케이션이 아닙니다. 동시에 raquet이 움직이기 때문에 공이 튀어 오르고 충돌이 감지되고 있습니다 ... 내가 무슨 뜻인지 아시나요? – JuanBonnett

답변

0

50 밀리 초마다 다른 핸들러를 바인드하므로 몇 초 후에 keydown 이벤트에 바인드 된 수백 개의 핸들러가 있습니다. 따라서 키를 누르면 처리기가 수백 번 연속 실행됩니다.

게임 루프 외부에서 처리기를 한 번 설정해야합니다. 루프 내에서 setTimeout을 사용하여 반복 사이에 브라우저로 제어를 되돌려 야합니다. 타임 아웃을 기다리는 동안 키를 누르면 처리기가 트리거됩니다.

다음
var userBoxPosX = 0, userBoxLastPosX = null; 

function gameLoop() { 

    if (userBoxPosX !== userBoxLastPosX) { // Has racquet been moved? 
     //THE USERBOX IS A DIV THAT WE WILL USE AS RAQUET 
     userBox.css('left', userBoxPosX + "px"); 
     userBoxLastPosX = userBoxPosX; 
    } 

} 

setInterval(gameLoop, 50); // Call main loop function every 50 ms (20 FPS) 

$(document).keydown(function(e) { 
    if(e.keyCode == 37) { //LEFT 
     userBoxPosX -= userBoxSpeedX; 
    } 
    if(e.keyCode == 39) { //RIGHT 
     userBoxPosX += userBoxSpeedX; 
    } 
}); 

내가 생각하는 방법은 20 FPS의 자동 반복을 구현할 수있어 :

var userBoxDelta = 0; 

function gameLoop() { 

    if (userBoxDelta != 0) { // is raquet moving? 
     //THE USERBOX IS A DIV THAT WE WILL USE AS RAQUET 
     userBoxPosX += userBoxDelta; 
     userBox.css('left', userBoxPosX + "px"); 
    } 

} 

setInterval(gameLoop, 50); // Call main loop function every 50 ms (20 FPS) 

$(document).keydown(function(e) { 
    if(e.keyCode == 37) { //LEFT 
     userBoxDelta = -userBoxSpeedX; 
    } 
    if(e.keyCode == 39) { //RIGHT 
     userBoxDelta = userBoxSpeedX; 
    } 
}); 

$(document).keyup(function() { 
    userBoxDelta = 0; 
} 
+0

죄송합니다 Barmar, 신경 쓰고 싶지 않지만 코드 예제를 줄 수 있습니까? 나는 네가 무슨 뜻인지 정확히 이해하지 못했다. $ (document) .keydown() ........을 루프 외부에 넣으려고했습니다. 그리고 그것은 작동하는 것으로 보였습니다. 그러나 속도를 20px 또는 30px로 설정해야합니다. 즉, 키를 누를 때마다 20 또는 30 픽셀 씩 움직일 것입니다. 그러나 1 또는 2 픽셀을 이동할 수있는 방법이 있지만 초당 20 또는 30 프레임? 그것은 유창하고 빠르다. 무슨 뜻인지 아시면 ... 30FPS로 재생되는 30FPS로 녹화되는 영화 대신 30FPS로 재생되는 10FPS를 기록한 영화 같아요. – JuanBonnett

+0

여기서 볼 수있는 URL입니다. 화난 얼굴은 '연회'이고 행복한 얼굴은 튀는 공입니다. http://www.juanbonnett.com/tests/bouncingbox/ 튀는 공이 빠르게 움직이고 있지만 유창하지만 볼이 유창하지 않으면 키 누르기마다 픽셀이 많이 움직입니다.그리고 반응하는데 많은 시간이 필요합니다. – JuanBonnett

+0

구조는 내가 당신의 질문보다 쓴 것처럼 보입니다. 그리고 그것은 나에게 꽤 반응하는 것처럼 보인다. – Barmar

0

이 간단한 해결책은 다음과 같이 될 것이다

나는이 기본 구조해야한다고 생각 :

$(document).keydown(function(e) { 
     if(e.keyCode == 37) { //LEFT 
      userBoxPosX -= userBoxSpeedX; 
      updatePosition(); 
      } 
     if(e.keyCode == 39) { //RIGHT 
      userBoxPosX += userBoxSpeedX; 
      updatePosition(); 
      } 
     }); 

function updatePosition() { 
    userBox.css('left', userBoxPosX + "px"); 
}; 
+0

답장을 보내 주셔서 ... 당신의 말은 유효합니다. 하지만 내가 원하는 것은 Raquet에서 튀는 공과 같은 프레임 속도입니다. 이 방법은 키 프레임 당 X 픽셀을 이동하는 것만으로 반응이 없습니다. :(이 URL을 확인하고 튀는 공으로 RAQUET (성난 얼굴)이 유창하지 않은지 확인하십시오. 키 누르기 이벤트가 게임 루프를 능가하기 때문에 튀는 공이 유창하지 않습니다. http://www.juanbonnett.com/tests/bouncingbox/ -> 모두 – JuanBonnett

+0

키 누르기 이벤트가 어디에서 발생하든 사용자가 키를 누른 순간에만 터지지 만 사용자가 키를 누를 수없는 경우에는 동일한 프레임 속도가 될 수 없습니다. – Barmar

+0

첫 번째 게시물에서 언급 한 코드를 시뮬레이션하고 함수 호출의 차이를 계산하는 메서드를 만든 다음 회신에 게시 된 코드를 시도했습니다. 루프 호출을하면 문제는 동일하게 유지됩니다. 이 메서드는 click이 아닌 모든 루프 호출로 증가하기 때문에 메서드입니다 @Barmar의 주석으로 루프에없는 클릭에 의존합니다. 프레임이 아닌 개체를 이동하려고합니다. 이동중인 프레임이있는 경우 다른 기능을 기반으로 그 프레임은 자신의 객체이고, 내부 객체는 상대적으로 배치되어야합니다. – Jawad