суббота, 10 ноября 2012 г.

Движение в сторону курсора. ActionScript 3.0.

import flash.display.MovieClip;
import flash.geom.Point;
import flash.events.Event;

//объект который будет двигаться в сторону курсора
var moveObject:MovieClip = new MoveObject;
//устанавливаем ему случайную позицию
moveObject.x = Math.random() * 550;
moveObject.y = Math.random() * 400;
//добавляем на сцену
addChild(moveObject);
//вектор движения
var dir:Point = new Point;
//скорость перемещения
var speed:Number = 3;

//обработчик события Event.ENTER_FRAME
function Update(e:Event):void
{
 //находим вектор движения
 dir.x = mouseX - moveObject.x;
 dir.y = mouseY - moveObject.y;
 
 //нормализуем вектор (приводим его к 1.0)
 dir.normalize(1.0);
 
 //перемещаем объект ипользуя вектор движения и скорость объекта
 moveObject.x += dir.x * speed;
 moveObject.y += dir.y * speed;
}

//устанавливаем обработчик события Event.ENTER_FRAME
addEventListener(Event.ENTER_FRAME, Update);
    Не один раз мне писали начинающие ActionScript 3.0-программисты с просьбами чтобы я помог им с «движением в сторону курсора». На самом деле это не очень сложная задача, и если быть честным, это самая простая задача, но, так как в последнее время похожих просьб было очень много, то я просто оставлю это здесь, чтобы ссылаться потом на этот пост. Demo есть тут.
    Метод очень простой, и он базируется на классе Point, и его методе normalize. Если объяснить простыми словами, то мы находим расстояние по обеим осям между объектом и курсором мыши, приводим это расстояние к 1.0, а дальше просто перемещаем объект на приведенное расстояние умноженное на скорость перемещения объекта. Все это видно в листинге выше, но, ниже я попытаюсь описать весь код, если вдруг кто-то не понял.
    В начале создается сам объект который будет двигаться в сторону курсора, он устанавливается в случайную позицию, и добавляется на сцену.
//объект который будет двигаться в сторону курсора
var moveObject:MovieClip = new MoveObject;
//устанавливаем ему случайную позицию
moveObject.x = Math.random() * 550;
moveObject.y = Math.random() * 400;
//добавляем на сцену
addChild(moveObject);
    Далее создается объект класса Point, который служит ничем другим как вектором движения, а также задается скорость перемещения объекта.
var dir:Point = new Point;
//скорость перемещения
var speed:Number = 3;
    Ну, и последнее это обработчик события ENTER_FRAME, который срабатывает каждый кадр и именно в нем происходит само перемещение объекта в сторону курсора. В начале обработчика вычисляется расстояние по обеим осям между объектом и курсором.
function Update(e:Event):void
{
    //находим вектор движения
    dir.x = mouseX - moveObject.x;
    dir.y = mouseY - moveObject.y;
    Далее, изменяем двину вектора  на 1.0...
    //нормализуем вектор (приводим его к 1.0)
    dir.normalize(1.0);
    ...и в конце просто перемещаем объект используя вектор движения умноженный на значение скорости...
    //перемещаем объект ипользуя вектор движения и скорость объекта
    moveObject.x += dir.x * speed;
    moveObject.y += dir.y * speed;
}
    Как видно способ очень простой, хотя это не единственный способ которым можно решить данную проблему. Но, я надеюсь что этим постом я помог всем тем людям которые просили у меня помощь. Исходный код можно скачать тут (Adobe Flash CS4 or hight).
    Все, всем удачи. Пока.