Форум 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=169905)

Vansimar 14.10.2011 12:23

Организация перемещений персонажей
 
Вот смотрите ,у меня есть класс врага ,допустим Enemy_per, в нем я добавляю слушатель событий ENTER_FRAME и там прописываю код на перемещение персонажа,те постоянное движение,от одного края до другого ,разворачивается и обратно и так все время.. Потом я наследую от него еще класса 4, и добавляю на сцену их, да,персонажи ходят,но это вешает производительность , все тормозит еле двигается, есть ли какая нибудь альтернатива ENTER_FRAM'у чтоб не так вешало..

Genzo 14.10.2011 12:29

1 - Enemy_per , не по принятым стандартам лучше EnemyPer
2 - используйте tweener для таких вещей , есть много реализаций (родную лучше не используйте) поищите информацию на тему TweenerLite ,например.

Vansimar 14.10.2011 12:32

это http://www.greensock.com/tweenlite/ ?

Inet_PC 14.10.2011 12:34

Да он.

Vansimar 14.10.2011 12:35

ну ладно посмотрю)спасибо

Добавлено через 8 минут
а вот допустим у меня главный игрок постоянно перемещается(управление с клавиатуры) а у нему идут противники, у твинера есть метод TweenMax.to(mc, 1, {x:65, y:117}); те он двигает к определенной точке,а персонаж то постоянно ходит,получается чтоб противник постоянно следовал за игроком нужно это опять же в ENTER_FRAME все делать?

Genzo 14.10.2011 12:48

вешайте на завершение анимации персонажа (передвижение) или на начало нового движение события которые будут направлять противников к игроку , вообще это сложная логика все зависит от конкретной реализации - способов много

stweet 14.10.2011 12:53

Цитата:

Сообщение от Genzo (Сообщение 1039098)
используйте tweener для таких вещей , есть много реализаций (родную лучше не используйте) поищите информацию на тему TweenerLite ,например.

Как правило, если бороться за производительность, то и greensock не поможет. Причина в том что на каждый твин он так же использует по своему таймеру.

выход из вашей ситуации:
не использовать на каждого перса по индивидуальному двигателю!
значит получается: Пишем у каждого перса (и во всей игре целиком - желательно) общие методы к примеру "moveObject();" а в основном классе игры регистрируем таймер и в цикле пробегаем по всем динамическим объектам. К примеру обходим в цикле объекты враги:
Код AS3:

private function allMoveObject (e:TimerEvent):void
{
    for (var i:int = 0; i < allEnemyNum; i ++)
    {
        if (allEnemy[i] != kill)
        {
            // всякие проверки на столкновение и т.п. манипуляции с объектом
            allEnemy[i].x ++;
        }
    }
}
 
// такой манёвр значительно ускорит приложение и снизит загрузку памяти.

Добавлено через 4 минуты
Цитата:

Сообщение от Vansimar (Сообщение 1039102)
а персонаж то постоянно ходит,получается чтоб противник постоянно следовал за игроком нужно это опять же в ENTER_FRAME все делать?

так же в приведённом выше примере можно проверять какая клавиша зажата для движения героем, проверять дистанцию от героя до врага и в случае попадания в область видимости, врагу сообщать новое движение по напровлению к герою, ох, столько всего замутить можно =)))

Vansimar 14.10.2011 13:03

те получается каждый шаг времени функция будет проверять какая кнопка зажата, каких игровых объектов двигать, какие сталкиваются,кто умер,и так далее?

stweet 14.10.2011 13:04

ессессеенноо)))

Genzo 14.10.2011 13:10

тогда уже лучше иметь 2 контроллера : персонажа и скопа врагов , а то получается что-то сродни :
Код:

while(true) readln

Vansimar 14.10.2011 13:12

