Example #1
0
        /// <summary>
        /// Инициализация сцены
        /// </summary>
        public override void Init()
        {
            base.Init();

            // Загрузить ресурсы, необходимые для данной сцены
            gd.rm.clear();
            gd.rm.addElementAsImage("#", @"Resources\Sprites\tile_wall.png");
            gd.rm.addElementAsImage(".", @"Resources\Sprites\tile_space.png");
            gd.rm.addElementAsImage("*", @"Resources\Sprites\tile_path.png");
            gd.rm.addElementAsImage("+", @"Resources\Sprites\tile_busy.png");

            // Создать объект - тайловую карту и загрузить данные из файла
            gd.map = Map.Load(@"Resources\Levels\Level_001.tmx");

            // TODO: у нас несколько тайлсетов. Служебные тайлсеты желательно пометить особым образом и обрабатывать отдельно (пометить точкой, @, # или что-то в этом духе)
            // Есть такие наборы тайлов: Tiles - тайлы для отображения карты, Monsters - тайлы и параметры монстров, Towers - тайлы и параметры башен

            // Загрузить отдельные спрайты в менеджер ресурсов как самостоятельные изображения (для ускорения отображения)
            // TODO: загружать только Tiles!!!
            //////foreach (Tileset ts in gd.map.Tilesets.Values)
            //////{

            Tileset ts = gd.map.Tilesets["Tiles"];

            int tileCount = ts.FirstTileID;

            // Загрузить базовое изображение
            gd.rm.addElementAsImage(ts.Image, @"Resources\Sprites\" + ts.Image);

            // Создать объект - карту спрайтов
            gd.ss = new SpriteSheet(gd.rm.getImage(ts.Image), ts.TileWidth, ts.TileHeight, ts.Spacing, ts.Margin);

            // Цикл по спрайтам внутри матрицы спрайтов
            for (int j = 0; j < ts.ImageHeight / ts.TileHeight; j++)
            {
                for (int i = 0; i < ts.ImageWidth / ts.TileWidth; i++)
                {
                    // Добавить этот спрайт в хранилище и наименованием tileset-<порядковый номер спрайта>
                    // TODO: как быть, если наборов тайлов несколько? Как вести нумерацию?
                    gd.rm.addElementAsImage("tileset-" + tileCount, gd.ss.getSprite(i, j));
                    tileCount++;
                }
            }

            // Заполнить массив проходимости тайлов
            foreach (int key in ts.TileProperties.Keys)
            {
                Tileset.TilePropertyList tpl = ts.TileProperties[key];
                //gd.log.write("key:" + (ts.FirstTileID + key) + " passability:" + tpl["Passability"]);
                if ("1".Equals(tpl["Passability"]))
                {
                    gd.canMove.Add(ts.FirstTileID + key);
                }
            }

            //////}

            // Загрузить параметры монстров
            // TODO: если тайлсет собран из нескольких изображений, в поле Image записывается имя последнего изображения
            ts = gd.map.Tilesets["Monsters"];

            foreach (int key in ts.TileProperties.Keys)
            {
                Tileset.TilePropertyList tpl = ts.TileProperties[key];
                // Доступны следующие свойства монстра: Name, Damage, Exp, HP, Speed
                // Создать структуру
                MobStruct ms = new MobStruct();
                ms.damage = float.Parse(tpl["Damage"]);
                ms.exp    = float.Parse(tpl["Exp"]);
                ms.hp     = float.Parse(tpl["HP"]);
                ms.speed  = float.Parse(tpl["Speed"]);
                ms.name   = tpl["Name"];
                // Занести в хранилище
                gd.mobtypes.Add(ms.name, ms);
            }


            // TODO: проверка сериализации списка монстров
            List <MobStruct> mmm = new List <MobStruct>(gd.mobtypes.Values);
            string           sss = UtilsParse.ToStringList(mmm);

            gd.log.write(sss);


            // Загрузить параметры башен
            ts = gd.map.Tilesets["Towers"];

            foreach (int key in ts.TileProperties.Keys)
            {
                Tileset.TilePropertyList tpl = ts.TileProperties[key];
                // Доступны следующие свойства башни: BulletSpeed, Cost, DamFreq, DamRadius, Damage, Desc, Elem, Name, Next
                // Создать структуру
                TowerStruct tws = new TowerStruct();
                tws.bulletSpeed   = float.Parse(tpl["BulletSpeed"]);
                tws.cost          = float.Parse(tpl["Cost"]);
                tws.damage        = float.Parse(tpl["Damage"]);
                tws.damage_freq   = float.Parse(tpl["DamFreq"]);
                tws.damage_radius = float.Parse(tpl["DamRadius"]);
                tws.description   = tpl["Desc"];
                tws.element       = tpl["Elem"];
                tws.name          = tpl["Name"];
                tws.nextTowerType = tpl["Next"];

                // Занести в хранилище
                gd.towertypes.Add(tws.name, tws);
            }

            // TODO: проверка сериализации списка башен
            List <TowerStruct> ttt = new List <TowerStruct>(gd.towertypes.Values);

            sss = UtilsParse.ToStringList(ttt);
            gd.log.write(sss);



            /*
             * // Загрузить путь, по которому движутся враги
             * // Пример строки: "0,0 96,0 97,63 129,64 130,191 319,192 321,100 447,100 447,253 225,257 226,353"
             * // набор пиксельных координат Х и У относительно координаты левого верхнего угла объекта.
             * string path = gd.map.ObjectGroups["Path"].Objects["Path"].Points;
             * int path_x = gd.map.ObjectGroups["Path"].Objects["Path"].X;
             * int path_y = gd.map.ObjectGroups["Path"].Objects["Path"].Y;
             * // Массив координат точек ломаной линии
             * string[] points = path.Split(' ');
             * gd.path = new List<PointF>();
             * // Занести данные в массив точек
             * for (int i = 0; i < points.Length; i++)
             * {
             *  string[] arr = points[i].Split(',');
             *  gd.path.Add(new PointF(float.Parse(arr[0]) + path_x + CONFIG.START_X, float.Parse(arr[1]) + path_y + CONFIG.START_Y));
             * }
             */

            // Создать объект для отображения карты
            TiledMapObject tmo = new TiledMapObject("TiledMapObject", gd, gd.map);

            // Координаты игрового поля на экране
            tmo.setPosition(CONFIG.START_X, CONFIG.START_Y);
            // Другие параметры
            tmo.setLayer(1);

            // Добавить объект на сцену
            objects.Add(tmo);

            // Получить путь движения монстра с помощью алгоритма поиска пути
            gd.astar     = new Astar();
            gd.aStarPath = gd.astar.pathFinderAstar(gd.map, new Point(2, 35), new Point(226, 384), CONFIG.TILE_SIZE, gd.canMove, new List <int>());

            // Добавить монстра
            Monster m = new Monster(0.2f, 1.0f, 1.0f, 1.0f, true);

            m.setLayer(2);
            m.setImage(gd.rm.getImage("*"));
            objects.Add(m);
        }
        /// <summary>
        /// Инициализация сцены
        /// </summary>
        public override void Init()
        {
            base.Init();

            //Cursor.Hide();

            // Загрузить ресурсы, необходимые для данной сцены
            gd.rm.Clear();

            // Создать объект - тайловую карту и загрузить данные из файла
            gd.map = Map.Load(@"Resources\Level_001.tmx");

            // Загрузить отдельные спрайты в менеджер ресурсов как самостоятельные изображения (для ускорения отображения)
            Tileset ts = gd.map.Tilesets["Tiles"];

            int tileCount = ts.FirstTileID;

            // Загрузить базовое изображение
            gd.rm.AddElementAsImage(ts.Image, @"Resources\" + ts.Image);

            // Создать объект - карту спрайтов
            gd.ss = new SpriteSheet(gd.rm.GetImage(ts.Image), ts.TileWidth, ts.TileHeight, ts.Spacing, ts.Margin);

            // Цикл по спрайтам внутри матрицы спрайтов
            for (int j = 0; j < ts.ImageHeight / ts.TileHeight; j++)
            {
                for (int i = 0; i < ts.ImageWidth / ts.TileWidth; i++)
                {
                    // Добавить этот спрайт в хранилище и наименованием tileset-<порядковый номер спрайта>
                    // TODO: как быть, если наборов тайлов несколько? Как вести нумерацию?
                    gd.rm.AddElementAsImage("tileset-" + tileCount, gd.ss.GetSprite(i, j));
                    tileCount++;
                }
            }

            // Заполнить массив проходимости тайлов
            foreach (int key in ts.TileProperties.Keys)
            {
                Tileset.TilePropertyList tpl = ts.TileProperties[key];
                //gd.log.write("key:" + (ts.FirstTileID + key) + " passability:" + tpl["Passability"]);
                if ("1".Equals(tpl["Passability"]))
                {
                    gd.canMove.Add(ts.FirstTileID + key);
                }
            }

            // Создать объект для отображения карты
            gd.tmo = new TiledMapObject("TiledMapObject", gd, gd.map);
            // Координаты игрового поля на экране
            gd.tmo.SetPosition(CONFIG.START_X, CONFIG.START_Y);
            // Другие параметры
            gd.tmo.SetLayer(1);

            // Добавить объект на сцену
            objects.Add(gd.tmo);

            // Загрузить спрайт игрока
            gd.rm.AddElementAsImage("Player1", @"Resources\player.png");

            // Создать объект ГГ
            gd.player = new Player("Player1", gd);
            gd.player.SetPosition(120.0f, 120.0f);
            gd.player.SetImage(gd.rm.GetImage("Player1"));
            gd.player.SetLayer(2);
            gd.player.SetGravity(false);
            gd.player.SetEngine(false);

            // Добавить игрока на сцену
            objects.Add(gd.player);
        }