2010-01-16 40 views
0

首先你好,這是我第一次來這裏。我是年輕的編碼器(15),這是我第二次嘗試製作一款遊戲(實際上是整個可重用遊戲引擎和框架,不知道如何稱呼它,也許是GDK?),而這次使它更有組織性。將對象鏈接到列表以供以後手動編輯(遊戲引擎/框架 - 實體管理部分)

重要提示:我使用的是XNA框架,所以遊戲引擎並不是純粹的低級DirectX管理!我試圖用預定義的類來擴展XNA,這些類將很容易插入任何遊戲並稍後管理!

我被困在找到一種方法將實體放入WorldManager的列表中,稍後檢索實體以進行直接更改,然後將其放回列表中(所以它與Update方法一起使用)。

我的想法(和問題)是:

  1. 最佳可能的解決方案以某種方式使與列表鏈接的實體,所以我更新列表更新過孤獨的實體對象。不幸的是我不知道該怎麼做,這可能是最好的答案。

  2. 我還想過的是編輯我創建的實體,然後使用find在列表中查找並更新。問題是我不確定find方法如何搜索。如果有任何改變會使方法認爲它是一個全新的不同物體呢? (如何找到實際發現?)

  3. 我所做的是在添加到實體時將實體添加到列表中,以便在編輯後將它們放回原位。問題是我也有刪除方法,我不確定它是否會更改索引,因爲如果它會那麼我每次刪除實體時都必須重新更新ID。我發現效率很低。那麼列表<> .Remove改變索引? (我猜它會)

這些其實都是在一個3個問題,我會很感激的任何一個答案,當然答案的問題的最頂層將更加感激!

一段代碼來獲得的想法是怎麼做的所有工作:

public class WorldManager 
{ 
    List<Entity> Entities = new List<Entity>(); 
    List<Entity> ToAdd_Entities = new List<Entity>(); 
    List<Entity> ToRemove_Entities = new List<Entity>(); 
... 
    public void Update() 
    { 
     for(int count = 0; count < ToAdd_Entities.Count; count++) 
     { 
      Entities.Add(ToAdd_Entities[count]); 
      int index = Entities.IndexOf(ToAdd_Entities[count]); 
      Entities[index].ID = index; 

      ToAdd_Entities.Remove(ToAdd_Entities[count]); 
     } 

     for (int count = 0; count < ToRemove_Entities.Count; count++) 
     { 
      Entities.Remove(ToRemove_Entities[count]); 
      ToAdd_Entities.Remove(ToAdd_Entities[count]); 

      //index update is required here too, I just didn't implement it yet. 
     } 
    ... 
    } 
} 

我將如何訪問:

List<Entity> bots = WorldManager.GetEntitiesByName("bot"); 
bots[1].Location = new Vector2(x,y); 
WorldManager.UpdateEntities(bots); 

我不使用這段代碼,這只是一個我的想法的簡單例子。

請原諒我混淆的英語(如果您覺得困惑),我是塞爾維亞人。

在此先感謝。

+0

你之前」已經寫了七場比賽,你真的不知道寫一個可重用的遊戲引擎。專注於先編寫一個遊戲:) – Andomar 2010-01-16 13:02:58

+0

你是對的,但我並不是真的一個人工作(實際上我很難),但是爲了另一個遊戲再次編寫所有的代碼對我來說太過分了!我還寫了那七場比賽,不幸的是這些比賽都沒有完成,因爲有缺陷的設計。關鍵是要製造一個框架!抱歉,我寫錯了。 – Johnny 2010-01-16 18:01:23

回答

0

嗯,我已經得到了我最高解決方案的答案!從我的另一個問題得到它,並認爲我也應該在這裏提出解決方案。

答案是,只要我將它添加到列表中,它就已經鏈接了,因爲實體是一個類,它的對象是「引用類型」,所以當我將它們分配給其他對象或列表時這種情況下,他們與它聯繫在一起。我對該對象所做的任何更改都會在另一端自動更新!

(有人糾正我,如果我錯了,我會盡快,我把我的框架/引擎測試檢查了這一點,並讓你知道是這個「的」解決方案。)

0

我建議不要與「每個對象都在一個大單子」 - 方法。而是專注於引擎中的輸入,圖形和其他基本內容,然後將剩下的留給遊戲特定的類。

想象一下,你已經擁有了一個擁有大量樹木的2D世界,它們大多都是靜態的。現在你已經有5K人坐在你的實體列表中,完全不做任何事情,而不是把它們放在那裏,你應該把它們放在你的Map類的某個List中,這樣它們更容易訪問(你不需要必須通過整個列表才能找到它們),設計也變得更加清潔。通過這種方式,您不必編寫一整類通用處理程序代碼,最終仍然不適合您可能投入到您的世界的所有可能的對象。

所以從我身邊的3個祕訣是: - 將唯一的非遊戲特定代碼的引擎(圖形,聲音輸入) - 從發動機只調用遊戲中的2種方法,例如像updateGame()和renderGame()然後處理其餘的問題 - 最後但並非最不重要的一點是:讓遊戲組件與其他組件保持分離,只讓它們在真正需要的地方進行交互。

同樣重要的是,建立一些遊戲,然後看看他們真正分享哪些代碼,並從這些代碼組成你的引擎。

如果你想要一個這樣做的例子(雖然我不保證它是完美的),你可以看看我的小型引擎here。這是Java並沒有很好評論,但它應該給你一個關於如何構建引擎的基本想法。如果你想看看我使用引擎構建的遊戲,請查看下載部分。

+0

這是很好的思維方式,但我錯了我想告訴我正在製作整個框架。我其實需要直接回答我的問題。爲什麼?因爲我的遊戲實際上就是簡單的自上而下的2D遊戲,所以它不會在維護一個列表中的所有實體時遇到任何問題。該列表像「事件處理程序」一樣工作,它在每個實體上調用全局更新。 – Johnny 2010-01-16 18:04:59

+0

我仔細看了一下你的引擎,弄清了它是如何工作的,但是當我更徹底地閱讀它時我會得到它。這仍然不是我正在尋找的答案,但我會爲您的努力甚至是舉例而投票,但不幸的是我沒有足夠的代表。 我最近讀了一些關於基於組件的實體管理的內容,如果你能找到我這樣的框架的例子,我將不勝感激。 – Johnny 2010-01-16 18:46:02