2011-08-04 59 views
1

我正在實現一個粒子系統 - particle.cs,我需要訪問移動的敵方位置enemy.cs的vector2。我有多個粒子實例,也有<列表中的敵人>這些分配在game1.cs中。XNA - 跨類訪問vector2

我的問題是我如何從<列表中訪問敵人位置> game1中的iset,並使其在particle.cs中可用。 Borh particle.cs和enemy.cs是Game namespae的一部分。

我已經嘗試了各種方法來分配對象的新實例和分配公共設置/得到,但沒有運氣!

謝謝, 保羅。

添加進一步detials: 我可以添加一些真正的代碼,當我回到我的開發電腦,但現在一些進一步的評論。

enemies.cs - 只是一個基本的類與變量概述 - 位置,速度,大小等...雖然這些都在game1.cs中定義的值。

在Game1.cs中,我列出了所有敵人以及他們職位的另一個列表。

我有一個在Game1.cs中調用的粒子引擎,它反過來引用particles.cs - >這是我需要調用vector2敵人位置的值。

我嘗試通過建立game1.cs的實例來調用particle.cs中的敵人位置,但這是每個粒子並減慢遊戲運行速度。

我顯示哪些部分代碼shoudl?

謝謝

+0

你能展示一些代碼嗎? –

回答

0

如果您的粒子引擎需要訪問敵人列表,那麼您只需將該列表作爲參數傳遞給您的粒子引擎的構造函數即可。

我假設你有你的Game1是這樣的:

List<Enemy> enemies = new List<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)把單個粒子「關聯」到敵方位置。

+0

謝謝 - 我正在考慮重新設計我如何構建這種方法,並且您的反饋有助於稍後確認設計。 – Paul

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實例,以便他們可以使用敵人註冊表,可以這麼說。

+0

欣賞建議。 – Paul

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; 

所以這是它,這樣你可以通過任何你想要的任何值。

+0

謝謝 - 我明白分配真正的全局變量在C#中是不可能的,但會通過上面的建議,因爲這對於許多情況都有幫助。你知道全局變量與傳遞個人參考文獻(例如建議2)之間的性能差異嗎? – Paul

+0

@保羅我建議你不要走這條路。問問你自己,如果代碼中的一切都需要訪問這個變量。全局變量不太可能解決你的性能問題,你可能會後悔用它們進一步下線。他們是一種非常懶惰的編程方式。 – idlewire

+0

謝謝@idlewire - 在使用xbox上的當前粒子系統時,我看到一個很大的性能問題,在看到它出現後,我使用cpu而不是gpu,儘管我明白gpu的使用不能實現相同的附加變量,即敵方位置,你有任何性能提示CPU與GPU嗎? – Paul