所以,我正试图让一些影片剪辑跟随它的前身并让最后一个跟随鼠标。问题是我是从代码而不是使用界面创建它们,因为我不是专家,所以我无法让它们工作。
我在库中的所有内容都是一个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)总是挂在光标的左边。
感谢您提供任何可能的帮助。
答案 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;
}