我在电影符号中有一个精灵,我想在360范围内来回盘旋。我希望能让它变得流畅随意。从来没有真正冒险从原来的xy cordinates。
我试图用if语句和起始动量创建一些规定。像这样:
var num = 2;
stage.addEventListener(Event.ENTER_FRAME, hover);
function hover(evt:Event):void{
//start it moving
cloudWhite.y += num;
cloudWhite.x += num;
//declare these variables
var cX = cloudWhite.x;
var cY = cloudWhite.y;
// object travels 10 pixels
var cXP = cX + 10;
var cXN = cX - 10;
var cYP = cY + 10;
var cYN = cY - 10;
// if object goes 10 pixels reverse direction of momentum (maybe)
if (cX >= cXP) {
num = -2;
}
if (cX <= cXN){
num = 2;
}
if (cY >= cYP) {
num = 2;
}
if (cY <= cYN){
num = 2;
}
显然这是超级错误的,因为当它运行时,对象只是转到0,0或者只有数学神知道的某个地方。
我显然是这种数学的菜鸟,所以我道歉但我很高兴能够了解这背后的三角。
感谢您的帮助,感谢您的阅读。
答案 0 :(得分:2)
您正在将所有变量设置在ENTER_FRAME循环中,因此您的所有条件都不会评估为true。在每一帧上你都这样做:
cloudWhite.x += 2;
cX = cloudWhite.x;
cXP = cX + 10; // Must == cloudWhite's previous x + 10 + 2;
cXN = cX - 10; // Must == cloudWite's previous x -10 + 2;
if(cX > cXP)... // Can never be true.
if(cX < cXN)... // Can never be true.
您需要做的是:
1)将cloudWhite的原始位置存储在循环外的某个位置,并在循环开始之前存储它。
2)在循环开始之前,再次定义相对于cloudWhite原始位置的边界。还要定义每次迭代时要更改位置的金额。
3)开始循环。
4)在每次迭代时增加cloudWhite的当前位置。如果您希望形状随机移动,请在此处添加一点随机。
5)检查cW的新位置是否超出界限,如果是,则调整方向。
以下示例粗糙而生涩,但我并不确切知道您正在寻找的效果。如果您想要在每个方向上更平滑,更长时间的移动,请考虑使用Tween类或Tween库(如流行的Greensock),而不是手动递增/递减位置。这里有一个有用的讨论:http://www.actionscript.org/forums/archive/index.php3/t-163836.html
import flash.display.MovieClip;
import flash.events.Event;
// Set up your variables
var original_x:Number = 100; // Original x
var original_y:Number = 100; // Original y
var x_inc:Number = 5; // X Movement
var y_inc:Number = 5; // Y Movenent
var bounds:Number = 50; // Distance from origin allowed
// Doesn't take into account width of object so is distance to nearest point.
// Create an MC to show the bounds:
var display:MovieClip = addChild(new MovieClip()) as MovieClip;
display.graphics.lineStyle(1, 0x0000FF);
display.graphics.beginFill(0x0000FF, 0.5);
display.graphics.drawRect(0-bounds, 0-bounds, bounds * 2, bounds *2);
display.x = original_x;
display.y = original_y;
addChild(display);
// Create our moving mc:
var mc:MovieClip = addChild(new MovieClip()) as MovieClip;
mc.graphics.beginFill(0xFF0000, 1);
mc.graphics.drawCircle(-10, -10, 20);
// Position it:
mc.x = original_x;
mc.y = original_y;
addChild(mc);
// Loop:
function iterate($e:Event = null):void
{
// Move the mc by a random amount related to x/y inc
mc.x += (Math.random() * (2 * x_inc))/2;
mc.y += (Math.random() * (2 * y_inc))/2;
// If the distance from the origin is greater than bounds:
if((Math.abs(mc.x - original_x)) > bounds)
{
// Reverse the direction of travel:
x_inc == 5 ? x_inc = -5 : x_inc = 5;
}
// Ditto on the y axis:
if((Math.abs(mc.y - original_y)) > bounds)
{
y_inc == 5 ? y_inc = -5 : y_inc = 5;
}
}
// Start the loop:
addEventListener(Event.ENTER_FRAME, iterate);
这应该让你开始。我确定有很多其他方法可以使用正式的trig,但这样做的好处是非常简单,只是现有方法的扩展。