Я создал программу в 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;
Я могу жить с этим, но я бы предпочел не использовать глобальные переменные. Принимаю предложения по этому поводу, хотя на главный вопрос дан ответ. Спасибо.