У меня вот есть класс для каждого уровня, Level_1,Level_2...Level_n , и так же классы для персонажей и так далее.. получается в конструкторе например класса Level_1 нужно добавить объекты, и там же в конструкторе зарегистрировать таймер ,и в этом классе создать функцию private function allMoveObject (e:TimerEvent):void ?

stweet 14.10.2011 13:35

Код AS3:

public function moveAllObject (e:TimerEvent):void
{
        var killEnemy:Array = [];
 
        var i:int;
 
        for (i = 0; i < counterEnemy; i ++)
        {
                // типа проверили дистанцию между врагом и героем
                if (needDistancion < maxDistancion)
                {
                        // допустим герой убивает в ближнем бою врага
                        killEnemy.push(i);
                } else {
 
                        allEnemy[i].x += vx;
                        allEnemy[i].y += vy;
 
                        // далее можно проверить достиг ли враг
                        // припятствия и стоит ли ему сменить вектор движения
 
                        // ...
                }
        }
 
        // проверяем есть ли мёртвые враги?
        if (killEnemy.length > 0) {
 
                for (i = 0; i < killEnemy.length; i ++)
                {
                        // удаляем объекты из массива врагов.
                        removeChild(allEnemy[killEnemy[i]]);
                        allEnemy.splice(killEnemy[i], 1);
                }
        }
 
        // Двигаем героя.
        if (onLeftDown) hero.x --;
        if (onRightDown) hero.x ++;
 
        if (onTopDown) hero.y --;
        if (onBottomDown) hero.y ++;
 
        // Проверяем путь героя.
        if (hero.distancion < warDistancion)
        {
                // меняем направление гироя или запрещаем идти.
                // ...
        }
 
        // и так далее ...
 
        // дале ...
        detectPositionNext01();
 
        // можно даже продолжать выполнять статические методы из абстрактных классов.
        if (globalMethod != null) globalMethod.call();
 
        // Перерисовываем экран после всех манипуляций ...
        e.updateAfterEvent();
}

все выше приведенные переменные вымышленные, любое сходство в реальной жизни случайное совпадение! Удачи =)

Vansimar 14.10.2011 15:44

А не будет ли это все тормозить?и какой лучше шаг времени указать?

Inet_PC 14.10.2011 15:52

Цитата:

А не будет ли это все тормозить?
Вот заодно и проверьте. Тем более точно сказать трудно, ибо производительность зависит от многих факторов, и тормоза могут быть в другом участке кода.

2Sun 14.10.2011 17:54

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

stweet 14.10.2011 18:18

Цитата:

Сообщение от Vansimar (Сообщение 1039180)
А не будет ли это все тормозить?и какой лучше шаг времени указать?

1. проц Е5200, оперативы 3.5 г. смело держит до 300 объектов с просчётами на столкновение друг с другом с разрешением рендера 1024х768. Тут правильно подметили, всё зависит от оптимизации кода и формат используемой графики. Плюсом будит если объекты выходящие за рамки рендера станут не активными что тоже снизит потребляемость памяти, т.е. не надейтесь что объекты которых вы не видите на экране но добавленные на стейдж исключены из просчётов, желательно рисовать и просчитывать только то что попадает в видимую область.

2. Всегда выставляю делай на "0", но использую счётчики, это позволяет в случаях перегруза метода оттянут тот или иной просчёт на потом что бы не прерывать операцию таймера.

вывод, делая игры думать надо как "сишник" о памяти, т.е. взял-отдал. И если знать все тонкости машинного кода, то можно огогого как творить))) Помни, машине твоей легче умножить а не разделить!

Vansimar 14.10.2011 23:03

А можно когда добавляю их на сцену прежде делать cacheAsBitmap , это поможет?

2Sun 14.10.2011 23:28

Цитата:

Сообщение от Vansimar (Сообщение 1039270)
А можно когда добавляю их на сцену прежде делать cacheAsBitmap , это поможет?

