2017-06-19 8 views
0

Gamemaker Studioの「ボールミズ」スタイルのゲームでボールを回転させるための非常に簡単なゲームを作成しました。これは、プレイヤーオブジェクトとそれが移動できない壁だけで構成されています。単純な物理シミュレーションでプレイヤーオブジェクトが正しく移動しないGMS

プレーヤーのオブジェクトには、移動キーを押したときに増減する移動速度があり、その速度でステップごとに1回(壁に当たるまで)移動します。私は、ボタンが押されていないときにも基本的な減速を追加しました。

ほとんどの場合動作しますが、非常に具体的なバグがあります。非常に迅速かつ+正(または下; S又はDWASDの点で)移動するときxまたはy軸に沿って、私は反対の方向に入力を提供する場合、(W にスワッピングを保持しているときSなど)非常に壁の近くにいるときには、プレイヤーオブジェクトは反対方向に進むことができる限りすぐに点滅します。

何が起こるべきかは、物が減速し始めなければならないことです。逆に同じことをするときに起こることです。 Wを保持し、壁に当たる直前にSに切り替えることによって、y軸に沿って負の方向に急速に移動します。

私は確かにわかりませんが、物体が壁に向かって正の方向に十分に速く移動しているときに、それが起こっていると確信しています。反対方向に力を加えて壁に当たる。ここで

は、不正な動作

short clipであり、ここで他の方向に働いて正しい動作のshort clipです。私は、問題を引き起こしている私のステップのコードの一部を見つけることができないよう

// determine which input keys are being pressed and 
// increment/decrement vspd and hspd respectively 
if (vspd < 0 || keyboard_check(ord('W'))){ 
    if place_meeting(x, y+vspd, block_obj) 
    { 
     // pixel-perfect collision resolution 
     while(!place_meeting(x, y-1, block_obj)) 
     { 
      y -= 1; 
     } 
     vspd = 0; 
    } 
    else if keyboard_check(ord('W')) 
    { 
     if(!place_meeting(x, y-1, block_obj)) 
      vspd -= 2; 
    } 
    else 
    { 
     if(vspd < -2) 
     { 
      vspd += 1; 
     } 
     else 
     { 
      vspd = 0; 
     } 
    } 
} 
if (vspd > 0 || keyboard_check(ord('S'))){ 
    if place_meeting(x, y+vspd, block_obj) 
    { 
     // pixel-perfect collision resolution 
     while(!place_meeting(x, y+1, block_obj)) 
     { 
      y += 1; 
     } 
     vspd = 0; 
    } 
    else if keyboard_check(ord('S')) 
    { 
     if(!place_meeting(x, y+1, block_obj)) 
      vspd += 2; 
    } 
    else 
    { 
     if(vspd > 2) 
     { 
      vspd -= 1; 
     } 
     else 
     { 
      vspd = 0; 
     } 
    } 
} 

if (hspd < 0 || keyboard_check(ord('A'))){ 
    if place_meeting(x+hspd, y, block_obj) 
    { 
     // pixel-perfect collision resolution 
     while(!place_meeting(x-1, y, block_obj)) 
     { 
      x -= 1; 
     } 
     hspd = 0; 
    } 
    else if keyboard_check(ord('A')) 
    { 
     if(!place_meeting(x-1, y, block_obj)) 
      hspd -= 2; 
    } 
    else 
    { 
     if(hspd < -2) 
     { 
      hspd += 1; 
     } 
     else 
     { 
      hspd = 0; 
     } 
    } 
} 
if (hspd > 0 || keyboard_check(ord('D'))){ 
    if place_meeting(x+hspd, y, block_obj) 
    { 
     // pixel-perfect collision resolution 
     while(!place_meeting(x+1, y, block_obj)) 
     { 
      x += 1; 
     } 
     hspd = 0; 
    } 
    else if keyboard_check(ord('D')) 
    { 
     if(!place_meeting(x+1, y, block_obj)) 
      hspd += 2; 
    } 
    else 
    { 
     if(hspd > 2) 
     { 
      hspd -= 1; 
     } 
     else 
     { 
      hspd = 0; 
     } 
    } 
} 

x += hspd; 
y += vspd; 

:ここ

そして

は、簡単なステップスクリプトです。

答えて

1

私がこれを行っていたら、else if文を使って、それぞれのコントロールをお互いに分離させるでしょう。擬似コードの例:それは完全にあなたに軸移動を増加しているので、それはあるかもしれない動作しない場合には、もはや、一度に複数の方向の加速度を提供することができるので、

if (w) { 
//code 
} else if (a) { 
//code 
} else if (s) { 
//code 
} else if (d) { 
//code 
} 

これはあなたの問題を助ける/妨げるべきではありませんあなたが壁に当たったときに、その理由で加速を許さないようにするために、あなたがキープレス内の衝突チェックを持っているので、衝突チェックがもはや問題ではないので、あなたはその方向に向かって加速しています。プレーヤーのみを戻してください。 私は何年も前から、あなたがやろうとしていることをやって、うまくやっていないことを見つけて、私に知らせてくれるプロジェクトを持っています。

+0

私は実際にこの問題を発見しました。私は運動量の各方向、vNegSpd vPosSpdなどに別々の変数を設定する必要があったので、衝突をチェックするときにその方向の変数のみを使用します。 問題は、 "D"を保持し、vspdが超高で "A"をスワップしたとき、同じ "high" vspdを使用して "A"ブランチが衝突をチェックし、 「壁」のソリューションを使用して、画面の反対側にすべてスナップします。 – user3776749

+0

入力を壊すことは、関係なく有用な追加になる可能性があります。私は斜めの動きをサポートしたいので、おそらく2つに分割するだけです(WAとSD)。 – user3776749

関連する問題