удаление старых плиток в запущенной игре, сделанной с помощью as3 и flash

Я начал создавать приложение для запуска игр для Android. Я решил сделать это во флэш-памяти, используя тайлы и Adobe Air. Игра заключается в том, что игрок должен автоматически бежать вправо и избегать препятствий, прыгая или скользя по земле.

Я сделал функцию, которая всегда берет первый уровень в массиве и использует его в качестве начального уровня.

private function createLevel()
    {
        map_level.levell();                                             

        level = map_level.level1;

        for(var t = 0; t < level.length; t++)
        {
            for(var u = 0; u < level[t].length; u++)
            {
                if(level[t][u] != 0)
                {                                   
                    var new_tile:platform_tile = new platform_tile;     

                    addChild(new_tile);         
                    new_tile.gotoAndStop(level[t][u]);
                    new_tile.x = u * 32;
                    new_tile.y = t * 32;

                    tiles.push(new_tile);                               
                }
            }
        }
        total_tile_width += u;
    }

Затем я создаю функцию, которая принимает случайный уровень в массиве путей.

private function random_level ()

Затем этот уровень добавляется в конце первой дорожки, когда игрок достигает определенной длины по дорожке, тогда дорожка кажется бесконечной и затем делается так, чтобы камера следовала за игроком.

private function update_level ()
    {
        random_level();

        for(var t = 0; t < mid_lvl.length; t++)
        {
            for(u = 0; u < mid_lvl[t].length; u++)
            {

                if(mid_lvl[t][u] != 0)
                {                                   
                    var new_tile:platform_tile = new platform_tile;     

                    level[t][u + total_tile_width] = mid_lvl[t][u];


                    addChild(new_tile);         
                    new_tile.gotoAndStop(mid_lvl[t][u]);
                    new_tile.x = (u + total_tile_width) * 32;
                    new_tile.y = t * 32;

                    tiles.push(new_tile);                               
                }
            }

        }
        // Indstiller hvis spilleren skal have en stigende fart
        if( movementspeed < 40)
        {
        movementspeed = movementspeed + 2;
        }
        else
            movementspeed = movementspeed;
        total_tile_width += u;
        trace ("speed: " + movementspeed);
    }

Все это работает как надо и функция игры идеальна как на ПК, но телефон, кажется, быстро перегружается, так как я не могу понять, как удалить старые уровни, которые уже были пройдены, и поэтому уровней будет много. в памяти телефона.

Мне нужно что-то вроде removeChild («старые плитки снова покинули сцену»), но я понятия не имею, как найти только старые плитки, а не только все плитки.

Кто-нибудь может мне помочь? Кстати, надеюсь, вы понимаете мой вопрос, поскольку я не лучший в написании английского.

Мортен


person user1370813    schedule 19.09.2012    source источник
comment
Я думаю, что пул объектов должен помочь здесь с оптимизацией для мобильных устройств. Проверьте это здесь: help.adobe.com/en_US/as3/ для мобильных устройств/ и видеоуроки здесь: gotoandlearn.com/play.php?id =160   -  person Andrius Baruckis    schedule 19.09.2012


Ответы (1)


Вы должны использовать 2 объекта BitmapData.

  • 2 - размер экрана. Мы называем их screenBuffer1 и screenBuffer2.
  • другой больше экрана, по крайней мере, на ширину плитки. Мы называем это ландшафтным буфером.

Потом :

  1. Запустите TerrainBuffer, отрисовав все видимые плитки начального экрана.
  2. Скопируйте текущую видимую область на screenBuffer1
  3. Рисовать спрайты на screenBuffer1
  4. Прикрепите screenBuffer1 к сцене

Теперь начинаем прокручивать

  1. Скопируйте текущую видимую область на screenBuffer2, сместив на величину прокрутки
  2. Рисовать спрайты на screenBuffer2
  3. Прикрепите screenBuffer2 к сцене

Продолжайте увеличивать смещение и чередуйте screenBuffer1 и screenBuffer2, чтобы один был виден, пока вы рисуете на другом.

Когда смещение достигает ширины плитки:

if(offset>tileWidth){
   offset-=tileWidth;
   // Move content of terrainBuffer to the left by tileWidth pixels
   // Draw a new column of tile on the right
}

Тогда продолжай зацикливаться!

person bokan    schedule 19.09.2012