XNA - 跨类访问vector2

时间:2011-08-04 18:13:36

标签: inheritance object xna instances

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

我的问题是如何从<中访问敌人的位置?列表>在game1中iset并在particle.cs中使用它。 Borh particle.cs和enemy.cs是Game namespae的一部分。

我尝试了各种方法来分配对象的新实例并分配公共集合/获取,但没有运气!

谢谢, 保罗。

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

enemies.cs - 只是一个带有变量概述的基本类 - 位置,速度,大小等......虽然这些都是在带有值的game1.cs中定义的。

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

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

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

我要显示代码的哪些部分?

由于

3 个答案:

答案 0 :(得分: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的单个实例,以便他们可以使用敌人的注册表,可以这么说。

答案 1 :(得分: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(想想粒子管理器)处理将各个粒子“关联”到敌人位置。

答案 2 :(得分: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;

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