1

初めて XNA を使用して、簡単な RPG ゲームを作成します。

異なる方向に移動するたびに、キャラクターが異なる方向を向くようにしようとしています。

問題は、起動時にテクスチャさえ見えないことです。ゲーム内の特定の位置を歩くと、スプライトシート全体が見えるようになるのが奇妙なことです。AI NPC についても同じことが言えます。背景の後ろに横たわっていて、移動している長方形は透明です(したがって、背景を通して見ることができます)。

クラスのインスタンスを作成すると、FrameWidth と FrameHeight が送信されます。(高さ = 0 (スプライトシートの上部から開始)、幅 = スプライトシートの幅 / 4 (単一のスプライトを取り出すため))

速度は、キャラクターが移動する速度です。

    public override void Update(GameTime gameTime)
    {
        ObjectRectangle = new Rectangle(CurrentFrame * FrameWidth, 0, FrameWidth, FrameHeight);
        Origin = new Vector2(ObjectRectangle.Width / 2, ObjectRectangle.Height / 2);
        Position += Velocity;

        ObjectRectangleX = (int)PositionX;
        ObjectRectangleY = (int)PositionY;

        #region movement
        if (Keyboard.GetState().IsKeyDown(Keys.D) && Pastkey.IsKeyUp(Keys.A) && Pastkey.IsKeyUp(Keys.W) && Pastkey.IsKeyUp(Keys.S))
        {
            AnimateRight(gameTime);
            VelocityX = 2;
        }
        else if (Keyboard.GetState().IsKeyDown(Keys.A) && Pastkey.IsKeyUp(Keys.D) && Pastkey.IsKeyUp(Keys.W) && Pastkey.IsKeyUp(Keys.S))
        {
            AnimateLeft(gameTime);
            VelocityX = -2;
        }
        else if (Keyboard.GetState().IsKeyDown(Keys.W) && Pastkey.IsKeyUp(Keys.A) && Pastkey.IsKeyUp(Keys.D) && Pastkey.IsKeyUp(Keys.S))
        {
            AnimateUp(gameTime);
            VelocityY = -2;
        }
        else if (Keyboard.GetState().IsKeyDown(Keys.S) && Pastkey.IsKeyUp(Keys.A) && Pastkey.IsKeyUp(Keys.W) && Pastkey.IsKeyUp(Keys.D))
        {
            AnimateDown(gameTime);
            VelocityY = 2;
        }
        else
        {
            Velocity = Vector2.Zero;
        }

        Pastkey = Keyboard.GetState();

        #endregion
    }

    #region Animations

    public void AnimateDown(GameTime gameTime)
    {
        CurrentFrame = 2;
    }
    public void AnimateRight(GameTime gameTime)
    {
        CurrentFrame = 3;
    }
    public void AnimateLeft(GameTime gameTime)
    {
        CurrentFrame = 1;
    }
    public void AnimateUp(GameTime gameTime)
    {
        CurrentFrame = 0;
    }

    #endregion

}

Draw メソッドは次のようになります。

    public virtual void Draw(SpriteBatch spriteBatch)
    {

        spriteBatch.Draw(ObjectTexture, Position, ObjectRectangle, Color.White, 0f, Origin, 1.0f, SpriteEffects.None, 0f);
        GameList.Add(this);
    }

(List.Addは無視)

だから私が助けを必要としているのは、テクスチャを長方形に「ロック」することです。

4

2 に答える 2

1

これらの行は不要に見えます

ObjectRectangleX = (int)PositionX;
ObjectRectangleY = (int)PositionY;

注目すべき点の 1 つは、.Draw 呼び出しの最後のパラメーターです。これはレイヤーの深さであり、その値が地形よりも低い場合、地形が上に描画されます... spritebatch.begin() 引数に依存すると思います。ここで、レイヤーの深さについてさらにいくつかのビットが説明されている、もう少し読むことができます。 https://gamedev.stackexchange.com/questions/23619/2d-layerdepth-not-working-xna-4-0

于 2012-04-09T11:31:02.620 に答える