AS3 создает следы видеоклипов, следующих друг за другом

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

Все, что у меня есть в библиотеке, это MovieClip(linkage:"LETRA"), который содержит textField внутри (имя экземпляра:"myTextField").

Вот что у меня есть:

import flashx.textLayout.operations.MoveChildrenOperation;
import flash.display.MovieClip;
import flash.events.Event;

//this are the letters that will be following the mouse
var phrase:Array = ["H","a","c","e","r"," ","u","n"," ","p","u","e","n","t","e"];

//variable to spread them instead of creating them one of top of each other
var posXLetter:Number = 0;

//looping through my array
for (var i:Number = 0; i < phrase.length; i++)
{
    //create an instance of the LETRA movieclip which contains a text field inside
    var newLetter:MovieClip = new LETRA();

    //assing a letter to that text field matching the position of the phrase array
    newLetter.myTextField.text = phrase[i];

    //assign X position to the letter I'm going to add
    newLetter.x = posXLetter;

    //add properties for storing the letter position
    var distx:Number = 0;
    var disty:Number = 0;

    //add the listener and the function which will move each letter
    newLetter.addEventListener(Event.ENTER_FRAME, moveLetter);

    function moveLetter(e:Event){

        distx = newLetter.x - mouseX;
        disty = newLetter.y - mouseY;

        newLetter.x -= distx / 10;
        newLetter.y -= disty / 10;
    }

    //add each letter to the stage
    stage.addChild(newLetter);

    //increment the next letter's x position
    posXLetter +=  9;
}

С этим кодом за мышью следует только одна буква ("E"), а остальные остаются там, где я их добавил, используя addChild и переменную posXLetter.

Кроме того, я пытаюсь заставить его вести себя как след, поэтому, если я подойду вверх, буквы будут отставать от меня; если я перейду влево, буквы будут отставать справа от меня, но я думаю, что при моем текущем подходе они либо A) переместятся все вместе в одно и то же место, либо B) всегда будут висеть слева от курсора.

Спасибо за любую возможную помощь.

2 ответа

Решение

Это своего рода движение, называемое обратной кинематикой, и это довольно популярный способ делать тряпичные куклы в играх. Он использует шаблон проектирования, называемый составным шаблоном, в котором один объект добавляет другой объект как дочерний элемент своей функции, а затем при вызове функции update() вызывает все свои (обычно одну) дочерние функции update(). Самый распространенный пример этого - змея. Голова змеи следует за вашей мышью, а остальные части тела змеи двигаются вместе со змеей, и это выглядит очень реалистично. Этот точный пример объясняется и строится здесь, хотя он вообще не включает в себя совместные ограничения.

Этот пример находится в середине книги, и поэтому может быть трудно начать читать, но если вы немного знакомы с шаблонами проектирования и / или имеете некоторый промежуточный опыт программирования, то я уверен, что вы можете это понять. Я советую вам, после прочтения и понимания примера, поцарапать то, что вы имеете сейчас, потому что это не очень элегантное кодирование. Вам может показаться, что в этом примере используется слишком много классов, но, поверьте мне, оно того стоит, поскольку позволяет очень легко редактировать код, если вы решите изменить его в будущем без каких-либо недостатков.

Кроме того, я знаю, что эта змея не то, что вы хотите, но если вы понимаете концепцию, то вы можете применить ее к вашим собственным конкретным потребностям.

Надеюсь, это поможет.

Я думаю, что это вопрос объема. Возможно, вам придется изменить ваш обработчик

function moveLetter(e:Event){
    trace(e.target); //check if this is the right movie clip
    distx = e.target.x - mouseX;
    disty = e.target.y - mouseY;

    e.target.x -= distx / 10;
    e.target.y -= disty / 10;
}
Другие вопросы по тегам