【问题标题】:Check the border of a sprite in XNA?检查 XNA 中精灵的边框?
【发布时间】:2013-01-21 22:54:42
【问题描述】:

我正在尝试使用 Window.ClientBounds.Width 来检查精灵是否在窗口边框内。我想在 Game1.cs 之外的另一个类中使用它。假设我有一个 Car.cs 类,并且在该类中我想有一个自己的 Update 方法来检查它是否在窗口的边界内,但是我不能使用 Window.ClientBounds.Width 这个!?我还测试了创建一个静态 int gameBorder = Window.ClientBounds.Width;在 Game1.cs 中并以这种方式达到值,但这也不起作用?!帮助是preciated!谢谢!

对于免费的 XNA 问题,有没有比 stackowerflow 更好的方法?

【问题讨论】:

    标签: c# xna xna-4.0


    【解决方案1】:

    在构建 Car 类时,我将传递对应该是汽车的一部分的 Game 或应该在其上显示的 GraphicsDevice 的引用。

    class Car
    {
       // Keep a reference to the game inside the car class.
       Game game;
    
       public Car (Game game)
       { 
          this.game = game;
       }
    
       public void Update(.....
       { 
           // You can access the client bounds here.
           // the best thing about this method is that
           // if the bounds ever changes, you don't have
           // to notify the car, it always has the correct
           // values.
       }
    }
    

    【讨论】:

      【解决方案2】:

      没有必要去做所有的工作,浪费所有的记忆。

      XNA 有一种非常精确和具体的测试对象位置的方法。

      您可以简单地传入 GraphicsDeviceManager graphics.PreferredBackBufferWidth 和 Height 方法来获取窗口的宽度和高度。

      从那里,您可以根据对象是否在这些位置的矩形内来知道它是否在游戏窗口中可见。

      假设您将后台缓冲区的宽度和高度设置为 640x480。

      然后您只需检查纹理的边界是否在该矩形内。

      所以,这是你的功能:

      public void CheckIfWithinWindow(int width, int height)
      {
          Rectangle wndRect = new Rectangle(0, 0, width, height);
          Rectangle carRect = new Rectangle(carPos.X, carPos.Y, carTexture.Width, carTexture.Height);
      
          if (wndRect.Intersects(carRect))
          {
               //carTexture is within currently visible window bounds!
          }
          else
          {
               //carTexture is NOT within currently visible window bounds!
          }
      }
      

      然后你可以像这样在你的起始 XNA 类中从你的更新方法调用这个函数。

      public void Update(GameTime gameTime)
      {
           myCar.CheckIfWithinWindow(graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight);
      }
      

      希望对您有所帮助。玩得开心。

      【讨论】:

      • 那么在每个 update() 方法中传递 2 个值类型,而不是在构造中传递 1 个引用类型?不确定哪个会浪费更多内存。同样通过游戏类,您可以访问 game.GraphicsDevice.Viewport.Bounds.Intersects(..) ,这不需要您创建另一个矩形。
      • 您使用的格式会传入并复制整个游戏对象,并始终将其实例保存在内存中。这比快速传递和复制两个整数要昂贵得多。至于我的矩形,通过你的方法来检查你是否在界限内,他们仍然需要使用矩形对象,或者从 Game 对象中调用一个成员函数来做同样的事情,以检测对象是否是在窗口范围内。
      • 简单来说,并不是传一个对象比传两个对象便宜,而是你传入的GameObject是比两个int更大的内存对象。一个包含大量变量的游戏对象(在基本游戏对象本身的初始内存之上)将大于这两个整数的 8 个字节。
      • 但是你可以,也许在里面使用一个“ref”,然后我们就会变得很笨拙,这与我所做的效率相当。
      • 我并不是要对此表示反对,但 ref 关键字不需要通过引用传递游戏,因为它是一个引用类型。我通常不会继续讨论这个问题,但它是 .net 编程的一个非常基本的部分。 msdn.microsoft.com/en-us/library/s6938f28(v=vs.80).aspx
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 2023-03-07
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多