Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Объекты останавливаются на сцене (http://www.flasher.ru/forum/showthread.php?t=157364)

ndez 04.06.2011 15:29

Объекты останавливаются на сцене
 
Доброго времени суток. У меня вот какой вопрос : добавляются объекты на сцену, объекты двигаются, в разных направлениях, а потом некоторые останавливатся, а некоторые двигаются или все останавливаются. Движение объектов по средством Event.ENTER_FRAME (через Timer мне не подходит). Код большой, приводить не буду, хочу узнать - может у кого есть какие соображения (может кто сталкивался с подобным) в каком направлении работать???

Bgg 04.06.2011 15:35

В чем вопрос заключается?

ndez 04.06.2011 15:41

Почему останавливаются объекты??? Такое впечатление, что Event.ENTER_FRAME для остановившихся объектов больше не доступен.

Bgg 04.06.2011 15:44

Потому что где-то косяк в вашем коде.

ndez 04.06.2011 15:53

Логично. Я пишу игруху. На сцену добовляю ботов - порядка 10 - двигаются - потом остановились. За это время я не каких действий не произвожу. Время остановки спонтанное (примерно через минуту - две). Дальше полет пуль- вроде летят, но иногда застывает на месте, может через минуту, может через пять такое произойти, а может и не произойти. При этом дальше стреляет и другие пули летят и умирают потом как положено. Попробую пример коротенький сделать.

Bgg 04.06.2011 15:55

Оч классно. Но без кода хз как вам помочь.

ndez 06.06.2011 04:35

Вложений: 1
Вот такой код подсократил, для примера, здесь объекты останавливаются через 1-7 минут. Обычно через 4-5 минут.

andrew911 06.06.2011 05:21

Цитата:

Сообщение от ndez (Сообщение 1001178)
Почему останавливаются объекты??? Такое впечатление, что Event.ENTER_FRAME для остановившихся объектов больше не доступен.

Это объекты недоступны становятся, вы нигде не сохраняете на них ссылку и их подчищает garbage collector

Код AS3:

private function botsTimer_timer(e:TimerEvent):void 
{
        bot = new Bot(main);
        if (Bot.botLoad == 10)
        {
                bTimer.stop();
        }
}

Заносите их например в массив

Код AS3:

private var bots:Array = [];
...
 
bot = new Bot(main);
bots.push(bot);

Ну и советую обрабатывать всех ботов в одном ENTER_FRAME, а не плодить его для каждого бота.

ndez 06.06.2011 06:02

Это первая моя игрушка, много чего не знаю. Это пример, реально ботов много видов и появляются они спонтанно. И количество их больше 10. Десять - я ограничил, что бы одновременно были на сцене, но при этом таймер не останавливается, а просто не появляются на сцене новые боты. Как только становится меньше - снова появляются. Но стоит оставить без движения и поражения ботов игрушку(а иногда и в процессе игры) - останавливаются боты.

Опять же если убрать классы пуль и оставить в данном примере только летающие боты - то в течении 10 минут они точно не останавливаются(дальше ждать не стал). Или в данном случае garbage collector просто не срабатывает???

Попробую массив, ботов конечное число, а вот как быть с пулями??? В данном примере нормально летают, а в реальном пули ботов и пули героя порой также зависают. И эти объекты доступны - об зависшие пули взрываются боты или уменьшается жизнь героя. И они удаляются со сцены когда значение контенер.numChild-1 соответствует данному объекту, но на это требуется время и соответственно появление новых пуль.

И еще хотел спросить - в процессе игры загрузка ЦП составляет примерно 20-30%(увеличивается постепенно) - мне кажется это много???

Cornford 06.06.2011 09:35

У меня тоже такое было я делал движения тоннеля через твин стандартный флешевский. через пару минут он останавливался. потом стал использовать TweenMax проблема решилась. Кроме того лучше всего использовать кэш менеджер для создания объектов тогда их не надо будет каждый раз создавать занова.

КорДум 06.06.2011 12:25

Цитата:

У меня тоже такое было я делал движения тоннеля через твин стандартный флешевский. через пару минут он останавливался. потом стал использовать TweenMax проблема решилась
Нужно сохранять ссылку на твин. В любом случае.

andrew911 06.06.2011 15:10

Цитата:

Сообщение от ndez (Сообщение 1001487)
Это первая моя игрушка, много чего не знаю. Это пример, реально ботов много видов и появляются они спонтанно. И количество их больше 10. Десять - я ограничил, что бы одновременно были на сцене, но при этом таймер не останавливается, а просто не появляются на сцене новые боты. Как только становится меньше - снова появляются. Но стоит оставить без движения и поражения ботов игрушку(а иногда и в процессе игры) - останавливаются боты.

Опять же если убрать классы пуль и оставить в данном примере только летающие боты - то в течении 10 минут они точно не останавливаются(дальше ждать не стал). Или в данном случае garbage collector просто не срабатывает???

Да, он срабатывает при определенных условиях. Несколько ботов занимают немного памяти, а постоянное создание пуль приводит к росту занятой памяти.

Цитата:

Сообщение от ndez (Сообщение 1001487)
Попробую массив, ботов конечное число, а вот как быть с пулями??? В данном примере нормально летают, а в реальном пули ботов и пули героя порой также зависают. И эти объекты доступны - об зависшие пули взрываются боты или уменьшается жизнь героя. И они удаляются со сцены когда значение контенер.numChild-1 соответствует данному объекту, но на это требуется время и соответственно появление новых пуль.

И еще хотел спросить - в процессе игры загрузка ЦП составляет примерно 20-30%(увеличивается постепенно) - мне кажется это много???

Как уже написали используйте "кэш менеджер для создания объектов" (object pool), при этом объекты достаются из кэша, отрабатывают и отправляются обратно в кэш, при этом нет постоянного роста памяти.

Загрузка зависит от характеристик ЦП.
Для начала, как я уже писал, вынесите все обработки Event.ENTER_FRAME из ботов и пуль, например, в общий менеджер объектов.

Cornford 07.06.2011 12:36

Вот пример реализации кеш менеджера:
http://www.ant-karlov.ru/TowerDefenc...e-obektov.html

ndez 08.06.2011 17:57

Спасибо, буду пробовать.

ndez 14.06.2011 16:38

Вложений: 1
Доброго времени суток. Попробовал сделать менеджер объектов по образу и подобию http://www.ant-karlov.ru/TowerDefenc...e-obektov.html и как то у меня не получается. Вроде бы все летает и стреляет и процессор в порядке, но:
Сначала заполняется массив и с этим порядок, а потом когда начинается обращение к функции get() для извлечения объектов - на сцене они не появляются, только когда _currentIndex=-1, начинают создаваться новые объекты и появляться на сцене. Но ведь это не правельно!
Код AS3:

package  {
 
        import flash.display.Sprite;
        import flash.display.Stage;
 
        public class SimpleCache {
 
        public var main:Main;
        protected var _targetClass:Class;
        protected var _currentIndex:int;
        public static var _currentIndexBot:int;
        public static var _currentIndexPuly:int;
        protected var _instances:Array;
 
 
                public function SimpleCache( targetClass:Class, initialCapacity:uint, nain) {
                        main = nain;
                        _targetClass = targetClass; // Базовый класс всех объектов
                        _currentIndex = initialCapacity - 1; // Индекс текущего свободного объекта
                        _instances = []; // Список всех объектов
                        // Заполняем обойму
                        for (var i:int = 0; i < initialCapacity; i++) {
                                _instances[i] = getNewInstance()
                        }
                }           
                protected function getNewInstance():Object        {
                        return new _targetClass(main);
                }
                public function get():Object {
 
                        if (_currentIndex >= 0) {       
                                // Здесь должен извлекаться объект из массива, но на сцене он не появляется
                                _currentIndex--;
                                return _instances[_currentIndex + 1];
                        }
                        else{
                                // Когда _currentIndex = -1, создаются новые объекты и они появляются на сцене
                                return getNewInstance();
                        }
                }
                public function set(instance:Object):void{
                        _currentIndex++; 
                        if (_currentIndex == _instances.length) {
                                _instances[_instances.length] = instance;
                        }
                        else{
                                _instances[_currentIndex] = instance;
                        }
                }
        }
}

И еще очень прошу - объясните мне как обратится к функции set() из другого класса, а то я конечно сочинил вариант, но потом убрал дабы не позорится
Код AS3:

        public class BotPuly extends Sprite {
          .
          .
          .
                        private function self_destructionBotPuly() {
                                if (botpulyphoto != null) {
                                        if (main.contenerBotPuly.contains(botpulyphoto)) {
                                                main.contenerBotPuly.removeChildAt(main.contenerBotPuly.numChildren - 1);
 
 
                                                //Здесь должен быть вызов set(instance:Object) только я не знаю как это правельно сделать
 
                                        }
                                        removeEventListener(Event.ENTER_FRAME, onEnterBotPuly);       
                                        botpulyphoto = null;
                                }
 
                        }



Часовой пояс GMT +4, время: 10:17.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.