2013-04-14 96 views
0

我正在製作一款基於Nethack的遊戲。我需要決定最好的班級來放置通過地牢進行導航的方法。現在我執行移動的方式是隻需要播放器輸入一個字符。 (使用W,A,S,D作爲箭頭)。我有一段時間建立,所以它循環直到觸發器字符結束程序。在這個循環中,它通過打印地下城的狀態開始。要求輸入字符輸入,然後輸入if語句來檢查輸入的字符。在每個if語句中,它將調用一個相對於想要移動的輸入/方向的方法。所以我會有:moveUp(),moveRight()等等。我只需要弄清楚哪個類最適合放這些方法,這將決定如何調用方法,傳遞什麼,以及等等。我應該在哪個類中放置此方法? C++

我將用粗體列出類,並用縮進表示繼承。這裏是我涉及的類:

  • 實體:基類。它本質上表示任何/所有對象
    • 生物的:基本上代表了地牢
      • 球員生活「東西」:基本上是一個擴展的怪物..它是誰在玩的類。
    • 項目:作爲一個基類的任何一個被認爲會項目
      • 武器:一個武器..
      • 護甲:一塊裝甲..
      • 消耗品:可以消耗的物品..有其他幾個類別

我也有一些獨立的類:

  • 瓷磚:在A空間 「遊戲鍵盤」。它擁有Creature的ptr,指向Items的向量以及顯示該空間所代表的字符的char。
  • DungeonLevel:這是單個級別的遊戲板/網格。它有一個2D向量Tile對象。

我已經有地牢生成正確,什麼不是。對於每個DungeonLevel對象,所有的瓷磚將保持在同一個位置。因此,當一個播放生物移動(1點)的程序將調用這些方法來操縱DungeonLevel對象(的2D矢量瓷磚的),以反映在播放器/生物通過從將它們移動到平鋪到平鋪。然後程序重新啓動循環。

我不知道哪個類放這些方法。我基本上需要生物和玩家能夠移動。玩家根據字符輸入進行移動。遊戲中生成的生物/怪物將向玩家移動1個空間(如果可能)。

所以我不知道我是否應該使用相同的方法來控制任何實體或者如果DungeonLevel應控制移動,或生物基類和派生,播放機,類應該具有相同的運動方法,或者如果Creature應該有自己的球員,球員應該有自己的。

對此提出建議?謝謝。

+1

這不是您的問題的答案,而是基於您所做決定的種類,如果您尚未擁有設計模式,我強烈建議您閱讀這本書。我有設計模式:可重用的面向對象軟件的元素,並將其推薦。這本書讓我開始思考不同的課程設計類別和交互方式。 – Joshua

+0

是的,這是一個好主意。感謝您的建議。 – ModdedLife

+0

在http:// codeumbra上有一個使用libtcod庫編程roguelike遊戲的C++教程。eu/complete-roguelike-tutorial-using-c-and-libtcod-part-1-setting-up,它有一個相當深思熟慮的課堂教學。 C++教程基於更完整的python教程http://roguebasin.roguelikedevelopment.org/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod(我有一些參與)。 – Muscles

回答

1

因爲你正在做2D遊戲。即時假設你正在使用opengl。或directx。

用於移動地下城的瓷磚。我建議你不要移動它們。但相反,移動「相機」有許多書籍的opengl和directx如何重新工作。這就是你需要做的一切。檢查屏幕上是否顯示圖塊,只在屏幕上繪製圖塊。

至於決定誰應該控制什麼。玩家控制他自己的舉動是合乎邏輯的。但具有允許外部類別移動他的功能。不允許直接訪問他的私人,因爲他們不是朋友;)。

現在如何佈置你的課程。它很難明確地回答這個問題。而是來自所呈現的內容。

看這個樣子,玩家和生物和物品都是從實體繼承而來。他們都需要有什麼共同點?他們都需要一個位置。函數能夠獲取和設置他們的位置。他們的旋轉。也許是一個名字來標識它們。和一個更新函數來處理髮生在他們身上的任何操作?這是虛擬功能派上用場的地方。

因爲您的基類中可能有virtual void Update(int a_iDeltaTime); 。並且從它繼承的每一條信息都有它自己的更新類型。即玩家檢查按鍵。而敵人只更新他們的旋轉和移動。

編輯:這種方式,你可以只存儲所有你的敵人的球員項目。作爲實體*的,當你打電話更新,因爲它的虛擬。它會根據它的實際類型調用適當的更新。這意味着你只需要1個列表來存儲遊戲中的每種類型的實體。結束。

這樣你就可以把它們之間共享的所有東西放在基類中。並且只將這些獨特的東西放在主要的類中。

我所說的一切都是簡單的sugggestions,因爲您的實施應該是最適合您面對的確切問題的最佳選擇。並且只有這樣,您才能更好地瞭解在實踐中使用哪些實現方法,並且如前所述,您應該定義更多地瞭解設計模式,因爲它會打開思路,編寫代碼。並允許你寫簡單易讀的代碼。希望這可以幫助。

+0

傳統上,Roguelikes是*基於文本的*,並且在標準終端中運行,使用標準'conio'函數,或者像'curses'一樣支持lib – Textmode

相關問題