C#XNA-精灵移出窗口/屏幕

本文关键字:屏幕 窗口 移出 精灵 C#XNA- | 更新日期: 2023-09-27 18:26:48

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

    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 >= 800,我只能看到一半的屏幕,这就是我使用1141的原因。窗户高度也是如此。。。我做错了什么?为什么船离开了"reacheable"区域?

C#XNA-精灵移出窗口/屏幕

要解决原始问题,请使用以下绘图函数:

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