我正在实现一个粒子系统 - 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中的敌人位置,但这是每粒子并且减慢了游戏的速度。
我要显示代码的哪些部分?
由于
答案 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;
就是这样,这样你就可以在任何地方传递你想要的任何值。