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

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

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

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
Практически ваша задача
http://www.gamedev.ru/code/forum/?id=72507
__________________
interplanety

Старый 30.01.2014, 12:03
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 12  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
если устроит не совсем элипс, а скорее овал из кривых, то с помощью безьевых утилит Дембицкого можно
Код AS3:
package
{
	import flash.display.Graphics;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.geom.Bezier;
	import flash.geom.Point;
 
 
	public class Main extends Sprite
	{
		private var ball:Circle = new Circle(30);
		private var segments:Array = [];
		private var cX:Number = 300;
		private var cY:Number = 300;
		private var rX:Number = 200;
		private var rY:Number = 100;
 
 
		private var mX:Number;
		private var mY:Number;
 
		public function Main():void
		{
 
			ball.x = cX;
			ball.y = cY;
			addChild(ball);
 
			graphics.lineStyle(2);
 
			// типа 'элипс' из четырех безье
			for (var i:int = 0; i < 4; i++)
			{
				var a:Number = Math.PI * i / 2;
 
				var sP:Point = new Point(cX + Math.cos(a) * rX, cY + Math.sin(a) * rY);
				a += 0.5 * Math.PI;
				var eP:Point = new Point(cX + Math.cos(a) * rX, cY + Math.sin(a) * rY);
				var cP:Point = i % 2 ? new Point(eP.x, sP.y) : new Point(sP.x, eP.y);
				var segm:Bezier = new Bezier(sP, cP, eP);
				segments.push(segm);
 
				if (!i) graphics.moveTo(sP.x, sP.y);
				graphics..curveTo(cP.x, cP.y, eP.x, eP.y);
 
			}
 
			ball.addEventListener(MouseEvent.MOUSE_DOWN, ball_mouseDown);
 
		}
 
		private function ball_mouseDown(e:MouseEvent):void
		{
			mX = stage.mouseX;
			mY = stage.mouseY;
			stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
 
		}
 
		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
		{
			// двигаем
			ball.x += stage.mouseX - mX;
			ball.y += stage.mouseY - mY;
			mX = stage.mouseX;
			mY = stage.mouseY;
 
 
			// проверка и коррекция
			var dir:Number = Math.PI + Math.atan2(cY - ball.y, cX - ball.x);
			var segm:Bezier = segments[Math.floor(2 * dir / Math.PI) % 4];
 
			var t:Number = segm.getClosest(new Point(ball.x, ball.y));
			var tP:Point = segm.getPoint(t);
 
			if (Point.distance(new Point(ball.x, ball.y), tP) < ball.radius)
			{
				dir = Math.atan2(tP.y - ball.y, tP.x - ball.x);
				ball.x = tP.x - ball.radius * Math.cos(dir);
				ball.y = tP.y - ball.radius * Math.sin(dir);
			}
		}
 
	}
 
}
 
import flash.display.Sprite;
 
class Circle extends Sprite
{
 
	public var radius:Number;
 
