Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.11.2010, 19:31
Svi_stok вне форума Посмотреть профиль Отправить личное сообщение для Svi_stok Найти все сообщения от Svi_stok
  № 1  
Ответить с цитированием
Svi_stok
 
Аватар для Svi_stok

Регистрация: Feb 2009
Адрес: Харьков
Сообщений: 51
По умолчанию Как нарисовать линию от мувика к курсору мыши.

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

Старый 21.11.2010, 19:45
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
если нужно знать только в каком направлении копать, то:
Я бы для начала создал две переменные с типом данных 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);
}


Последний раз редактировалось goodguy; 21.11.2010 в 19:48.
Старый 21.11.2010, 21:33
Svi_stok вне форума Посмотреть профиль Отправить личное сообщение для Svi_stok Найти все сообщения от Svi_stok
  № 3  
Ответить с цитированием
Svi_stok
 
Аватар для Svi_stok

Регистрация: Feb 2009
Адрес: Харьков
Сообщений: 51
Спасибо большое за ориентир с меня пиво. Тригонометрия сила.

Старый 22.11.2010, 00:48
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 4  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
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 - это шаг


Последний раз редактировалось i.o.; 22.11.2010 в 11:03.
Старый 22.11.2010, 09:00
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 5  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Действительно, не заметил, что забыл поставить + перед равно. Но в остальном код правильный.
Имелось в виду это:
Код AS3:
point2.x += Math.cos(angle) * 2;
point2.y += Math.sin(angle) * 2;

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


Последний раз редактировалось goodguy; 22.11.2010 в 09:03.
Старый 22.11.2010, 10:59
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 6  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Цитата:
На счет векторов согласен, но для новичка это будет сложнее
А каждый раз вычислять косинус и синус, значится, не сложнее
Еще ведь нужно не забыть, что за X, а что за Y отвечает, и угол в градусах или радианах o_O

Старый 22.11.2010, 12:21
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 7  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Косинус и синус вычисляет программа, не самому же заморачиваться . Откуда взять угол понятно, все остальное просто.

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


Последний раз редактировалось goodguy; 22.11.2010 в 13:19.
Старый 22.11.2010, 12:48
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 8  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Оффтоп: лично мне удобнее икс с иксом и игрек с игреком соотносить, чем вспоминать, что отвечает за X: синус или косинус. С векторами все прозрачнее.

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

Старый 22.11.2010, 20:01
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 9  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Вы шутите что ли?! Раздобыть угол из координат вектора, чтобы потом снова добывать координаты вектора из угла 0о чему молодежь учите!
Все верно i.o. говорит. Нашли единичный вектор в нужном направлении и в цикле умножаем его на длину, растущую от нуля до изначальной дистанции.
__________________
Поймай яблоко 2!

Старый 22.11.2010, 23:31
Bred45 вне форума Посмотреть профиль Отправить личное сообщение для Bred45 Найти все сообщения от Bred45
  № 10  
Ответить с цитированием
Bred45

Регистрация: Dec 2008
Сообщений: 87
К стыду своему, никогда не работал с вектором, обходясь тригонометрическими формулами. Пример заинтересовал, спасибо!

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

Код 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, время: 18:56.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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