[程式] 想請問關於關卡設計的事情

看板GameDesign作者 (522)時間12年前 (2013/03/30 00:58), 編輯推噓3(3029)
留言32則, 5人參與, 最新討論串1/2 (看更多)
總覺得自己標題下的不夠好 但我有點不曉得該怎麼定自己的標題@@ 各位高手們晚安,我們專題的遊戲已經快要告一段落了 這段時間我常上來問一些奇怪的問題,很謝謝各位熱心的幫忙 但最近我在遊戲上遇到了設計關卡的問題,所以又來請求協助了 還希望各位高手能指點一二,謝謝 我想請問類似雷電、雙截龍這類遊戲通常往前移動到某一個程度的時候 都會出現敵人。 雙截龍我有點忘了,但是雷電我確定的是怪物的出現順序都是固定的, 就算重玩,下一次出現的敵人、出現的順序還是那樣 也就是說可能場景到了A地方的時候a群怪要出現,B地方的時候b群怪要出現 其實我們專題遊戲也是打算採用這個方法來出現敵人 不同的是我們是類似雙截龍的橫向卷軸, 當玩家往右走到一定程度的時候,那些設定好的固定怪就會出現, 沒打完就不能繼續前進,但我在設計上一直有個疑問 就是關於敵人的呼叫問題,既然我在A地方那些敵群只會出現一次 那麼我該怎麼設計比較好? 假設我程式是向下面那樣寫 add_enemy(){ //用來判斷是否要呼叫敵人的函式 if( A群敵人還沒出現過==ture && 主角已經移動到了a地方==true ){ 呼叫A群怪物 A群怪物還沒出現過=false; } if( B群敵人還沒出現過==true && 主角已經移動到了b地方==true ){ 呼叫B群怪物 B群怪物還沒出現過=false; } } 其實我一直覺得我這個方法很不好,因為我明知不管是A群或B群敵人 這些敵人就只會出現這麼一次,那為什麼我每次都還要去判斷要不要出現這些怪 而且假設我有十個關卡,那這樣我不就會有add_enemy_1(); add_enemy_2(); 等十個函式來判斷現在是第幾關,第三關的話呼叫第三關的函式來判斷要新增哪群怪 所以我才想來請教一下我這樣的方法真的合適嗎@@? 還是這根本就是錯誤的設計 不曉得我的問題這樣描述會不會太模糊,還請各位多多包涵 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 49.158.0.128

03/30 01:01, , 1F
你的出怪模式應該不會讓怪跳著出,所以用一個陣列存
03/30 01:01, 1F

03/30 01:02, , 2F
每批怪出現的位置,再記已經出到第幾批怪
03/30 01:02, 2F

03/30 01:04, , 3F
if(現在位置>=出怪位置[第n批]){出第n批怪;n++;}
03/30 01:04, 3F

03/30 01:12, , 4F
有很多關就 if(現在位置>=出怪位置[第m關][第n批])...
03/30 01:12, 4F

03/30 01:29, , 5F
如果是雷電的話 與其說位置,不如說是時間?
03/30 01:29, 5F

03/30 01:30, , 6F
做一個pair<時間, 生怪資訊>的queue,照時間排列
03/30 01:30, 6F

03/30 01:31, , 7F
關卡開始時取出關卡資料 只比對queue的最前頭 時間到了就
03/30 01:31, 7F

03/30 01:32, , 8F
生怪並丟掉就好啦 一個時間也只需要判斷一次
03/30 01:32, 8F

03/30 01:33, , 9F
需要循環生怪的話可能要在生怪資訊做旗標,讀到的話再調整
03/30 01:33, 9F

03/30 01:35, , 10F
應該是演算法跟資料結構的範圍了@@
03/30 01:35, 10F

03/30 01:37, , 11F
如果是雙結龍這種橫向卷軸的話..
03/30 01:37, 11F

03/30 01:40, , 12F
關鍵資料是x座標而不是時間
03/30 01:40, 12F

03/30 01:42, , 13F
因為不是線性的,要掃描玩家經過的x座標,取出掃描過的x座
03/30 01:42, 13F

03/30 01:42, , 14F
標的生怪資訊..
03/30 01:42, 14F

03/30 01:44, , 15F
一樣做個queue 按照x座標排列
03/30 01:44, 15F

03/30 01:48, , 16F
要用一個韓式寫完所有判斷也太難了...
03/30 01:48, 16F

03/30 01:49, , 17F
練習自己建立class/struct來整理資料 用point索引資料
03/30 01:49, 17F

03/30 01:50, , 18F
用stl容器跟演算法來簡化索引
03/30 01:50, 18F

03/30 01:52, , 19F
最後,如果有時間壓力,效能又不會太差,一個用add()函式完
03/30 01:52, 19F

03/30 01:52, , 20F
另外每次判斷並沒有你想的那麼昂貴,除非敵人有幾萬個
03/30 01:52, 20F

03/30 01:52, , 21F
成他也是ok的,重點是完成
03/30 01:52, 21F

03/30 10:38, , 22F
原來如此,我真的是受教了,很感謝各位的幫助
03/30 10:38, 22F

03/30 14:06, , 23F
如果生怪一定有某些順序性,可以嘗試類似Topological Sort
03/30 14:06, 23F

03/30 14:08, , 24F
的方式建圖,然後只把可能的項目推到queue內,被觸發到的
03/30 14:08, 24F

03/30 14:09, , 25F
事件就去查它指向的其它事件是不是已經沒有其它事件指著,
03/30 14:09, 25F

03/30 14:10, , 26F
若無就跟著推進queue裡,這樣這個queue應該是最小的了。
03/30 14:10, 26F

03/30 14:11, , 27F
另外如果有個絕對順序標準(雙截龍)那其實就不用想那麼多
03/30 14:11, 27F

03/30 14:12, , 28F
了,反正是循序的,都只要看Linked List第一項就好,用過丟
03/30 14:12, 28F

03/30 14:12, , 29F
掉自然不會重覆了。
03/30 14:12, 29F

03/30 14:13, , 30F
像洛克人那種退後前進怪會重生的就得全搜了,但是洛克人把
03/30 14:13, 30F

03/30 14:14, , 31F
關卡用樓梯等方式分割成多塊,所以單塊的搜尋量也不多。
03/30 14:14, 31F

04/01 14:23, , 32F
好的,謝謝你的建議
04/01 14:23, 32F
文章代碼(AID): #1HLSX5cM (GameDesign)
文章代碼(AID): #1HLSX5cM (GameDesign)