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;
:ここ
そして
は、簡単なステップスクリプトです。
私は実際にこの問題を発見しました。私は運動量の各方向、vNegSpd vPosSpdなどに別々の変数を設定する必要があったので、衝突をチェックするときにその方向の変数のみを使用します。 問題は、 "D"を保持し、vspdが超高で "A"をスワップしたとき、同じ "high" vspdを使用して "A"ブランチが衝突をチェックし、 「壁」のソリューションを使用して、画面の反対側にすべてスナップします。 – user3776749
入力を壊すことは、関係なく有用な追加になる可能性があります。私は斜めの動きをサポートしたいので、おそらく2つに分割するだけです(WAとSD)。 – user3776749