我在Actionscript 3(Flash CS5)中创建了一个程序,当你点击它时会在舞台上产生一个Egg(现在是一个圆圈),然后将Egg发送到你用(编码的)补间点击的地方。此外,它会扩展它以试图产生3D幻觉。
我将TweenEvent.MOTION_FINISH添加到Egg的其中一个补间中,以检查运动何时结束。如果是这样,我创建一个新对象(称为Splat),其坐标与原始鼠标点击相同。
问题1: Splat对象未添加到正确的位置,如下图所示。我检查坐标,它们在Egg类和Splash类中都匹配。我还确保两个对象的注册点都在它们的中间。最后,我检查了是否是导致问题的比例,但即使我删除了缩放比例,我也会遇到同样的问题。
(编辑:鸡蛋被放置在正确的位置。鼠标点击的原始坐标是应该的。只有星形物体似乎被移位。)
http://i45.tinypic.com/24bj1h3.png
问题2: Splat对象的缩小比例与Egg对象相同。为什么是这样?我没有(打算)使Splash依赖于Egg。
以下是相关代码:
package
{
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.MouseEvent;
public class eggMain extends MovieClip
{
import flash.events.Event;
public function eggMain()
{
stage.addEventListener(MouseEvent.CLICK, spawn);
}
function spawn(event)
{
for(var i:int = 0; i<1; i++)
{
trace("mX in main class = " + mouseX);
trace("mY in main class = " + mouseY);
var e:Egg = new Egg(mouseX, mouseY);
addChild(e);
}
}
}
}
package
{
import flash.display.MovieClip;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
public class Egg extends MovieClip
{
var stageWidth:int = 550;
var stageHeight:int = 400;
var buffer:int = 100;
var mX = 0;
var mY = 0;
public function Egg(moX:int, moY:int) //mouseX, mouseY
{
mX = moX;
mY = moY;
trace("mX in Egg constructor: " + mX);
trace("mY in Egg constructor: " + mY);
spawnAtFixedPoint();
animate();
}
function spawnAtFixedPoint()
{
this.x = stageWidth + buffer;
this.y = stageHeight - buffer;
}
//Moves the egg in from the spawn point using tweens. Scales down on the way to give 3D illusion.
function animate()
{
var xMovement:Tween;
var yMovement:Tween;
var xScale:Tween;
var yScale:Tween;
trace("mX in animate() = " + mX);
trace("mY in animate() = " + mY);
xMovement = new Tween(this, "x", Regular.easeOut, this.x, mX, 1, true); //obj, property, ease function, start, time, in seconds (true)
yMovement = new Tween(this, "y", Regular.easeOut, this.y, mY, 1, true);
xScale = new Tween(this, "scaleX", Regular.easeIn, 1, 0.1, 1, true);
yScale = new Tween(this, "scaleY", Regular.easeIn, 1, 0.1, 1, true);
//Checks when the object has finished animating (which mean the egg has landed)
xMovement.addEventListener(TweenEvent.MOTION_FINISH, splat);
}
//Spawns a splat (currently a star) at the same coordinates as the egg
function splat(event)
{
trace("mX in splat() = " + mX);
trace("mY in splat() = " + mY);
var s = new Splat(mX, mY);
addChild(s);
}
}
}
更新: 我创建了一个自定义的SplatEvent,让我的主要课程听取它。偶数在MOTION_FINISHED处理程序中调度。它有效!
虽然,我必须通过在主类中使用公共静态变量来传递Egg归档的原始坐标。就像在主要课程中一样:
public static var splatX:int;
public static var splatY:int;
在Egg课程中就像这样:
eggMain.splatX = mX;
eggMain.splatY = mY;
我可以忍受它,但我不想使用全局变量。对此提出建议,尽管主要问题已得到解答。感谢。
答案 0 :(得分:1)
您正在egg实例中创建splat,然后将其添加到egg的显示列表中。这意味着splat(星形)在蛋的坐标空间中创建,因此被蛋在舞台上的位置所抵消。它还意味着splat继承了你对蛋所做的任何转换,比如规模,因为它是转化蛋实例的一个孩子。
更好的方法是在你的主课堂上听你的蛋的动作完成事件(看看事件冒泡)或者从动作完成处理程序发出的自定义事件。收到该事件后,创建一个splat实例并将其添加到主类的显示列表中。