AS3创建了一个跟随彼此的动画片段的踪迹

时间:2013-11-09 00:46:53

标签: actionscript-3 flash actionscript trail

所以,我正试图让一些影片剪辑跟随它的前身并让最后一个跟随鼠标。问题是我是从代码而不是使用界面创建它们,因为我不是专家,所以我无法让它们工作。

我在库中的所有内容都是一个MovieClip(链接:“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 个答案:

答案 0 :(得分:0)

这是一种名为Inverse Kinematics的动作,在游戏中制作布娃娃是一种非常流行的方式。它使用一个名为Composite Pattern的设计模式,其中一个对象添加另一个对象作为其子对象,然后当它调用update()函数时,它调用它的所有(通常是一个)子进程的update()函数。最常见的例子是蛇。蛇的头跟着你的老鼠,蛇的身体其余部分随着蛇一起移动,看起来非常逼真。这个确切的例子被解释并构建here,尽管它根本不包括联合限制。

这个例子是在一本书的中间,所以可能很难开始阅读,但如果你有点熟悉设计模式和/或有一些编程的中间经验,那么我相信你可以理解它。我建议你在阅读并理解这个例子之后,抓住你现在拥有的东西,因为它不是很优雅的编码。您可能会觉得这个示例使用了太多的类,但相信我,它值得,因为它允许您非常轻松编辑您的代码,如果您决定在将来更改它,没有任何缺点。

另外,我知道这条蛇不是你想要的,但是如果你理解概念那么你就可以将它应用到你自己的特定需求中。

我希望这会有所帮助。

答案 1 :(得分:0)

我认为这是一个范围问题。您可能需要修改处理程序

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