2012-02-15 5 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); 
});​ 

固定された2つのバグがありました。 A pos属性が追加され、速度と位置を別々に更新できるようになりました。また、Math.sinMath.cosは角度をラジアンで取るので、これらの関数の角度を変換しました。

あなたは結果で遊ぶことができます:http://jsfiddle.net/mJcN7/8/

+0

私は、私はそれを行うだろうかそうでないことを確認、慣性を制御することができないように、私はship.accSpeedが必要だと思います。 speedxやspeedyの変数に間違いがあるかどうかも知っていますか?船はまだ完全に予期せぬ方法で変わります。 –

+1

慣性はオブジェクトの速度を変更するための抵抗です。モーメントは、質量の速度に等しい量であり、外力が加えられていない限り(船のエンジンなどから)保存されている量です。モデルの勢いをモデル化するためには、船の速度をフレーム間で一定に保つだけです。慣性をモデル化するには、船の速度があまりにも速く変化しないようにする必要があります。これは、加速を小さな定数にすることで可能です。ダイジェストがたくさんあるので、なぜこのチャットルームに参加しないでください:http://chat.stackoverflow.com/rooms/7722/spaceship-physics – Clueless

関連する問題