2011-03-28 116 views
15

我有一個關於XNA遊戲我做的問題,但它也爲未來的遊戲的一般問題。我正在做一個Pong遊戲,我不知道在哪裏更新什麼,所以我會更好地解釋我的意思。我有一個類遊戲,球拍和球,例如,我想驗證與屏幕限制或槳球之間的碰撞,但我遇到2種的方法來做到這一點:遊戲架構

更高層次的方法 - 公開製作槳和球屬性,並在Game.Update檢查碰撞?

低層次方法 - 我向ball class(通過參數或Common public static class)和Ball.Update提供我需要的每個信息(屏幕限制和槳信息),以檢查碰撞?

我想我在一個更通用的方法的問題是:

是否一個對象需要知道如何更新和繪製自己,甚至有從,不知怎的,提供給他們更高層次的依賴?

更好利用管理來簡化代碼在Game.Update或Game.Draw或更高級別來處理它?

我認爲這是一個適用於每一個遊戲的遊戲邏輯模型的問題。我不知道我是否明確提出了問題,如果沒有,請隨時提問。

+1

我認爲你說「邏輯」的地方你實際上是指「架構」。 – 2011-03-28 14:01:10

+2

(我一直在參考這個問題,所以我會自己修復這個標題......) – 2011-08-15 14:36:47

+2

這更適合http://gamedev.stackexchange.com/ – AlexFoxGill 2013-03-18 17:18:09

回答

45

回答你的問題的困難之處在於你問的這兩個:「我現在應該做的,對傍」和「我該怎麼辦後,一些通用的遊戲」。


爲了傍你甚至不需要球和槳類,因爲他們基本上只是位置。只要堅持這樣的事情在你的遊戲類:

Vector2 ballPosition, ballVelocity; 
float leftPaddlePosition, rightPaddlePosition; 

然後,只需更新和一切爲了適合在你的遊戲的UpdateDraw功能吸引他們你。簡單!


但是,假設你想創建多個球和球的許多性質(位置,速度,旋轉,顏色等):你可能想使一個Ball類或結構,你可以實例(同去槳)。你甚至可以將一些功能移到那些自成一體的類中(Draw函數就是一個很好的例子)。

但保持設計概念相同 - 所有對象到對象的交互處理(即:遊戲玩法)都發生在您的Game類中。

這一切就好了,如果你有兩個或三個不同的遊戲元素(或類)。


然而,讓我們假定一個更加複雜的遊戲。讓我們參加基本的乒乓球比賽,添加一些彈球元素,如多球和玩家控制的腳蹼。讓我們添加一些來自Snake的元素,比如我們有一個AI控制的「蛇」以及一些拾取物體,這些物體可以是球或者蛇。並且,爲了讓我們說得更好,我們可以說划槳也可以像太空侵略者那樣拍攝激光,而激光栓根據拍攝的內容做不同的事情。

天哪這是一個相互作用的巨大的混亂!我們將如何應對?我們不能把它放在遊戲中!

簡單!我們製作一個界面(或一個抽象類或一個虛擬類),以便我們的遊戲世界中的每個「事物」(或「演員」)將從中派生出來。下面是一個例子:。

interface IActor 
{ 
    void LoadContent(ContentManager content); 
    void UnloadContent(); 

    void Think(float seconds); 
    void UpdatePhysics(float seconds); 

    void Draw(SpriteBatch spriteBatch); 

    void Touched(IActor by); 

    Vector2 Position { get; } 
    Rectangle BoundingBox { get; } 
} 

(這僅僅是一個例子沒有「一個真正的演員接口」,會爲每場比賽的工作,你需要設計自己這就是爲什麼我不不喜歡DrawableGameComponent。)

擁有一個通用的接口允許遊戲只是談論演員 - 而不需要知道你的遊戲中的每一種類型。這是剛出來做共同的所有類型的東西 - 碰撞檢測,繪製,更新,加載,卸載等

一旦你演員,你就可以開始擔心特定類型的演員。例如,這可能是Paddle的方法:

void Touched(IActor by) 
{ 
    if(by is Ball) 
     ((Ball)by).BounceOff(this.BoundingBox); 
    if(by is Snake) 
     ((Snake)by).Kill(); 
} 

