Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   движение по направлению мыши (http://www.flasher.ru/forum/showthread.php?t=118360)

Danss 21.11.2008 14:31

движение по направлению мыши
 
Помогите, пожулуйста, реализовать следущее:

кликаем мышкой в любом месте рабочего поля, и мувик движется в направлении курсора и пролетает дальше с одинаковой скоростью.

я знаю простой способ как обьект привязать к мышке чтобы он летел к курсору и цеплялся к нему:

Код AS3:

_mc.x -= (_mc.x - mouseX) / 4;
_mc.y -= (_mc.y - mouseY) / 4;

Но как сделать чтобы при клике, мувик летел в направлении мыши и пролетал дальше с равномерной скоростью?
Заранее благодарю.

mad_god 21.11.2008 14:38

Похоже, нужно решить уравнение прямой, найти точку на прямой, котой принадлежит точка курсора.
Что то типа x + by + c = 0
Прямую можно провести через две точки , которые мы знаем:

точка курсора
центр мувика.

нужно найти точку, удалённую от этих двух точек.

Danss 21.11.2008 14:44

не совсем понял. Мне нужно в момент клика определить точку клипа и точку клика и как то установить прямую и задать движение?
хорошо, если я узнаю эти точки, то как все же реализовать движение? :)

mad_god 21.11.2008 15:15

наверно так же как и здесь у тебя:

Код AS3:

_mc.x -= (_mc.x - mouseX) / 4;
_mc.y -= (_mc.y - mouseY) / 4;

только вместо mouseX и mouseY нужна точка.Х точка .У.

Irradiance 21.11.2008 15:21

Код AS3:

var s:Sprite = new Sprite();
var time:int = 30;
var spdX:Number;
var spdY:Number;
 
addChild (s);
 
this.addEventListener (MouseEvent.MOUSE_DOWN, setProps);
 
function setProps (e:MouseEvent):void {
        spdX = (e.stageX - s.x)/time;
        spdY = (e.stageY - s.y)/time;
        if (!s.hasEventListener(Event.ENTER_FRAME)) s.addEventListener (Event.ENTER_FRAME, moveTarget);
}
 
function moveTarget (e:Event):void {
        s.x += spdX;
        s.y += spdY;
        trace (s.x, s.y);
}

скорость здесь только каждый раз разная, при желании можно и ее уровнять :)

NePridymal 21.11.2008 15:47

Это вопрос не по АС а по математике. Находим по двум точкам вектор, находим dx и dy в одну единицу времени для движения равномерного по этому вектору а дальше по таймеру делаем движение хоть до бесконечности.
Точки знаем (мувик и мышка), вектор найти можем. Никаких проблем

mad_god 21.11.2008 16:02

точно, дельту вычислить. Забыл как называется :) Вот только код кто-то напишет? ;)

gen4 21.11.2008 16:10

Код:

speed = 5
dx = (mc.x - mousex)/5
dy = (mc.y - mousey)/5

onFrame{
mc.x+=dx;
mc.y+=dy;
}


mad_god 21.11.2008 16:23

точно. Раз мувик летит в направлении мышки, то пусть и дальше продолжает лететь.

musat 21.11.2008 16:24

Вложений: 1
Вот, держите:
Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite {
                private var s:Sprite;
                private var dx:Number;
                private var dy:Number;
                private var speed:Number = 10;
 
                public function Main() {
                        s = new Sprite();
                        s.graphics.beginFill(0xFF0000);
                        s.graphics.drawCircle(10,10,10);
                        addChild(s);
 
                        stage.addEventListener(MouseEvent.MOUSE_DOWN,startMotion);
                }
 
                private function startMotion(e:MouseEvent):void {
                        dx = (mouseX - s.x) / speed;
                        dy = (mouseY - s.y) / speed;
 
                        if (!s.hasEventListener(Event.ENTER_FRAME)) s.addEventListener(Event.ENTER_FRAME,move);
                }
 
                private function move(e:Event):void {
                        s.x += dx;
                        s.y += dy;
                }
        }
}


Danss 21.11.2008 16:44

всем спасибо!
п.с.Я просто с математикой не дружу )))

d4lt 25.11.2008 13:28

Не нужно изобретать велосипед, для таких целей и сделали easing functions:
http://livedocs.adobe.com/flex/2/doc...=00000747.html

Вот пример:
http://www.madeinflex.com/img/entrie...gexplorer.html

iNils 25.11.2008 13:44

Цитата:

Сообщение от d4lt (Сообщение 779634)
Не нужно изобретать велосипед

Нужно. Во-первых, это развивает мозги. Во-вторых, можно сделать лучше.

d4lt 25.11.2008 15:15

iNils,
Уже оффтопик, но...
Похоже, наши взгляды на программирование слегка отличаются.
Я привык думать о том, что я получаю денежное вознаграждение за потраченное мною на разработку/тестирование время. Для кастомеров важен конечный результат, соблюдение графика и качество.

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

P.S.: Автору рано или поздно понадобилось бы усовершенствовать поведение и математическую модель, поэтому использование easing является более долгоиграющим решением.
P.P.S.: Не стоит забывать, что оптимизировать нужно только там, где это действительно необходимо. И не думаю, что в adobe написали хуже, чем предложенные здесь варианты.

iNils 25.11.2008 17:00

Это все подходит для профессиональных программистов. А по автору же видно, что опыта у него мало, поэтому изобретение велосипедов для него хорошие занятие для развития навыков.


Часовой пояс GMT +4, время: 12:37.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.