在多个点之间平滑地移动和缩放 MovieClip
Move and Scale a MovieClip smoothly between multiple points
我设置了 3 行水平行,每行都有一个对齐的按钮和一个我想在这些行之间移动的角色(每行居中)(想想 Little Big Planet)。我能够对其进行编程,使角色在 3 行之间移动并在移动时具有设定的比例,但我想看到角色实际上在各点之间移动;不只是看着它传送到该位置。我已经尝试了所有我能想到的方法:循环、布尔值 on/off、一些 velocity/distance/difference 恶作剧等,但我没有成功让它在单击按钮时移动并继续移动直到它达到目的。我也不确定是否可以将它设置为逐步缩放,直到达到所需的最终比例大小。我在一个网站上看到了一个稍微类似的问题,但是他们给出的解决方案使用了 Point class 和大量的数学,而且我从来没有成功地让我的 Flash 使用 Points。如有任何建议,我们将不胜感激。
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
public class Main_Test_5 extends MovieClip
{
private var cam:MovieClip = new MovieClip();
private var player:Player = new Player();
private var topPosition:uint = 170;
private var centerPosition:uint = 270;
private var bottomPosition:uint = 370;
private var UI:UserInterface = new UserInterface();
private var testBackground:TestBackground = new TestBackground();
public function Main_Test_5():void
{
player.x = 100;
player.y = 370;
cam.addChild(player);
addChild (UI);
// add event listeners
stage.addEventListener(Event.ENTER_FRAME, checkEveryFrame);
UI.topButton.addEventListener(MouseEvent.CLICK, topButtonClick);
UI.centerButton.addEventListener(MouseEvent.CLICK, centerButtonClick);
UI.bottomButton.addEventListener(MouseEvent.CLICK, bottomButtonClick);
addChild (cam);
}
public function checkEveryFrame(event:Event):void
{
cam.x -= player.x - player.x;
cam.y -= player.y - player.y;
}
public function topButtonClick (event:MouseEvent):void
{
trace ("Top Click");
if (player.y > topPosition) // 170, player.y starts at 370
{
player.y -= 100;
}
else if (player.y <= topPosition)
{
player.y = topPosition;
}
if (player.y == topPosition)
{
player.scaleY = 0.8;
player.scaleX = 0.8;
}
else if (player.y != topPosition)
{
player.scaleY = 0.9;
player.scaleX = 0.9;
}
}
public function centerButtonClick (event:MouseEvent):void
{
trace ("Center Click");
if (player.y > centerPosition) // 270
{
player.y -= 100;
}
if (player.y < centerPosition)
{
player.y += 100;
}
if (player.y == centerPosition)
{
player.scaleY = 0.9;
player.scaleX = 0.9;
}
}
public function bottomButtonClick (event:MouseEvent):void
{
trace ("Bottom Click");
if (player.y < bottomPosition) // 370
{
player.y += 100;
}
if (player.y >= bottomPosition)
{
player.y = bottomPosition;
}
if (player.y == bottomPosition)
{
player.scaleY = 1;
player.scaleX = 1;
}
else if (player.y != bottomPosition)
{
player.scaleY = 0.9;
player.scaleX = 0.9;
}
}
}
}
听起来你喜欢简单的东西。所以我建议使用 Tweening 库。其中最多产的是Greensocks TweenLite, which is now part of their Animation Platform
使用 tweenlite,您只需执行以下操作:
代替:
player.y += 100;
你会做:
TweenLite.to(player, 1,{y: player.y + 100, ease: Quad.EaseInOut});
这会将您的玩家对象从当前位置补间(随着时间逐渐移动)到指定的 y (player.y + 100)。它会在 1 秒内完成,并且进出起来很轻松。
您可以向补间 (scaleX/Y, x) 添加更多属性。
请注意,有许多 Tweening 平台替代品,包括内置于 Flash Professional 中的一个。如果您向最终用户收取应用程序费用,TweenLite 就不能免费使用。如果您将其用于商业用途,请务必查看他们的许可证。
我设置了 3 行水平行,每行都有一个对齐的按钮和一个我想在这些行之间移动的角色(每行居中)(想想 Little Big Planet)。我能够对其进行编程,使角色在 3 行之间移动并在移动时具有设定的比例,但我想看到角色实际上在各点之间移动;不只是看着它传送到该位置。我已经尝试了所有我能想到的方法:循环、布尔值 on/off、一些 velocity/distance/difference 恶作剧等,但我没有成功让它在单击按钮时移动并继续移动直到它达到目的。我也不确定是否可以将它设置为逐步缩放,直到达到所需的最终比例大小。我在一个网站上看到了一个稍微类似的问题,但是他们给出的解决方案使用了 Point class 和大量的数学,而且我从来没有成功地让我的 Flash 使用 Points。如有任何建议,我们将不胜感激。
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
public class Main_Test_5 extends MovieClip
{
private var cam:MovieClip = new MovieClip();
private var player:Player = new Player();
private var topPosition:uint = 170;
private var centerPosition:uint = 270;
private var bottomPosition:uint = 370;
private var UI:UserInterface = new UserInterface();
private var testBackground:TestBackground = new TestBackground();
public function Main_Test_5():void
{
player.x = 100;
player.y = 370;
cam.addChild(player);
addChild (UI);
// add event listeners
stage.addEventListener(Event.ENTER_FRAME, checkEveryFrame);
UI.topButton.addEventListener(MouseEvent.CLICK, topButtonClick);
UI.centerButton.addEventListener(MouseEvent.CLICK, centerButtonClick);
UI.bottomButton.addEventListener(MouseEvent.CLICK, bottomButtonClick);
addChild (cam);
}
public function checkEveryFrame(event:Event):void
{
cam.x -= player.x - player.x;
cam.y -= player.y - player.y;
}
public function topButtonClick (event:MouseEvent):void
{
trace ("Top Click");
if (player.y > topPosition) // 170, player.y starts at 370
{
player.y -= 100;
}
else if (player.y <= topPosition)
{
player.y = topPosition;
}
if (player.y == topPosition)
{
player.scaleY = 0.8;
player.scaleX = 0.8;
}
else if (player.y != topPosition)
{
player.scaleY = 0.9;
player.scaleX = 0.9;
}
}
public function centerButtonClick (event:MouseEvent):void
{
trace ("Center Click");
if (player.y > centerPosition) // 270
{
player.y -= 100;
}
if (player.y < centerPosition)
{
player.y += 100;
}
if (player.y == centerPosition)
{
player.scaleY = 0.9;
player.scaleX = 0.9;
}
}
public function bottomButtonClick (event:MouseEvent):void
{
trace ("Bottom Click");
if (player.y < bottomPosition) // 370
{
player.y += 100;
}
if (player.y >= bottomPosition)
{
player.y = bottomPosition;
}
if (player.y == bottomPosition)
{
player.scaleY = 1;
player.scaleX = 1;
}
else if (player.y != bottomPosition)
{
player.scaleY = 0.9;
player.scaleX = 0.9;
}
}
}
}
听起来你喜欢简单的东西。所以我建议使用 Tweening 库。其中最多产的是Greensocks TweenLite, which is now part of their Animation Platform
使用 tweenlite,您只需执行以下操作:
代替:
player.y += 100;
你会做:
TweenLite.to(player, 1,{y: player.y + 100, ease: Quad.EaseInOut});
这会将您的玩家对象从当前位置补间(随着时间逐渐移动)到指定的 y (player.y + 100)。它会在 1 秒内完成,并且进出起来很轻松。
您可以向补间 (scaleX/Y, x) 添加更多属性。
请注意,有许多 Tweening 平台替代品,包括内置于 Flash Professional 中的一个。如果您向最终用户收取应用程序费用,TweenLite 就不能免费使用。如果您将其用于商业用途,请务必查看他们的许可证。