2012-05-05 66 views
1

我在Actionscript 3(Flash CS5)中创建了一个程序,当您点击时产生一个鸡蛋(现在的圆圈)离开舞台,然后发送鸡蛋到你点击(编码)补间的地方。另外,它会缩放它以尝试渲染3D的幻觉。虽然坐标正确,但对象没有添加到正确的位置

我将一个TweenEvent.MOTION_FINISH添加到蛋的其中一个补间,以检查动作何时完成。当它发生时,我创建一个与原始鼠标点击具有相同坐标的新对象(称为Splat)。

问题1: Splat对象未被添加到正确的位置,如下图所示。我检查坐标,并且它们在Egg类和Splash类中都匹配。我也确保两个对象的注册点位于它们中间。最后,我检查了是否是造成问题的规模,但即使删除缩放补间,我也遇到同样的问题。

(编辑:。将鸡蛋放置在正确的位置为鼠标点击的原始坐标,因为它们应该是它只是似乎被移位的明星对象)

http://i45.tinypic.com/24bj1h3.png

问题2: Splat对象与鸡蛋对象的缩小量相同。为什么是这样?我没有(打算)使飞溅依赖于蛋。

这里是相关的代码:

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处理程序中分派的。有用!

虽然,我不得不通过在主类中使用公共静态变量来传回蛋着陆的原始坐标。像这样在主类:

public static var splatX:int; 
public static var splatY:int; 

而且这样的蛋类:

eggMain.splatX = mX; 
eggMain.splatY = mY; 

我可以住在一起,但我宁愿不使用全局变量。就此提出建议,但主要问题已得到解答。谢谢。

回答

1

您正在egg实例内创建splat,然后将其添加到egg的显示列表中。这意味着图示(星号)在蛋的坐标空间中创建,因此被蛋在舞台上的位置所抵消。这也意味着摔跤图片继承了你对蛋的任何变形,比如缩放,因为它是变形蛋实例的孩子。

一个更好的方法是在你的主要类中听取蛋的运动完成事件(查看事件冒泡)或从运动完成处理程序中触发的自定义事件。当收到该事件时,创建一个splat的实例并将其添加到主类的显示列表中。

+0

谢谢你,我会研究自定义事件并尝试你的方法。尽管如此,这是如何解释恒星为什么会流离失所的呢?哪些继承的坐标和变换应该取代恒星? – lcaaroe

+0

查看更新后的帖子。希望这次我更好地解释它。 –

+0

我创建了一个自定义的SplatEvent,让我的主类监听它。偶是在MOTION_FINISHED处理程序中分派的。有用! – lcaaroe

相关问题