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.

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

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


person user2592177    schedule 09.11.2013    source источник


Ответы (2)


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

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

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

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

person Xiler    schedule 09.11.2013
comment
Замечательно. Я всегда ищу способы расширить свои знания и улучшить свои навыки программирования. Спасибо за ответ, будем пробовать :) - person user2592177; 09.11.2013

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

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;
}
person juworld    schedule 09.11.2013
comment
После публикации здесь я понял, что вы сказали, и заставил это работать, используя currentTarget. Проблема в том, что они следуют за курсором в группе, а не на расстоянии X. - person user2592177; 09.11.2013