作者yoll522 (522)
看板GameDesign
標題[程式] 想請問關於關卡設計的事情
時間Sat Mar 30 00:58:41 2013
總覺得自己標題下的不夠好
但我有點不曉得該怎麼定自己的標題@@
各位高手們晚安,我們專題的遊戲已經快要告一段落了
這段時間我常上來問一些奇怪的問題,很謝謝各位熱心的幫忙
但最近我在遊戲上遇到了設計關卡的問題,所以又來請求協助了
還希望各位高手能指點一二,謝謝
我想請問類似雷電、雙截龍這類遊戲通常往前移動到某一個程度的時候
都會出現敵人。
雙截龍我有點忘了,但是雷電我確定的是怪物的出現順序都是固定的,
就算重玩,下一次出現的敵人、出現的順序還是那樣
也就是說可能場景到了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
1F:推 cooper6334:你的出怪模式應該不會讓怪跳著出,所以用一個陣列存 03/30 01:01
2F:→ cooper6334:每批怪出現的位置,再記已經出到第幾批怪 03/30 01:02
3F:→ cooper6334:if(現在位置>=出怪位置[第n批]){出第n批怪;n++;} 03/30 01:04
4F:→ cooper6334:有很多關就 if(現在位置>=出怪位置[第m關][第n批])... 03/30 01:12
5F:推 LayerZ:如果是雷電的話 與其說位置,不如說是時間? 03/30 01:29
6F:→ LayerZ:做一個pair<時間, 生怪資訊>的queue,照時間排列 03/30 01:30
7F:→ LayerZ:關卡開始時取出關卡資料 只比對queue的最前頭 時間到了就 03/30 01:31
8F:→ LayerZ:生怪並丟掉就好啦 一個時間也只需要判斷一次 03/30 01:32
9F:→ LayerZ:需要循環生怪的話可能要在生怪資訊做旗標,讀到的話再調整 03/30 01:33
10F:→ LayerZ:應該是演算法跟資料結構的範圍了@@ 03/30 01:35
11F:→ LayerZ:如果是雙結龍這種橫向卷軸的話.. 03/30 01:37
12F:→ LayerZ:關鍵資料是x座標而不是時間 03/30 01:40
13F:→ LayerZ:因為不是線性的,要掃描玩家經過的x座標,取出掃描過的x座 03/30 01:42
14F:→ LayerZ:標的生怪資訊.. 03/30 01:42
15F:→ LayerZ:一樣做個queue 按照x座標排列 03/30 01:44
16F:→ LayerZ:要用一個韓式寫完所有判斷也太難了... 03/30 01:48
17F:→ LayerZ:練習自己建立class/struct來整理資料 用point索引資料 03/30 01:49
18F:→ LayerZ:用stl容器跟演算法來簡化索引 03/30 01:50
19F:→ LayerZ:最後,如果有時間壓力,效能又不會太差,一個用add()函式完 03/30 01:52
20F:→ azureblaze:另外每次判斷並沒有你想的那麼昂貴,除非敵人有幾萬個 03/30 01:52
21F:→ LayerZ:成他也是ok的,重點是完成 03/30 01:52
22F:→ yoll522:原來如此,我真的是受教了,很感謝各位的幫助 03/30 10:38
23F:推 ddavid:如果生怪一定有某些順序性,可以嘗試類似Topological Sort 03/30 14:06
24F:→ ddavid:的方式建圖,然後只把可能的項目推到queue內,被觸發到的 03/30 14:08
25F:→ ddavid:事件就去查它指向的其它事件是不是已經沒有其它事件指著, 03/30 14:09
26F:→ ddavid:若無就跟著推進queue裡,這樣這個queue應該是最小的了。 03/30 14:10
27F:→ ddavid:另外如果有個絕對順序標準(雙截龍)那其實就不用想那麼多 03/30 14:11
28F:→ ddavid:了,反正是循序的,都只要看Linked List第一項就好,用過丟 03/30 14:12
29F:→ ddavid:掉自然不會重覆了。 03/30 14:12
30F:→ ddavid:像洛克人那種退後前進怪會重生的就得全搜了,但是洛克人把 03/30 14:13
31F:→ ddavid:關卡用樓梯等方式分割成多塊,所以單塊的搜尋量也不多。 03/30 14:14
32F:→ yoll522:好的,謝謝你的建議 04/01 14:23