前言:
因為我模型只有建一層,但我做的程式有考慮y軸,之後擴充只要定義新的接口id即可。
程式、更多一樣貼在
個人網站上,喜歡的話可以幫忙點個讚φ(゜▽゜*)♪
先上成品預覽:
Wave Function Collpaes
原理可以參照以下影片:
原理簡單說是給每格單位圖片對應的接口id,每次更新一格時會同時更新周圍方塊可能的id,接著依照可能id數量,由少的開始放置,重複直到整張圖填滿。
實際上的接口id不會這麼簡單用0、1、3管理,自由度大一點的話還牽扯水平、垂直翻轉等情況。
地圖資料
我建了簡單的高度一層的模型。
使用Json定義每個模型的資料,allContent定義模型名稱、ports定義接口名稱,接著是每格可能的接口定義與其他屬性。
讀取地圖
json中的rotatable屬性標示可否直接用程式產生多個旋轉角度的複製品。
產生地圖
過程預覽:
主要變數定義:
為了讓生產不卡執行,且能像一般遊戲生產地圖時跑進圖條,這邊使用非同步(async)執行緒處理。
InitMap
初始化地圖大小
GenerateMapIteration
是主要花時間處理的部分,持續執行直到地圖被填滿。
GetNextTarget
Place Part
放置該格,固定該格編號。因為有些接口的組合沒有被定義,導致沒有對應的模型可以產生,這時地圖就會缺格子,看起來像是破洞。
我的解決辦法比較粗糙,遇到沒有被定義的接口組合時就補平面模型(id=0),然後回朔反推,直到每隔接口皆有定義。
反推:
我設置"resetCount"去紀錄這次第幾次反推,例如第一次反推重設該格相鄰的範圍;第二次反推則更新外圍第二層(藍色方塊),以此類推...
更新周圍
首先定義並找出相鄰的相對座標,藉此去存取周遭的可能接口。
成果:
地圖破壞
其實還有點bug,因為地形改變後,重算地形的演算法是直接使用上面的,導致出現一次挖掉整塊的現象。
原理是把要修改的那格與其周圍的格子從outComeMaps移除,接著跟產生完整地圖一樣計算。
這邊加了_keepZero 這個參數,讓原本是平地的(id=0)的方塊不會因為重算而被換上其他的。
後紀:
一定有更好的做法,但是我想改去做香香妹子遊戲,抱歉了這個專案。
下一篇大概寫lua