北方之塔8

  最近開始嘗試製作怪物系統了,不過在製作這個系統之前花了不少時間在決定這個遊戲主要的戰鬥方式,到底是要用踩地雷進入戰鬥還是畫面中可以看到怪物走來走去,確實在這個點上考慮了很久,這也是造成怪物系統遲遲沒有開始動工的原因之一。

  如果以踩地雷或者是碰怪物進入戰鬥畫面的方式,在製作上對我來說會比較簡單一點,不過這樣子的系統表現卻不符合原本遊戲設定的方向,所以後來還是決定製作成可以看到怪物在地圖上走來走去,玩家跟怪物的攻擊都是即時的,這樣感覺會比較有趣一點。





  開始製作這個系統的時候,雖然整體系統架構已經有些複雜,不過在初期製作這部分上還不算太過困難,一開始先初步的可以在地圖建立的時候在隨機點產生一個怪物物件,這個需要在建立物件的時候傳入地圖資料的資訊,藉由這個資訊來判斷哪些格子是可以產生怪物的。

  此時產生出來的物件還不能移動,所以接著下一步就是讓這些物件可以移動,而移動的系統很久以前就已經做完了,玩家角色資料結構中也有一個這個類別來負責移動,這個類別單純化只有負責移動的部分,也因此怪物系統中的每個怪物的移動都可以使用這個類別,在移動上我也就不用重寫了,只需要增加一些邏輯判斷。

  加上移動沒有花很久,怪物的物件就可以自己走來走去、轉來轉去了,不過還沒有加上移動的邏輯判斷,所以怪物在移動的時候會重疊、會走到已經有怪物的格子上或者玩家在的格子上,這個在設定上是不允許的,所以下一階段就是增加邏輯判斷。

  此時怪物在移動的時候,除了要先判斷地圖可不可以移動之外,接著就是要判斷移動的方向是不是已經有物件在了,所以在怪物系統建立怪物的時候,此時準備一個列表在怪物物件產生的時候建立參照,之後只要怪物在移動的時候去確認這個列表中的每個物件沒有在移動方向上即可。

  系統很快就完成了,運作上也正常,怪物此時在地圖中走來走去已經不會重疊了,但是上面這個判斷怪物的方式似乎效率有些不好,如果我地圖上的怪物有100隻,那不就等於每隻移動的時候都得去跑100個物件的確認,這等於是每次移動就要做10000次的判斷。

  所以稍微小改了一下,把這個列表改為一個二維陣列,這個二維陣列的大小跟地圖大小需相同,怪物在移動的時候只需要去判斷目標在陣列位置中是否有物件即可,這樣上面的狀況就可以在每次移動的時候只做100次判斷,在這個狀況上就是用記憶體去換效率。


  到這邊為止怪物系統大致上算是完成,不過還有許多細節需要處理,把暫時性的Code去除,把一些方法拆出來,修掉重複的部分以及精簡一些邏輯判斷的部分,處理這些細節我想比起製作這個系統來說還要花更多的時間,也只能慢慢來啦。

No comments:

Post a Comment