2012-02-15 1 views
0

나는 탈출 속도와 비슷한 느낌의 미니 우주선 게임을 만들고 있습니다. 관성이 제대로 작동하지 않는 것 같습니다. 회전 기능에 문제가 있습니다. 왼쪽 또는 오른쪽 화살표 키를 탭하면 순환 형 운동과 유사하지 않습니다. 켜거나 관성 포함하지 않는 고전적인 공간 침략자 형 게임을 함께 할 수 있습니다에서 나는 스택 오버 플로우와 인터넷을 검색하지만, 대부분의 질문에 한우주선 무브먼트

$(function() { 
var canvas = Raphael('game', 1000, 800); 
var background = canvas.rect(0, 0, 1000, 800); 
background.attr("fill", "black"); 

var ship = canvas.rect(200, 200, 10, 35); 
ship.attr("fill", "red"); 
ship.angle = 0; 
ship.turnrate = 4; 
ship.maxSpeed = 2; 
ship.acc = 0; 
ship.accSpeed = 0.25; 
ship.vel = [0,0]; 

var up = 0; 
var left = 0; 
var right = 0; 
var speedx = 0; 
var speedy = 0; 

function moveShip() { 
    if (left == 1) { 
     ship.angle = (ship.angle - ship.turnrate) % 360; 
    } 

    if (right == 1) { 
     ship.angle = (ship.angle + ship.turnrate) % 360; 
    } 

    if (up == 1) { 
     if (ship.acc < ship.maxSpeed) { 
      ship.acc += ship.accSpeed; 
     } 

     if (ship.acc > ship.maxSpeed) { 
      ship.acc = ship.speed; 
     } 
    } 

    if (up == 0) { 
     if (ship.acc > 0) { 
      ship.acc -= ship.accSpeed; 
     } 

     if (ship.acc < 0) { 
      ship.acc = 0; 
     } 
    } 

    speedx = ship.vel[0] + ship.acc * Math.sin(ship.angle); 
    speedy = ship.vel[1] + ship.acc * Math.cos(ship.angle); 

    ship.vel = [speedx, speedy]; 

    ship.transform(""); 
    ship.rotate(ship.angle); 
    ship.attr({x: ship.vel[0], y: ship.vel[1]}); 

    $("#stats").text("ship.angle: " + ship.angle 
      + " vel[0]: " + ship.vel[0] + " vel[1]: " + ship.vel[1] 
    + " ship.speed: " + ship.maxSpeed + " speedx: " + speedx + " speedy: " + speedy); 
} 

function keyPressed(evt) { 
    if (evt.keyCode == 38) { 
     up = 1; 
    } 

    if (evt.keyCode == 37) { 
     left = 1; 
    } 

    if (evt.keyCode == 39) { 
     right = 1; 
    } 
} 

function keyReleased(evt) { 
    if (evt.keyCode == 38) { 
     up = 0; 
    } 

    if (evt.keyCode == 37) { 
     left = 0; 
    } 

    if (evt.keyCode == 39) { 
     right = 0; 
    } 
} 

function gameloop() { 
    moveShip(); 
} 

$(document).keydown(keyPressed); 
$(document).keyup(keyReleased); 
setInterval(gameloop, 30); 
}); 

.

도움이 될만한 점은, 내가 누락 된 부분을 잘 이해하고 싶다는 것입니다.

답변

1

화살표 키를 사용하여 우주선의 가속도를 변경 하시겠습니까? 가속은 속도의 변화율입니다. 즉, 일정한 가속도를 가진다면 속도가 성장하고 성장하고 성장할 것입니다. 곧 당신은 너무 빨리가는 배를 갖게 될 것입니다. 여기 후세를위한 채팅방에서

결과 :

$(function() { 
    var canvas = Raphael('game', 1000, 800); 
    var background = canvas.rect(0, 0, 1000, 800); 
    background.attr("fill", "black"); 

    var ship = canvas.rect(200, 200, 10, 35); 
    ship.attr("fill", "red"); 
    ship.angle = 0; 
    ship.turnrate = 4; 
    ship.maxSpeed = 0.25; 
    ship.acc = 0.25; 
    ship.vel = [0,0]; 
    ship.pos = [500,400]; 

    var up = 0; 
    var left = 0; 
    var right = 0; 
    var speedx = 0; 
    var speedy = 0; 

    function moveShip() { 
     if (left == 1) { 
      ship.angle = (ship.angle - ship.turnrate) % 360; 
     } 

     if (right == 1) { 
      ship.angle = (ship.angle + ship.turnrate) % 360; 
     } 

     if (up == 1) { 
      speedx = ship.vel[0] + ship.acc * Math.sin(ship.angle * Math.PI/180); 
      speedy = ship.vel[1] - ship.acc * Math.cos(ship.angle * Math.PI/180); 

      ship.vel = [speedx, speedy]; 
     } 
     ship.pos = [ship.pos[0] + speedx, ship.pos[1] + speedy]; 

     ship.transform(""); 
     ship.rotate(ship.angle); 
     ship.attr({x: ship.pos[0], y: ship.pos[1]}); 

     $("#stats").text("ship.angle: " + ship.angle 
       + " vel[0]: " + ship.vel[0] + " vel[1]: " + ship.vel[1] 
     + " ship.speed: " + ship.maxSpeed + " speedx: " + speedx + " speedy: " + speedy); 
    } 

    function keyPressed(evt) { 
     if (evt.keyCode == 38) { 
      up = 1; 
     } 

     if (evt.keyCode == 37) { 
      left = 1; 
     } 

     if (evt.keyCode == 39) { 
      right = 1; 
     } 
    } 

    function keyReleased(evt) { 
     if (evt.keyCode == 38) { 
      up = 0; 
     } 

     if (evt.keyCode == 37) { 
      left = 0; 
     } 

     if (evt.keyCode == 39) { 
      right = 0; 
     } 
    } 

    function gameloop() { 
     moveShip(); 
    } 

    $(document).keydown(keyPressed); 
    $(document).keyup(keyReleased); 
    setInterval(gameloop, 30); 
});​ 

고정이 버그가 있었다. pos 속성이 추가되었으므로 속도와 위치를 별도로 업데이트 할 수 있습니다. 또한 Math.sinMath.cos은 각도를 라디안으로 취하므로 이러한 함수의 각도를 변환했습니다.

당신은 결과를 재생할 수 있습니다 : http://jsfiddle.net/mJcN7/8/

+0

나는 관성, 내가 그것을 얼마나 다른 확실하지를 제어 할 수 있도록 내가 ship.accSpeed을 필요가 있다고 생각합니다. 또한 speedx 또는 speedy 변수에 문제가 있는지 알고 있습니까? 배는 여전히 예기치 못한 방식으로 변합니다. –

+1

관성 (Inertia)은 물체의 속도를 바꾸기위한 저항입니다. 기세는 질량 시간 속도와 동등한 양이며 외력이 가해지지 않는 한 보존됩니다 (예 : 선박 엔진에서). 모멘텀을 모델링하려면 프레임 사이의 속도를 일정하게 유지해야합니다. 관성을 모델링하려면 배가 너무 빨리 속도를 변경하지 않도록해야합니다. 가속도를 작은 상수로 만들어서 할 수 있습니다. 소화 할 것이 많기 때문에이 대화방에 참여하지 않으시겠습니까? http://chat.stackoverflow.com/rooms/7722/spaceship-physics – Clueless

관련 문제