Показать сообщение отдельно
Старый 13.04.2013, 23:02
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 2  
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Есть подозрения на неверную точку начала отсчета координат мыши. в AS3 координаты мыши могут быть как глобальными, на весь стейдж, так и локальными, на мувиклип. Глобальная координата считается от верхнего левого угла стейджа, а локальная от верхнего левого угла (или точки привязки, поправьте если кто точно знает) мувиклипа. У вас скорее всего координата мыши считается локально, у каждого шарика в отдельности.

Могу предложить следующее - заменить слушатель события EnterFrame на MouseMove, при этом сам слушатель насильно привязывать к stage, тогда координаты точно будут абсолютными.
Код AS3:
package 
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent;
 
 
 
    public class MC extends MovieClip
    {
        var homex:int;
        var homey:int;
        var magnet:int;
        var x0:int;
        var y0:int;
        var x1:int;
        var y1:int;
 
        var distancex:int;
        var distancey:int;
        var distance:int;
 
        var powery:int;
        var powerx:int;
 
        var forcex:int;
        var forcey:int;
        public function MC()
        {
            this.addEventListener(Event.ADDED_TO_STAGE,addS);
            /*Переносим регистрацию обработчика в слушатель добавления на сцену (нужно слушать именно там, так как только там узнаем ссылку на stage*/
 
 
 
        }
 
        function addS(e:Event):void
        {
            homex=this.x;
            homey=this.y;
            magnet=5000;
           //Слушатель добавляем после получения ссылки на stage (после добавления на экран) и именно на stage, а не на this.
            stage.addEventListener(MouseEvent.MOUSE_MOVE, mousePosition);
        }
 
 
        //Для приличия поменяем название обработчика
        function mousePosition(e:MouseEvent):void
        {
            x0=this.x;// КООРДИНАТЫ В ДАННОМ КАДРЕ
            y0=this.y;
            x1=mouseX;// КООРДИНАТЫ МЫШИ
            y1=mouseY;
            /*
             *Как вариант можно написать
             x1 = stage.mouseX;
             y1 = stage.mouseY;
            */
            distancex=x1-x0;// РАСТОЯНИЕ МЕЖДУ КУРСОРОМ И this ПО       Х И У
            distancey=y1-y0;
 
            distance=Math.sqrt(distancex*distancex+distancey*distancey);//ДИАГОНАЛЬ 
            powerx=this.x-distancex/distance*magnet/distance;
            powery=this.y-distancey/distance*magnet/distance;
            forcex = (forcex + (homex - x0) / 2) / 1.660000;
            forcey = (forcey + (homey - y0) / 2) / 1.660000;
            this.x=powerx+forcex;
            this.y=powery+forcey;
        }
    }
}
Хотя вполне возможно что не придется возиться с проверкой события на stage, а просто поменять две строчки
Код AS3:
x1=mouseX;// КООРДИНАТЫ МЫШИ
y1=mouseY;
на
Код AS3:
x1=stage.mouseX;// КООРДИНАТЫ МЫШИ
y1=stage.mouseY;
Но тогда есть вероятность получения ошибки нулевой ссылки если обработчик нового кадра начнет выполняться раньше добавления на сцену. В общем событие MouseMove или EnterFrame лучше регистрировать по добавлению на сцену, в вашей addS(e);

Попробуйте и так и так, отпишитесь о результатах)