Форум 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=146905)

Svi_stok 21.11.2010 19:31

Как нарисовать линию от мувика к курсору мыши.
 
Здравствуйте есть такая задача нужно нарисовать линию от мувика к указателю мышки в момент ее нажатия. Линия должна рисоваться не сразу, а последовательно с определенной скоростью скажем 2 пикселя в секунду. Можно такое сделать? Подскажите, пожалуйста в каком направлении копать. Заранее спасибо.

goodguy 21.11.2010 19:45

если нужно знать только в каком направлении копать, то:
Я бы для начала создал две переменные с типом данных Point одну для хранения начального положения мувика (как бы точки отсчета), другую в качестве указателя куда должна двигаться линия. Затем, слушатель MOUSE_DOWN и обработчик этого события. Внутри функции обработчика бы добавил ENTER_FRAME который будет рисовать линию покадрово. Так же назначил бы координаты первой точки равные координатам мувика.

Внутри энтер фрейма, применив немного тригонометрии расчитал бы угол от начальной точки до курсора

Код AS3:

var angle:Number = Math.atan2(point1.y - container.mouseY, point1.x - container.mouseX);

и уже начал рисовать линию к координатам которые бы расчитывал так:

Код AS3:

point2.x = Math.cos(angle) * 2;
point2.y = Math.sin(angle) * 2;

Ну а там бы уже с помощью graphics.lineTo рисовал линию к этим координатам.

А остановил бы рисование чем то вроде этого:

Код AS3:

if (Math.abs(container.mouseX - point2.x) <= 5 && Math.abs(container.mouseY - point2.y) <= 5)
{
    stage.removeEventListener(Event.ENTER_FRAME, blabla);
}


Svi_stok 21.11.2010 21:33

Спасибо большое за ориентир с меня пиво. Тригонометрия сила.

i.o. 22.11.2010 00:48

goodguy, для таких целей существуют векторы.
Код AS3:

var myDirection:Point = new Point(container.mouseX-point1.x, container.mouseY-point1.y);
myDirection.normalize(1.0);
 
// вероятно должно быть еще и:
point2.x = point1.x;
point2.y = point1.y;

Тут не совсем понял, что вы задумали. Предположу, что должно быть как-то так
Код AS3:

point2.x += 2.0 * myDirection.x;
point2.y += 2.0 * myDirection.y;
 
// где 2.0 - это шаг


goodguy 22.11.2010 09:00

Действительно, не заметил, что забыл поставить + перед равно. Но в остальном код правильный.
Имелось в виду это:
Код AS3:

point2.x += Math.cos(angle) * 2;
point2.y += Math.sin(angle) * 2;


На счет векторов согласен, но для новичка это будет сложнее. Я сам до сих пор не особо соображаю в векторах

i.o. 22.11.2010 10:59

Цитата:

На счет векторов согласен, но для новичка это будет сложнее
А каждый раз вычислять косинус и синус, значится, не сложнее :D
Еще ведь нужно не забыть, что за X, а что за Y отвечает, и угол в градусах или радианах o_O

goodguy 22.11.2010 12:21

Косинус и синус вычисляет программа, не самому же заморачиваться :D . Откуда взять угол понятно, все остальное просто.

если использовать плюсы, то косинус - х, синус - у. Угол всегда в радианах
хз, мне кажется это проще :D , может я не прав

i.o. 22.11.2010 12:48

Оффтоп: лично мне удобнее икс с иксом и игрек с игреком соотносить, чем вспоминать, что отвечает за X: синус или косинус. С векторами все прозрачнее.

А так: обе реализации правильные, есть из чего выбрать )

Zebestov 22.11.2010 20:01

Вы шутите что ли?! Раздобыть угол из координат вектора, чтобы потом снова добывать координаты вектора из угла 0о чему молодежь учите!
Все верно i.o. говорит. Нашли единичный вектор в нужном направлении и в цикле умножаем его на длину, растущую от нуля до изначальной дистанции.

Bred45 22.11.2010 23:31

К стыду своему, никогда не работал с вектором, обходясь тригонометрическими формулами. Пример заинтересовал, спасибо!

Попробовал у себя. Вдруг кому пригодится:

Код AS3:

package 
{
        import flash.display.*;
        import flash.events.*;
        import flash.geom.Point;
        public class Pnt extends Sprite
        {
                var myDirection:Point;
                var point2:Point;
                function Pnt():void
                {
                        stage.addEventListener(MouseEvent.CLICK, initAnim);
                }
                private function initAnim(e:MouseEvent)
                {
                        myDirection = new Point(stage.mouseX - point1.x,stage.mouseY - point1.y);
                        point2 = new Point();
                        myDirection.normalize(1.0);
                        point2.x = point1.x;
                        point2.y = point1.y;
                        this.graphics.clear();
                        this.graphics.lineStyle(1)
                        this.graphics.moveTo(point1.x, point1.y)
                        stage.addEventListener(Event.ENTER_FRAME, enterframeListener);
                }
                private function enterframeListener(e:Event)
                {
                        point2.x +=  5.0 * myDirection.x;
                        point2.y +=  5.0 * myDirection.y;
                        this.graphics.lineTo(point2.x, point2.y)
                }
        }
}



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

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