Как получить цикл для загрузки мувиклипов с помощью EventListeners - PullRequest
0 голосов
/ 17 февраля 2019

Я хотел, чтобы сцена загружала 5 разных видеоклипов (названных B1-B5).Каждый мувиклип помещается в определенные x и y.Каждый фрагмент ролика увеличивается / уменьшается при переворачивании / развертывании ....

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

Это код, который работает, но мне придется дублировать его для каждого фрагмента ролика (изменяя очевидные биты) ...

var scene1:MovieClip = new B1();
    addChild(scene1);
    scene1.x = 170.30;
    scene1.y = 231.15;
    scene1.addEventListener(MouseEvent.MOUSE_OVER, onRollOverEvent1);
    scene1.addEventListener(MouseEvent.MOUSE_OUT, onRollOutEvent1);

function onRollOverEvent1(e:MouseEvent) {
    scene1.width=25.9;
    scene1.height=25;
 }

function onRollOutEvent1(e:MouseEvent) {
    scene1.width = 20.9;
    scene1.height = 20;
 }

Ниже приведено то, что я опробовал, нозастряли на некоторое время ...

for (var i:int=1; i<5; i++){
    var scene[i]:MovieClip = new "B"+i();
    addChild("scene"+i);
    //var scene[i]:MovieClip = new B[i]();
    scene[i].addEventListener(MouseEvent.MOUSE_OVER, onRollOverEvent);
    scene[i].addEventListener(MouseEvent.MOUSE_OUT, onRollOutEvent)

    function onRollOverEvent(e:MouseEvent) {
    scene[i].width=25.9;
    scene[i].height=25;
 }
    function onRollOutEvent(e:MouseEvent) {
    scene[i].width = 20.9;
    scene[i].height = 20;
 }
}

scene1.x = 170.30;
scene1.y = 231.15;
scene2.x = 284.30;
scene2.y = 250.75;
scene3.x = 377.30;
scene3.y = 280.15;  
scene4.x = 444.30;
scene4.y = 321.15;
scene5.x = 196.30;
scene5.y = 172.15;

1 Ответ

0 голосов
/ 17 февраля 2019

Во-первых, давайте рассмотрим ваши ошибки.

new "B"+i();

В лучшем случае , что означает вызов номера i как функции и добавление результата к«B» как String .Но даже new "B1" () - это не то же самое, что new B1 () .На самом деле существует метод getDefinitionByName (..) , который позволяет обращаться к классу через его имя, но я не рекомендую использовать его, потому что это сложная тема.

var scene[i]:MovieClip

Вы просто не можете определить переменные scene1 , scene2 и т. Д. Таким образом.Самая близкая вещь, которую вы действительно можете придумать, - это квадратная скобка: this ["scene" + i] = ... .

addChild("scene"+i);

Аргумент должен быть DisplayObject экземпляр, а не String .

for (...)
{
    ...
    function onRollOverEvent(e:MouseEvent)
    ...
}

Не определять функции внутри других функций или циклов.

scene[i].width = 20.9;
scene[i].height = 20;

К концу цикла i будет равно 5 , так что, как вы думаете, к чему относится такая запись?

Тогда решение.

Когда вы придетечтобы масштабировать ваше рабочее решение на несколько экземпляров, вы должны идти алгоритмически.Циклы и Массив s ваши друзья.

// Lets devise a list of classes and (x,y) coordinates.
var Designs:Array = [
    null, // the 0-th element
    {id:B1, x:170, y:230},
    {id:B2, x:285, y:250},
];

for (var i:int = 1; i < Design.length; i++)
{
    // Retrieve a record for the future object.
    var aDesign:Object = Designs[i];

    // Get a reference to the object's class.
    var aClass:Class = aDesign.id;

    // Create the object. Yes, you CAN omit () with
    // the "new" operator if there are no mandatory arguments.
    var aThing:Movieclip = new aClass;

    // Set coordinates from the design record.
    aThing.x = aDesign.x;
    aThing.y = aDesign.y;

    // Add to the display list.
    addChild(aThing);

    // Subscribe the event handlers.
    aThing.addEventListener(MouseEvent.MOUSE_OVER, onOver);
    aThing.addEventListener(MouseEvent.MOUSE_OUT, onOut);

    // Save the object's reference for the later use.
    // If you'd need to address, say, 3rd object,
    // you do it as following:
    // Designs[3].instance
    aDesign.instance = aThing;
}

function onOver(e:MouseEvent):void
{
    // You subscribed all of the objects to this one event handler.
    // This is the correct way to learn, which one of the objects
    // is under the mouse and is dispatching the said event.
    var aThing:MovieClip = e.currentTarget as MovieClip;

    // Change the object's size.
    aThing.width = 26;
    aThing.height = 25;
}

function onOut(e:MouseEvent):void
{
    // Get the source of the dispatched event.
    var aThing:MovieClip = e.currentTarget as MovieClip;

    // Change the object's size.
    aThing.width = 21;
    aThing.height = 20;
}
...