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;
}