0

だから私は C# を使用して XNA でゲームを作成しています。ランダムな位置に作成された壁があり、壁を通り抜けるのを止めたり、画面上のポイントにテレポートしたりしようとしています。(注意、左と右が機能するようになりました。これは上と下だけです)

if (collision(wallRect[k], wallColours, pacmanRect, pacmanColor, 0))
//Collision works, not an issue here
{
    if (pacmanRect.Bottom > wallRect[k].Top && pacmanRect.Top < wallRect[k].Bottom)
    {
        if (pacmanRect.Right >= wallRect[k].Left  
            && pacmanRect.Right < wallRect[k].Right)
        {
            pacmanPos.X = wallRect[k].X - frameSize.X; 
            //frameSize is the size of the pacman sprite
        }                                
        else if (pacmanRect.Left <= wallRect[k].Right 
                  && pacmanRect.Left > wallRect[k].Left)
        {
            pacmanPos.X = wallRect[k].X + frameSize.X / 8;
        }
    }
    else if (pacmanRect.Right > wallRect[k].Left && pacmanRect.Left < wallRect[k].Right)
    {
        if (pacmanRect.Bottom >= wallRect[k].Top)
        {
            pacmanPos.Y = wallRect[k].Y - frameSize.Y / 8;
        }                  
        else if (pacmanRect.Top <= wallRect[k].Bottom)
        {
             pacmanPos.Y = wallRect[k].Y + frameSize.Y / 8;
        }
   }
   playSound(collisionSoundInstance);
}

これは、pacmanPos が更新されるゲーム ループの最後のポイントです。では、壁が実際の壁であり、その壁を通り抜けることができないようにするにはどうすればよいでしょうか?

4

2 に答える 2

2
if (pacmanRect.Bottom > wallRect[k].Top && pacmanRect.Top < wallRect[k].Bottom)

これは理にかなっていますか?パックマンが壁の最上部より上にあることはあり得ないと思いますが、同時に壁の下にある可能性はないと思います (y 座標系が下方向に正であり、それでもロジックがまだ怪しく見える場合を除きます)。

状態の 1 つを紙に描いてから、紙に表示されているコードを 1 行ずつ頭の中で検討することをお勧めします。たとえば、パックマンの最下端が壁の最上端に重なっている状態を描画します。次に、コードを見て、何が起こるか見てみましょう。

于 2013-01-03T22:12:05.887 に答える
0

If you have a game which is restricted to two dimensions you should use Box2D which makes your life much easier.

See comment if you want to stay to your own code

于 2013-01-03T21:17:10.773 に答える