Объект не добавляется в нужное место, несмотря на правильные координаты

Я создал программу в Actionscript 3 (Flash CS5), которая порождает яйцо (пока круг) за пределами сцены при нажатии, а затем отправляет яйцо туда, где вы щелкнули, с (закодированной) анимацией. Кроме того, он масштабирует его, пытаясь создать иллюзию 3D.

Я добавляю TweenEvent.MOTION_FINISH к одному из твинов для яйца, чтобы проверить, когда движение закончится. Когда это происходит, я создаю новый объект (называемый 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, и мой основной класс прослушивал его. Even отправляется в обработчике MOTION_FINISHED. Оно работает!

Хотя мне пришлось заставить его работать, используя общедоступные статические переменные в основном классе для передачи исходных координат приземления яйца. Вот так в основном классе:

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

И вот так в классе Egg:

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

Я могу жить с этим, но я бы предпочел не использовать глобальные переменные. Принимаю предложения по этому поводу, хотя на главный вопрос дан ответ. Спасибо.


person lcaaroe    schedule 05.05.2012    source источник


Ответы (1)


Вы создаете знак внутри экземпляра яйца, а затем добавляете его в список отображения яйца. Это означает, что знак (звезда) создается в координатном пространстве яйца и, следовательно, смещается в зависимости от положения яйца на сцене. Это также означает, что знак наследует любые преобразования, которые вы сделали с яйцом, такие как масштаб, поскольку он является дочерним элементом трансформированного экземпляра яйца.

Лучшим подходом было бы прослушивание в вашем основном классе либо события завершения движения вашего яйца (посмотрите на пузырьковое событие), либо пользовательского события, запускаемого обработчиком завершения движения. Когда это событие получено, создайте экземпляр splat и добавьте его в список отображения основного класса.

person net.uk.sweet    schedule 05.05.2012
comment
Спасибо, я посмотрю на пользовательские события и попробую ваш метод. Хотя как это объясняет, почему звезда смещается? Какие унаследованные координаты и преобразования должны сместить звезду? - person lcaaroe; 06.05.2012
comment
Смотрите обновленный пост. Надеюсь, на этот раз я объяснил лучше. - person net.uk.sweet; 06.05.2012
comment
Я создал собственный SplatEvent, и мой основной класс его прослушивал. Even отправляется в обработчике MOTION_FINISHED. Оно работает! - person lcaaroe; 06.05.2012