	public function Circle(r:Number)
	{
		super();
		radius = r;
		graphics.beginFill(0x808080);
		graphics.drawCircle(0, 0, r);
 
	}
}
Добавлено через 35 минут
а можно и не связываться с безье, а строить просто отрезками и брать ближайший по наименьшему расстоянию, тогда и эллипс будет как эллипс
Код AS3:
package
{
	import flash.display.Graphics;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
 
	import flash.geom.Point;
 
 
	public class Main extends Sprite
	{
		private var ball:Circle = new Circle(30);
		private var segments:Array = [];
		private var cX:Number = 300;
		private var cY:Number = 300;
		private var rX:Number = 200;
		private var rY:Number = 100;
 
		private var mX:Number;
		private var mY:Number;
 
		public function Main():void
		{
 
			ball.x = cX;
			ball.y = cY;
			addChild(ball);
 
			graphics.lineStyle(2);
 
			// элипс из отрезков
			var n:Number = 60;
			var dA:Number = 2 * Math.PI / n;
			var a:Number = 0;
			for (var i:int = 0; i < n; i++)
			{
 
				var sP:Point = new Point(cX + Math.cos(a) * rX, cY + Math.sin(a) * rY);
				a += dA;
				var eP:Point = new Point(cX + Math.cos(a) * rX, cY + Math.sin(a) * rY);
				var mid:Point = Point.interpolate(sP, eP, 0.5);
 
				segments.push(mid);
 
				if (!i) graphics.moveTo(sP.x, sP.y);
				graphics.lineTo(eP.x, eP.y);
 
			}
 
			ball.addEventListener(MouseEvent.MOUSE_DOWN, ball_mouseDown);
 
		}
 
		private function ball_mouseDown(e:MouseEvent):void
		{
			mX = stage.mouseX;
			mY = stage.mouseY;
			stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
 
		}
 
		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
		{
			// двигаем
			ball.x += stage.mouseX - mX;
			ball.y += stage.mouseY - mY;
			mX = stage.mouseX;
			mY = stage.mouseY;
 
			// проверка и коррекция
			var tP:Point;
			var min:Number = Number.MAX_VALUE;
			for (var i:int = 0; i < segments.length; i++) 
			{
				var d:Number = Point.distance(new Point(ball.x, ball.y), segments[i]);
				if ( d< min)
				{
					tP = segments[i];
					min = d;
				}
			}
 
			var dir:Number = Math.PI + Math.atan2(cY - ball.y, cX - ball.x);
			if (Point.distance(new Point(ball.x, ball.y), tP) < ball.radius)
			{
				dir = Math.atan2(tP.y - ball.y, tP.x - ball.x);
				ball.x = tP.x - ball.radius * Math.cos(dir);
				ball.y = tP.y - ball.radius * Math.sin(dir);
			}
		}
 
	}
 
}
 
import flash.display.Sprite;
 
class Circle extends Sprite
{
 
	public var radius:Number;
 
	public function Circle(r:Number)
	{
		super();
		radius = r;
		graphics.beginFill(0x808080);
		graphics.drawCircle(0, 0, r);
 
	}
}

Старый 30.01.2014, 21:42
vorodis2 вне форума Посмотреть профиль Отправить личное сообщение для vorodis2 Найти все сообщения от vorodis2
  № 13  
Ответить с цитированием
vorodis2

Регистрация: Feb 2011
Адрес: Украина Днепропетровск
Сообщений: 106
Спасибо всем за вкусные ссылочки. Сейчас срочную работу кинули и не могу их оценить по достоинству, но вижу что решения в них. Как разгребусь, покажу что получилось.

Старый 31.01.2014, 02:45
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 14  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Цитата:
stage_mouseMove
интересная конвенция..
это сам придумал или есть где?
по стандартной
Код AS3:
stage_mouseMoveHandler
но мне очень нравится
onStage_mouseMove
__________________
Отряд Котовскага

Старый 31.01.2014, 02:51
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 15  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
Цитата:
stage_mouseMoveHandler
Как по мне:
1. Зачем "_" в названиях функций? Очень некрасиво.
2. Лишний постфикс "Handler" к каждому хендлеру?
Это то же самое, что и писать:
Код AS3:
var myNumber:Number;
Я пишу onObjectEvent, и настроил это в FD, например:
Код AS3:
function onStageMouseMove()
Ничего лишнего.

Но это всё ИМХО. Не стоит спорить по этому поводу

Старый 31.01.2014, 09:47
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 16  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
Цитата:
Сообщение от Котяра Посмотреть сообщение
интересная конвенция..
это сам придумал или есть где?
по стандартной
Код AS3:
stage_mouseMoveHandler
но мне очень нравится
onStage_mouseMove
target_eventName - привычная для C#, во всяком случае VS такие генерит по умолчанию

Старый 02.02.2014, 21:27
vorodis2 вне форума Посмотреть профиль Отправить личное сообщение для vorodis2 Найти все сообщения от vorodis2
  № 17  
Ответить с цитированием
vorodis2

Регистрация: Feb 2011
Адрес: Украина Днепропетровск
Сообщений: 106
Во как получилось
http://vorodis2.com/test/debagElips/
Изюминка в том что надо было искать не край а центр, эллипса меньше на радиус круга. Правда при плоских эллипсах немного круг вылазит, но для моей задачи это не критично.

Кому надо, вот исходник.
http://vorodis2.com/test/debagElips/debagElips.rar

Старый 02.02.2014, 22:16
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 18  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Выбрали мой метод! Урещщии!

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

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

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


 


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


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