1

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

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

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

谢谢,保罗。

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

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

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

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

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

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

谢谢

4

3 回答 3

0

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

...因此,在游戏中传递您想要的任何值(例如屏幕宽度)的一种非常简单的方法是创建一个“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;

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

于 2011-08-06T23:05:47.180 回答
0

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

我假设你的 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)处理将单个粒子与敌人位置“关联”。

于 2011-08-05T01:53:54.353 回答
0

所以你说你试过给每个粒子一个对 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 的单个实例,以便他们可以使用敌人注册表,可以这么说。

于 2011-08-05T01:48:05.847 回答