2012-05-05 7 views
1

클릭하여 스테이지를 벗어난 에그 (현재는 원)를 생성하는 Actionscript 3 (Flash CS5) 프로그램을 생성 한 다음 에그를 보냅니다 (코드화 된) 트윈을 클릭 한 위치까지 또한 3D의 환상을주기 위해 크기를 조정합니다.올바른 좌표에도 불구하고 객체가 올바른 위치에 추가되지 않았습니다.

에그의 트윈 중 하나에 TweenEvent.MOTION_FINISH를 추가하여 모션이 완료되었는지 확인합니다. 그럴 때 원래의 마우스 클릭과 동일한 좌표로 새 오브젝트 (Splat)를 만듭니다.

문제 1 : 아래 그림과 같이 Splat 개체가 올바른 위치에 추가되지 않았습니다. 좌표를 확인하면 Egg 클래스와 Splash 클래스에서 일치합니다. 또한 두 개체의 등록 지점이 중간에 있는지 확인했습니다. 마지막으로 문제를 만든 척도인지 확인했지만 척도 트윈을 제거해도 같은 문제가 발생합니다.

(편집 :... 에그가 정확한 지점에 위치 그들이해야대로 마우스 클릭에 대한 원래의 좌표는 그것은 난민 것 같다 만 스타 객체이다)는

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

문제 2 : Splat 개체는 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을 만들어 내 주요 클래스가 수신했다. even도 MOTION_FINISHED 핸들러에서 전달됩니다. 그것은 작동합니다!

에그 랜딩의 원래 좌표를 다시 전달하기 위해 메인 클래스의 public static vars를 사용하여 작업해야했습니다. 마찬가지로 메인 클래스에서 너무 :

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

그리고 계란 클래스에서이 같은

:

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

내가 살 수 있지만 글로벌 변수를 사용하지 않으려는 것입니다. 주된 질문에 답을 얻었지만 이에 대한 제안을했습니다. 감사.

답변

1

egg 인스턴스 내에 표시를 만든 다음이를 egg의 표시 목록에 추가합니다. 즉, 표시 (별표)는 계란의 좌표 공간에서 만들어 지므로 스테이지의 계란 위치에 의해 상쇄됩니다. 또한 스 플랫은 변형 된 계란 인스턴스의 자식이므로 축척과 같이 계란에 대한 모든 변형을 상속 받음을 의미합니다.

더 나은 접근 방법은 주 클래스에서 달걀 모션 완료 이벤트 (이벤트 버블 링) 또는 모션 완료 핸들러에서 실행 된 사용자 지정 이벤트를 수신하는 것입니다. 해당 이벤트가 수신되면 splat의 인스턴스를 만들어 주 클래스의 표시 목록에 추가합니다.

+0

고맙습니다. 맞춤 이벤트를 살펴보고 방법을 시도해 보겠습니다. 그렇다고해서 별이 어떻게 옮겨 졌는지를 어떻게 설명 할 수 있습니까? 어떤 계승 된 좌표와 변형이 별을 대체해야합니까? – lcaaroe

+0

업데이트 된 게시물보기. 잘하면이 시간을 더 잘 설명해 주었으면합니다. –

+0

커스텀 SplatEvent를 생성하고 메인 클래스가 그것을 듣도록했습니다.even도 MOTION_FINISHED 핸들러에서 전달됩니다. 그것은 작동합니다! – lcaaroe