Exemplo n.º 1
0
    void setupWorld(XmlElement gameobject)
    {
        worldmgr             = new WorldManager();
        worldmgr.parentScene = this;
        worldmgr.name        = gameobject.GetAttribute("wname");

        foreach (XmlElement child in gameobject.ChildNodes)
        {
            if (child.GetAttribute("name") == "Terrain")
            {
                worldmgr.terrainName = child.SelectSingleNode("name").InnerText;

                string[] ssize = child.SelectSingleNode("size").InnerText.Split(new char[] { ' ' });
                worldmgr.size.x = float.Parse(ssize[0]);
                worldmgr.size.y = float.Parse(ssize[1]);
                worldmgr.size.z = float.Parse(ssize[2]);

                worldmgr.chunkSplit = int.Parse(child.SelectSingleNode("splitSize").InnerText);
                worldmgr.chunkSize  = worldmgr.size.x / worldmgr.chunkSplit;

                Common.DEBUG_MSG("name:" + worldmgr.name + ", worldsize:" + worldmgr.size + ", splitChunks:" +
                                 worldmgr.chunkSplit + ", chunkSize:" + (worldmgr.size.x / worldmgr.chunkSplit));

                foreach (XmlElement tchild in child.SelectSingleNode("splatprotos").ChildNodes)
                {
                    KeyValuePair <string, string> p = new KeyValuePair <string, string>(tchild.GetAttribute("texture"), tchild.GetAttribute("normalMap"));
                    worldmgr.load_splatPrototypes.Add(p);

                    KeyValuePair <Vector2, Vector2> p1 = new KeyValuePair <Vector2, Vector2>(
                        new Vector2(
                            float.Parse(tchild.GetAttribute("tileSizeX")),
                            float.Parse(tchild.GetAttribute("tileSizeY"))),
                        new Vector2(
                            float.Parse(tchild.GetAttribute("tileOffsetX")),
                            float.Parse(tchild.GetAttribute("tileOffsetY")))
                        );

                    worldmgr.splatPrototypes_titlesizeoffset.Add(p1);
                    Common.DEBUG_MSG("set load splatPrototype:" + tchild.GetAttribute("texture"));
                }

                foreach (XmlElement tchild in child.SelectSingleNode("treePrototypes").ChildNodes)
                {
                    worldmgr.load_treePrototypes.Add(tchild.GetAttribute("prefab"));
                    Common.DEBUG_MSG("set load treePrototype:" + tchild.GetAttribute("prefab"));
                }

                foreach (XmlElement tchild in child.SelectSingleNode("detailPrototypes").ChildNodes)
                {
                    worldmgr.load_detailPrototypes.Add(tchild.GetAttribute("prefab"));
                    Common.DEBUG_MSG("set load detailPrototype:" + tchild.GetAttribute("prefab"));
                }

                worldmgr.createWorldObjs();
            }
            else
            {
                WorldSceneObject obj = new WorldSceneObject();

                Asset newasset = findAsset(child.GetAttribute("asset"), true, child.GetAttribute("layer"));

                Vector3 pos = Vector3.zero;
                Vector3 rot = Vector3.zero;
                Vector3 sca = Vector3.zero;

                XmlNode gameobjectpos = child.SelectSingleNode("transform").SelectSingleNode("position");
                XmlNode gameobjectrot = child.SelectSingleNode("transform").SelectSingleNode("rotation");
                XmlNode gameobjectsca = child.SelectSingleNode("transform").SelectSingleNode("scale");

                pos.x = float.Parse(gameobjectpos.SelectSingleNode("x").InnerText);
                pos.y = float.Parse(gameobjectpos.SelectSingleNode("y").InnerText);
                pos.z = float.Parse(gameobjectpos.SelectSingleNode("z").InnerText);

                rot.x = float.Parse(gameobjectrot.SelectSingleNode("x").InnerText);
                rot.y = float.Parse(gameobjectrot.SelectSingleNode("y").InnerText);
                rot.z = float.Parse(gameobjectrot.SelectSingleNode("z").InnerText);

                sca.x = float.Parse(gameobjectsca.SelectSingleNode("x").InnerText);
                sca.y = float.Parse(gameobjectsca.SelectSingleNode("y").InnerText);
                sca.z = float.Parse(gameobjectsca.SelectSingleNode("z").InnerText);

                obj.name           = child.GetAttribute("name");
                obj.position       = pos;
                obj.eulerAngles    = rot;
                obj.scale          = sca;
                obj.idkey          = child.GetAttribute("id");
                obj.asset          = newasset;
                newasset.loading   = false;
                newasset.type      = Asset.TYPE.WORLD_OBJ;
                newasset.loadLevel = Asset.LOAD_LEVEL.LEVEL_SCRIPT_DYNAMIC;
                // newasset.refs.Add(obj.idkey);

                WorldManager.ChunkPos chunkpos = WorldManager.calcAtChunk(pos.x, pos.z, worldmgr.chunkSplit, worldmgr.chunkSize);
                worldmgr.worldObjs[chunkpos.x, chunkpos.y, 0].Add(obj);
            }
        }

        worldmgr.load();
    }
    void Update()
    {
        if (Camera.main == null)
        {
            Common.DEBUG_MSG("RPG_Controller::Update: not ready!");
            return;
        }

        if (characterController == null)
        {
            Common.DEBUG_MSG("Error: No Character Controller component found! Please add one to the GameObject which has this script attached.");
            return;
        }

        if (WorldManager.currinst != null)
        {
            WorldManager.ChunkPos currChunk = WorldManager.currinst.atChunk();
            if (currChunk.x >= 0 && currChunk.y >= 0)
            {
                if (WorldManager.currinst.loadedChunk(currChunk) == false)
                {
                    canControl = 0;
                    showAlert(true);
                    Common.DEBUG_MSG("RPG_Controller::Update: wait for load(" + (currChunk.x + 1) + "," + (currChunk.y + 1) + "), currpos=" + transform.position);
                    return;
                }

                if (WorldManager.currinst.loadedWorldObjsCamera() == false)
                {
                    canControl = 0;
                    showAlert(true);
                    Common.DEBUG_MSG("RPG_Controller::Update: wait for load(worldObject)!");
                    return;
                }

                if (canControl < 5)
                {
                    canControl += 1;
                    return;
                }

                if (enabled == false)
                {
                    // Common.DEBUG_MSG("RPG_Controller::Update: enabled = false!");
                    if (isShowAlert == true)
                    {
                        showAlert(false);
                    }
                    return;
                }

                KBEngine.Entity player = KBEngineApp.app.player();
                if (player == null)
                {
                    return;
                }

                walkSpeed = ((KBEngine.Avatar)player).moveSpeed / 10f;                  // 每秒速度
            }
        }

        GetInput();
        StartMotor();

        if (isShowAlert == true)
        {
            showAlert(false);
        }
    }