【问题标题】:C# XNA - Sprite moves out of window/screenC# XNA - Sprite 移出窗口/屏幕
【发布时间】:2014-12-10 19:43:17
【问题描述】:

当我按向左或向上箭头键时,精灵会离开窗口/屏幕。我的代码:

    Texture2D m_PlayerShipTex;
    Rectangle m_PlayerShipHitBox;
    Vector2 m_PlayerShipPos = new Vector2(400, 486);
    Vector2 m_PlayerShipOrigin;

    int m_PlayerShipCurrentFrame = 1;
    int m_PlayerShipFrameWidth = 62;
    int m_PlayerShipFrameHeight = 64;

    float m_Timer = 0f;
    float m_Interval = 100;

    public void LoadContent(ContentManager Content)
    {
        m_PlayerShipTex = Content.Load<Texture2D>(".\\gameGraphics\\gameSprites\\playerShip\\playerShipSpriteSheet");
    }

    public void Update(GameTime gameTime)
    {
        m_PlayerShipHitBox = new Rectangle(m_PlayerShipCurrentFrame * m_PlayerShipFrameWidth, 0, m_PlayerShipFrameWidth, m_PlayerShipFrameHeight);
        m_PlayerShipOrigin = new Vector2(m_PlayerShipHitBox.X / 2, m_PlayerShipHitBox.Y / 2);

        MouseState m_MouseState = Mouse.GetState();
        KeyboardState m_KeyboardState = Keyboard.GetState();

        m_Timer += (float)gameTime.ElapsedGameTime.Milliseconds;

        if (m_Timer > m_Interval)
        {
            m_PlayerShipCurrentFrame++;
            m_Timer = 0f;
        }

        if (m_PlayerShipCurrentFrame == 2)
        {
            m_PlayerShipCurrentFrame = 0;
        }

        m_PlayerShipHitBox = new Rectangle(m_PlayerShipCurrentFrame * m_PlayerShipFrameWidth, 0, m_PlayerShipFrameWidth, m_PlayerShipFrameHeight);
        m_PlayerShipOrigin = new Vector2(m_PlayerShipHitBox.Width / 2, m_PlayerShipHitBox.Height / 2);

        if (m_KeyboardState.IsKeyDown(Keys.Right))
        {
            m_PlayerShipPos.X += 3;
        }

        if (m_KeyboardState.IsKeyDown(Keys.Left))
        {
            m_PlayerShipPos.X -= 3;
        }

        if (m_KeyboardState.IsKeyDown(Keys.Down))
        {
            m_PlayerShipPos.Y += 3;
        }

        if (m_KeyboardState.IsKeyDown(Keys.Up))
        {
            m_PlayerShipPos.Y -= 3;
        }

        if (m_PlayerShipPos.X <= 0)
        {
            m_PlayerShipPos.X = 0;
        }

        if (m_PlayerShipPos.X + m_PlayerShipTex.Width >= 1141)
        {
            m_PlayerShipPos.X = 1141 - m_PlayerShipTex.Width;
        }

        if (m_PlayerShipPos.Y <= 0)
        {
            m_PlayerShipPos.Y = 0;
        }

        if (m_PlayerShipPos.Y + m_PlayerShipTex.Height >= 620)
        {
            m_PlayerShipPos.Y = 620 - m_PlayerShipTex.Height;
        }

    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(m_PlayerShipTex, m_PlayerShipPos, m_PlayerShipHitBox, Color.White, 0f, m_PlayerShipOrigin, 1.0f, SpriteEffects.None, 0);
    }

我不知道有什么问题,我的窗口是 800x600,但如果我设置 m_PlayerShipTex.Width &gt;= 800 我只能到达屏幕的一半,这就是我使用 1141 的原因。窗口高度也是如此......我做错了什么,为什么船不在"reacheable" 区域?

【问题讨论】:

  • 如果它的纹理很大,并且你正在移动原点,你会看到这些效果。尝试将原点保持在 (0,0)。
  • 但是我没有原点变量。或者你的意思是``Vector2 m_PlayerShipPos = new Vector2(400, 486);`的原点?请帮忙。
  • 您设置了 m_PlayerShipOrigin 并在绘制纹理时使用它。我怀疑如果您使用 Vector2.Zero,您的原始逻辑会按预期工作,尽管旋转会关闭。
  • 我可以通过答案举个例子吗?因为我用Vector2.Zero 替换了m_PlayerShipPos,但是我根本无法移动船。
  • 完成。您需要为 origin 而不是 position 使用 Vector2.Zero。

标签: c# xna


【解决方案1】:

要修复原始问题,请使用此绘图功能:

public void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Draw(m_PlayerShipTex, m_PlayerShipPos, m_PlayerShipHitBox, Color.White, 0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0);
}

这将使用 (0,0) 作为绘图的原点;这意味着您的“边缘”计算将按最初预期工作。如果您想要居中的原点,则需要在计算边缘时考虑该调整。

改变原点的唯一原因是为了让旋转更容易;一般来说,你可以使用Vector2.Zero。

【讨论】:

  • 再问一个问题,我有一个精灵字体,应该显示在玩家飞船的上方。如何做到这一点?
  • @Charlie 小心;因为它的长度会随文本而变化(假设它需要居中)。基本上,您只需将其绘制在距船位置固定的 Y 偏移处,并且 X 偏移将根据长度和居中需要而有所不同。如果您希望文本左对齐,则可以修复 X ​​偏移量。
猜你喜欢
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多