Если изначально графика векторная и не будет вращения или маштабирования - то да. В противном случае станет еще хуже. Если у вас при 4 моделях начинает тормозить - это явно проблема в моделях. Расчетная часть, хоть там сто проверок будет стоять не нагрузит так. Копайте с сторону моделей.

Vansimar 14.10.2011 23:42

Вот помоему решение производительности анимации http://blog.touchmypixel.com/2008/04...ed-animations/ и еще спросить хотел cacheAsBitmap лучше использовать для фона например и вобще статических картинок?

Inet_PC 15.10.2011 00:06

Цитата:

Вот помоему решение производительности анимации
Я бы так не сказал, простая небольшая (по времени) анимация легко может сожрать 500 метров и больше оперативы, и вот тут тормоза то точно будут.

Vansimar 15.10.2011 00:25

AntKarlov в своем блоге писал что ему эти классы помогли сделать нормальную оптимизацию и избавиться от тормозов,и в самом примере видно что с этими классами фпс == 50; а без у меня примерно фпс ==7.

2Sun 15.10.2011 00:28

Цитата:

Вот помоему решение производительности анимации
Это путь в ниТуда. Лучше расскажите как у вас сделаны модели - как там организована анимация. (Кстати, уберите, если есть все коды из кадров управляющие лупами, перенесите это в контролер). Тогда будет понятно что вам посоветовать. Я использую конвертор, который клипы превращает в виртуальный тайловый битмап на инициализации, а потом плееру его очень легко через copyPixel() рендерить. Реально такая сцена на 200 персонажах размером 100х100пх с одновременной проверкой коллизий держит фпс 50.

Добавлено через 4 минуты
Схема в принципе похожа, только реализация по компактнее. :)

Vansimar 15.10.2011 00:35

Ну я код еще не писал,пока просто обдумываю все,а вот анимация так--

-Контейнер персонажа
-три кадра
-Хотьба
-Состояние покоя
-Умирание

Потом сам мувик так разбирается
- Контейнер для персонажа
- Контейнер для туловища головы и ног
-в нем мувики всех этих частей
- Контейнер для рук с оружием //чтоб можно было менять оружие
-оружие с руками

Добавлено через 30 секунд
а что за конвертер?

ChuwY 15.10.2011 00:36

Цитата:

Сообщение от Vansimar (Сообщение 1039277)
Вот помоему решение производительности анимации http://blog.touchmypixel.com/2008/04...ed-animations/

Вещь, определенно, хорошая, но подходит не для всех случаев. Недавно нужно было заоптимизировать довольно сложную анимацию векторного персонажа из кучи шейпов. В итоге растеризация анимации для ОДНОГО персонажа этим классом подвешивала приложение где-то на минуту. При этом кушалось дико большое количество оперативки.
Все решилось ручным конвертированием деталей анимации в битмапы, благо в 5.5 флеше есть функция "преобразовать в битмап". То есть все двигающиеся куски, которые не содержат анимации внутри себя преобразуем в битмапу. Если масштабирования не предвидится, то дает весьма приятный результат.

Vansimar 15.10.2011 00:39

а тот класс что я линк кидал не нужно использовать?

Добавлено через 1 минуту
Цитата:

Сообщение от ChuwY (Сообщение 1039294)
Вещь, определенно, хорошая, но подходит не для всех случаев. Недавно нужно было заоптимизировать довольно сложную анимацию векторного персонажа из кучи шейпов. В итоге растеризация анимации для ОДНОГО персонажа этим классом подвешивала приложение где-то на минуту. При этом кушалось дико большое количество оперативки.
Все решилось ручным конвертированием деталей анимации в битмапы, благо в 5.5 флеше есть функция "преобразовать в битмап". То есть все двигающиеся куски, которые не содержат анимации внутри себя преобразуем в битмапу. Если масштабирования не предвидится, то дает весьма приятный результат.

ну у меня анимация не сложная,так что я наверно этим классом воспользуюсь


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

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