2012-05-05 103 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

相關問題