Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передача параметра в функцию, вызываемую через Enter Frame (http://www.flasher.ru/forum/showthread.php?t=205371)

australian incognito 01.12.2013 04:46

Передача параметра в функцию, вызываемую через Enter Frame
 
Коллеги, изучив поиск по данному вопросу, не нашел однозначного решения.
Прошу извинить мои неизящные размышления, я выходец из AS2, переход не дается так просто...

Приведу простой пример. Есть некоторый класс Engine, в котором через функцию placeBullet создается экземпляр класса Bullet и добавляется на сцену. И далее, я хочу через Enter Frame двигать этот экземпляр. Важно, что экземпляров одновременно может быть несколько.
Код AS3:

private function placeBullet (mc:Object)
{
        var bullet:Bullet = new Bullet();
        addChild(bullet);
        bullet.x = mc.x;
        bullet.y = mc.y;
        //
        bullet.addEventListener(Event.ENTER_FRAME, moveBullet);
}

Далее я создаю функцию moveBullet:
Код AS3:

private function moveBullet(event:Event)
{
 
}

... и понимаю, что не могу обратиться напрямую к экземпляру bullet, т.к. он создан внутри функции placeBullet и не виден снаружи. Если же его выносить наружу, то невозможно создать несколько одновременных экземпляров - предыдущий будет удаляться.
Т.е. мне бы хотелось иметь возможность сделать что-то похожее на это:
Код AS3:

bullet.addEventListener(Event.ENTER_FRAME, moveBullet(bullet));

И это только пол-беды. Двигать пулю мне бы хотелось в направлении, равном
Код AS3:

mc.rotation

Соответственно, хотелось бы иметь следующую картину:
Код AS3:

private function placeBullet (mc:Object)
{
        var bullet:Bullet = new Bullet();
        addChild(bullet);
        bullet.x = mc.x;
        bullet.y = mc.y;
        //
        bullet.addEventListener(Event.ENTER_FRAME, moveBullet(bullet, mc.rotation));
}
//
private function moveBullet(event:Event, mc:Object, angle:Number)
{
        mc.x += speed*Math.cos(angle);
        mc.y += speed*Math.sin(angle);
}

Понятно, что моего решения не существует... Интересует выход из данной ситуации, что посоветуете?

Wolsh 01.12.2013 05:42

Массив буллетов.

Isfet 01.12.2013 11:14

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

Nucer 01.12.2013 12:51

Меняйте своё мышление!!))
Создаёте класс, который будет отвечать за все ваши пули, типа BulletManager, в нём делаете массив (а лучше вектор) ваших объектов - все новосозданные объекты добавляйте туда.
Далее... Не вижу, что вам мешает нормально сделать класс Bullet? Прописать всю необходимую логику внутри самого класса Bullet (в т.ч. все листенеры), а не в анонимной функции? При необходимости, можете конструктору класса Bullet передавать ссылку на объект, его создавший (или же на тот мувиклип, где нужно двигать сам буллет).
Надеюсь стало яснее))

australian incognito 01.12.2013 16:59

Спасибо! Массив - это действительно хорошая идея, буду пробовать.
На счет:
Цитата:

Сообщение от Nucer (Сообщение 1153965)
Меняйте своё мышление!!))

... я бы с радостью. Посоветуйте толковое чтиво в контексте грамотного подхода к ООП. Ибо на сегодняшний день я создаю классы без всякой системы, скорее, чтобы попробовать, что это такое и научиться с ними немного работать.

Wolsh 01.12.2013 17:44

Как-то не попадалось толковых книг именно по абстрагированию, то есть вычленению объектов (классов) в хаосе проектного задания; обычно размышления об этом раскиданы то там то сям, хотя это конечно самая основа ООП, правильно вычленить классы и разделить между ними ответственности. Кое что есть у Роберта Мартина в "Чистом коде", или у Мартина Фаулера в "Рефакторинге", но применительно к AS3 было бы полезно почитать книгу о шаблонах.
Это как раз первая в мире книга по AS3, призванная сразу направить в нужное русло "выходцев из AS2", поэтому ООП там уделено практически все внимание, не столько его "чистоте" как у Мартинов, сколько начальному ООП-мышлению.

australian incognito 01.12.2013 18:32

Цитата:

Сообщение от Wolsh (Сообщение 1153972)
Как-то не попадалось толковых книг именно по абстрагированию, то есть вычленению объектов (классов) в хаосе проектного задания; обычно размышления об этом раскиданы то там то сям, хотя это конечно самая основа ООП, правильно вычленить классы и разделить между ними ответственности. Кое что есть у Роберта Мартина в "Чистом коде", или у Мартина Фаулера в "Рефакторинге", но применительно к AS3 было бы полезно почитать книгу о шаблонах.
Это как раз первая в мире книга по AS3, призванная сразу направить в нужное русло "выходцев из AS2", поэтому ООП там уделено практически все внимание, не столько его "чистоте" как у Мартинов, сколько начальному ООП-мышлению.

Большое спасибо!

alatar 01.12.2013 18:57

Цитата:

Сообщение от australian incognito (Сообщение 1153970)
Посоветуйте толковое чтиво в контексте грамотного подхода к ООП. Ибо на сегодняшний день я создаю классы без всякой системы, скорее, чтобы попробовать, что это такое и научиться с ними немного работать.

Вот по вашей теме.

RandomUser 01.12.2013 19:29

Цитата:

Далее я создаю функцию moveBullet:
Код AS3:

private function moveBullet(event:Event)
{
 
}

... и понимаю, что не могу обратиться напрямую к экземпляру bullet, т.к. он создан внутри функции placeBullet и не виден снаружи.
Код AS3:

private function moveBullet(event:Event)
{
        var bullet: Bullet = event.currentTarget as Bullet; // это ваш Bullet, делайте с ним что хотите
}

Но массив пуль, конечно, правильней.

australian incognito 01.12.2013 22:38

Цитата:

Сообщение от alatar (Сообщение 1153977)

Отлично, буду тоже изучать. Спасибо за ссылку.

Добавлено через 43 секунды
Цитата:

Сообщение от RandomUser (Сообщение 1153982)
Код AS3:

private function moveBullet(event:Event)
{
        var bullet: Bullet = event.currentTarget as Bullet; // это ваш Bullet, делайте с ним что хотите
}

Но массив пуль, конечно, правильней.

\
Это тоже полезное замечание, чувствовал одним местом, что можно так, но не знал, как именно. Спасибо.


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

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