現在,我喜歡讓由槳反彈球,但它確實是一個口味問題。你可以反過來做。

你到底應該能夠堅持在一個大名單,你可以簡單地通過遊戲遍歷所有的演員。

在實踐中,你可能最終具有不同類型的性能或代碼簡單起見演員的多個列表。這是可以的 - 但總的來說,試圖堅持遊戲的原則只知道通用演員。

演員可能還需要查詢各種原因存在哪些其他演員。因此,請給每個演員參考遊戲,並在遊戲中製作演員名單(當您編寫遊戲性代碼時,您不需要對公共/私人進行超級嚴格限制,並且這是您自己的內部代碼。)


現在

,你甚至可以更進一步,並有多個接口。例如:一個用於渲染,一個用於腳本和AI,一個用於物理等等。然後可以將多個實現組合到對象中。

這在this article中詳細描述。我在this answer有一個簡單的例子。如果你開始發現你的單個actor角色開始變成更多抽象類的「樹」,這是一個合適的下一步。

+0

真棒迴應 - 「然而讓我們假設一個更復雜的遊戲「。這聽起來很酷遊戲...正在開發這樣的東西:) – harag 2015-09-10 15:53:40

1

你可以看到你的球和槳作爲你遊戲的一個組成部分,而XNA爲你提供了基類GameComponent,它有一個Update(GameTime gameTime)方法,你可以重寫這個方法來完成邏輯。此外,還有的DrawableGameComponent類,它有它自己Draw方法重寫。每GameComponent類也有一個Game財產持有創建它們的遊戲對象。在那裏你可以添加一些你的組件可以用來自己獲取信息的服務。

你想哪種方法,要麼有一個「主」對象,處理的每一次互動,或提供信息的組件,讓他們自己作出反應是完全取決於你。後一種方法在大型項目中是首選。而且,這將是處理事物的面向對象的方式,爲每個實體提供自己的Update和Draw方法。

0

我同意安德魯所說的。我只是在學習XNA以及在我的課程中,例如您的球類。我至少有一個Update(遊戲時間)方法和一個Draw()方法。通常也是一個Initialize(),Load()。然後從主遊戲課程,我會從他們各自的堂兄弟那裏調用這些方法。這是在我學習GameComponent之前。這裏有一篇關於你是否應該使用它的好文章。 http://www.nuclex.org/blog/gamedev/100-to-gamecomponent-or-not-to-gamecomponent

2

你也可以選擇開始考慮遊戲的不同組件如何彼此交談。

球和槳,兩者都是遊戲中的對象,在這種情況下,可渲染,可移動的對象。 槳具有以下標準

它只能上下移動

  1. 槳葉固定在屏幕的一側,或在底部
  2. 槳葉可以由用戶控制(1比計算機或1比1)
  3. 槳葉可以呈現
  4. 槳葉只能移至底部或在屏幕的頂部,它不能通過它的邊界

球具有以下標準

它不能離開屏幕

  1. 它可以呈現
  2. 取決於它被擊中的槳的邊界,就可以間接地控制它(一些簡單的物理)
  3. 如果它落在槳後輪完成
  4. 當遊戲開始時,球通常附着在失去者的槳上。

識別常見的標準可以提取接口

public interface IRenderableGameObject 
{ 
    Vector3 Position { get; set; } 
    Color Color { get; set; } 
    float Speed { get; set; } 
    float Angle { get; set; } 
} 

也有一些GamePhysics

public interface IPhysics 
{ 
    bool HasHitBoundaries(Window window, Ball ball); 
    bool HasHit(Paddle paddle, Ball ball); 
    float CalculateNewAngle(Paddle paddleThatWasHit, Ball ball); 
} 

再有就是一些遊戲邏輯

public interface IGameLogic 
{ 
    bool HasLostRound(...); 
    bool HasLostGame(...); 
} 

這不是所有的邏輯,但它應該給你一個想法你需要在這些事情發生在行動尋找什麼,因爲你正在建設一個集圖書館,並且您可以用它來確定哪些事情發生的功能,什麼都有可能發生,以及如何。

此外,看着這個,你可以改進和重構,這是一個更好的設計。

瞭解你的域,並寫下你的想法。 未能計劃打算失敗