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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 22.05.2012, 17:45
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 5  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
в обще-то не такая тривиальная задачка, если нужно, чтобы прямоугольник скользил углами по внутренней кромке круга, например..
у меня такой вариант нарисовался, он не оптимальный по количеству вычислений, но понятный зато
Код AS3:
public class Main extends Sprite 
{
 
	private var center:Point = new Point(200, 200);
	private var R:Number = 100;
 
 
	private var sample:Sprite = new Sprite();
	private var prevMousePoint:Point;
	public function Main():void 
	{
		graphics.beginFill(0x000000, 0.1);
		graphics.drawCircle(center.x, center.y, R);
 
		sample.buttonMode = true;
		sample.graphics.beginFill(0x008000);
		sample.graphics.drawRect(0, 0, 60, 40);
		sample.x = 200;
		sample.y = 200;
		sample.rotation = 30;
 
		addChild(sample);
		sample.addEventListener(MouseEvent.MOUSE_DOWN, sample_mouseDown);
 
	}
 
 
	private function sample_mouseDown(e:MouseEvent):void 
	{
		stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
		stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
		// если нужна потеря драга при уводе мышки
		//sample.addEventListener(MouseEvent.MOUSE_OUT, stage_mouseUp);
		prevMousePoint = new Point(mouseX, mouseY);
	}
 
 
	private function stage_mouseUp(e:MouseEvent):void 
	{
		stage.removeEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
		stage.removeEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
 
	}
 
	private function stage_mouseMove(e:MouseEvent):void 
	{
		// двигаем как в обычном драге
		sample.x += mouseX - prevMousePoint.x;
		sample.y += mouseY - prevMousePoint.y;
		prevMousePoint = new Point(mouseX, mouseY);
 
 
		// сдвигаем, чтоб все углы вместились
		var rec:Rectangle = sample.getBounds(sample);
		var corners:Array = [
			sample.localToGlobal(rec.topLeft), 
			sample.localToGlobal(new Point(rec.right, rec.top)), 
			sample.localToGlobal(rec.bottomRight), 
			sample.localToGlobal(new Point(rec.left, rec.bottom))
		];
		var dir:Number = Math.atan2(sample.y - center.y, sample.x - center.x);
		var dX:Number = Math.cos(dir);
		var dY:Number = Math.sin(dir);
 
		for (var i:int = 0; i < 4; i++)
		{
			var p:Point = corners[i];
			while (Point.distance(center, p) > R) 
			{
				p.x -= dX;
				p.y -= dY;
				sample.x -= dX;
				sample.y -= dY;
			}
		}
 
	}
}

Создать новую тему   Часовой пояс GMT +4, время: 09:27.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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