1. 程式人生 > >吃豆人部分程式碼分析

吃豆人部分程式碼分析

吃豆人的專案下載地址,某位大神做的,亮點是參考地圖生成的部分

http://game.ceeger.com/forum/read.php?tid=160

地圖用一個txt檔案,如下圖的檔案,x表示牆的部分,.表示可吃的豆豆,  O表示一些特殊種類的豆豆

O............X.....XXX.XX............O
.XXXXX.X.X.X.X.XXX...X....XXXX.XXXX.XX
.X.....X...X.XXX.XXX.X.X.XX.....X.X.XX
.X.XXX.XXXXX.......X.X.X.X..X.X.X.X.X.

然後看看程式碼  js寫的

var mapAsset : TextAsset;
var blockPrefab : Transform;
var pelletPrefab : Transform; 
var superPrefab : Transform;

///看起來好像很簡單,可是實際操作時往往不知道從哪下手,簡單來說:

1確定這個虛擬世界的維度:這個地圖的維度是2,所以至少有兩個迴圈的

function Awake () {
    var map = mapAsset.text.Split ("\n"[0]); //以回車符來劃分一行行的東西
    var v = new Vector3 ();
    v.y = 1.0;
    var j_off = map.length / 2.0; 
    for (var j = 0; j < map.length; j ++) {  //每一行
        v.z = (map.length - j - j_off - 1) * 2;
        var i_off = map[j].length / 2.0;
        for (var i = 0; i < map[j].length; i ++) {  //每一列的東西
            v.x = (i - i_off) * 2 + 1;
            if (map[j][i] == "X") {       //字元 對應的 東西來擺放
                var inst = Instantiate (blockPrefab, v, Quaternion.identity);
                inst.transform.parent = transform;
            } else if (map[j][i] == ".") {
                Instantiate (pelletPrefab, v, Quaternion.identity);
            } else if (map[j][i] == "O") {
                Instantiate (superPrefab, v, Quaternion.identity);
            }
        }
    }
}

再看看怪物是怎麼移動的

var howLong = 1.0;   //每次移動長度
var howFast = 8.0;    //多快?
private var nextUpdate = 0.0;
private var direction : Vector3;

function Update () {
    if (Time.time > nextUpdate) {
        nextUpdate = Time.time + (Random.value * howLong);
        direction = Random.onUnitSphere;  //球體的隨機分佈
        direction.y = 0;  //設定y=0後,球體的分佈趨向於圓心,可以抽象的想象中心的點比旁邊的更多
        direction.Normalize (); //歸一化成1
        direction *= howFast;  //1* 速度
        direction.y = 1.5 - transform.position.y;
    }
    var controller = GetComponent(CharacterController);
    controller.Move(direction * Time.deltaTime);
}

//說實話  這個ai十分之蛋疼    到處亂跑, 可以修改之作為A*的專案