【问题标题】:XNA - accessing vector2 across classesXNA - 跨类访问vector2
【发布时间】:2011-08-04 18:13:35
【问题描述】:

我正在实现一个粒子系统-particle.cs,我需要访问移动敌人位置enemy.cs 的vector2。我有多个粒子实例以及 中的敌人,这些都在 game1.cs 中分配。

我的问题是如何从 game1 中的 iset 访问敌人位置并使其在particle.cs 中可用。 Borhparticle.cs 和enemy.cs 是游戏命名空间的一部分。

我尝试了各种分配新对象实例和分配公共 set/get 的方法,但没有运气!

谢谢, 保罗。

添加更多细节: 当我回到我的开发电脑时,我可以添加一些真实的代码,但现在还有一些更多的 cmets。

enemies.cs - 只是一个基本类,其中列出了变量 - 位置、速度、大小等......尽管这些都在 game1.cs 中用值定义。

在 Game1.cs 中,我有一个所有敌人的列表以及另一个位置列表。

我有一个在 Game1.cs 中调用的粒子引擎,它又引用了particle.cs -> 这是我需要调用 vector2 敌人位置值的地方。

我尝试通过建立 game1.cs 实例来调用particle.cs 中的敌人位置,但这是针对每个粒子的,并且会减慢游戏运行速度。

我应该显示代码的哪些部分?

谢谢

【问题讨论】:

    标签: inheritance object xna instances


    【解决方案1】:

    如果您的粒子引擎需要访问敌人列表,那么您可以将列表作为参数传递给粒子引擎的构造函数。

    我假设你的 Game1 中有这样的东西:

    List<Enemy> enemies = new List<Enemy>();
    

    因此,更改您的粒子引擎构造函数以接收对 Enemy 列表的引用,并将其保存在私有变量中。

    class ParticleEngine
    {
        private List<Enemy> _enemies;
    
        public ParticleEngine(List<Enemy> enemies)
        {
            _enemies = enemies;
        }
    }
    

    在 Game1 中,当您构建粒子引擎对象时,传入敌人列表。

    ParticleEngine particleEngine = new ParticleEngine(enemies);
    

    现在在粒子引擎中,您可以通过您的成员_enemies 访问敌人。而且由于它是对列表的引用,因此即使列表增长、缩小、更改,您仍然可以访问其“当前”成员。

    编辑:在重新阅读时,我看到你想要在你的particle.cs 中的敌人位置。这意味着每个粒子都需要知道每个敌人的位置,这可能是一个糟糕的设计。更好的解决方案是让您的 ParticleEngine(想想 ParticleManager)处理将单个粒子“关联”到敌人位置。

    【讨论】:

    • 谢谢 - 我正在考虑重新设计我如何构建这种方法,您的反馈有助于确认以后的设计。
    【解决方案2】:

    所以你说你尝试过给每个粒子一个对 Game1 的引用?我不知道你是这样做了还是试图为每个粒子创建一个新的 Game1。后者会......很糟糕(我认为我实际上从未在游戏中实例化 Game1......那不是无限递归吗?)。但是我看不出将 Game1 的引用简单地传递给每个粒子类的问题。在particle.cs中:

    private Game1 game;
    
    public Particle(/*your constructor vars here*/, Game1 mainGame)
    {
        //your existing constructor here
        this.game = mainGame;
    }
    

    现在,当你想检查敌人的位置时:

    private void CheckEnemyPositions() //or whatever you do
    {
        foreach(Enemy enemy in game.Enemies)
        {
            //do something with enemy.Position
        }
    }
    

    这...不会导致性能问题。至少,不像我理解的那样。它只是告诉每个粒子如何找到您的 Game1.cs 的单个实例,以便他们可以使用敌人注册表。

    【讨论】:

      【解决方案3】:

      这是我关于将值从一个类传递给另一个的帖子:

      ...因此,在游戏中传递您想要的任何值(例如屏幕宽度)的一个非常简单的方法是创建一个“GlobalVariable”,您可以在任何您想要的类中使用它。以下是如何完成这个简单的技巧。

      首先创建一个新的类并命名为 GlobalClass 像这样:

      class GlobalClass
      {
      }
      

      现在添加一个以公共方式访问它的私有变量。这里我创建了两个变量,一个用于屏幕高度,另一个用于宽度。

      class GlobalClass
      {
          private static float screenWidth; 
          private static float screenHeight;
      
          //As I said I made this for an other post but the
          //concept is the same if you want to get 
          // a vector2 value try this: private static vector2 enemieposition;
          // or a vector2 List: private static List<Vector2> enemieposition; ... etc
      
          public static float ScreenWidth
          {
              get { return screenWidth; }
              set { screenWidth = value; }
          }
      
          public static float ScreenHeight
          {
              get { return screenHeight; }
              set { screenHeight = value; }
          }
      }
      

      你就完成了!使用这个类,您可以在游戏的任何地方传递这两个变量。

      要访问这些变量,请执行以下操作:

      //In game1.cs
      GlobalClass.ScreenWidth = graphics.PreferredBackBufferWidth;
      GlobalClass.ScreenHeight = graphics.PreferredBackBufferHeight;
      
      //In an other class.
      int TextureHeight = GlobalClass.ScreenWidth;
      

      就是这样,这样你就可以在任何地方传递你想要的任何值。

      【讨论】:

      • 谢谢 - 我知道在 C# 中分配真正的全局变量是不可能的,但会通过你上面的建议,因为这将有助于一些 sceriaos。您知道全局变量与传递单个引用(例如建议 2 到问题)之间的性能差异吗?
      • @Paul 我建议你不要走这条路。问问自己代码中的所有内容是否都需要访问此变量。全局变量极不可能解决您的性能问题,并且您可能会后悔在以后使用它们。它们是一种非常懒惰的编程方式。
      • 感谢@idlewire - 我看到在 xbox 上使用当前粒子系统时性能受到很大影响,经过一番阅读后,我似乎使用的是 cpu 而不是 gpu,尽管我知道 gpu 使用无法实现相同的附加变量,即敌人的位置,你有 cpu vs gpu 的性能提示吗?
      • @Paul 你有没有机会从DrawableGameComponent 派生你的粒子类?当这些问题太多时,我已经阅读过性能问题。另一个问题:您的粒子对象是否经常被创建和销毁?如果是这样,你最好破坏粒子。相反,标记它们以便它们可以重复使用。
      • 我只是在 .cs 中使用基本 spritebatch,然后在 game1 update draw 中为粒子引擎调用它。是的,它们正在被创建和销毁——我将如何重用?目前他们有一个 TTL 然后过期。每个粒子的图像大小也会有所不同吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多