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

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

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

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
По умолчанию Перемещение объекта в пределах круглой области

Перемещаю акселерометром (это не важно, тоже самое для drag) объект. Нужно чтобы он не выходил за пределы окружности с заданным центром и радиусом. Сейчас вычисляю расстояние до центра.

Код AS3:
private const СX:Number = 200;
private const СY:Number = 200;
private const RADIUS:int = 50;
private var accelerometer:Accelerometer;        
private var xSpeed:Number = 0;
private var ySpeed:Number = 0;
 
if (Accelerometer.isSupported) {
	accelerometer = new Accelerometer();
	accelerometer.addEventListener(AccelerometerEvent.UPDATE, accUpdateHandler);
	addEventListener(Event.ENTER_FRAME, startDragging);
}
 
private final function accUpdateHandler(event:AccelerometerEvent):void  {
	xSpeed -= event.accelerationX * 10;
	ySpeed += event.accelerationY * 10;
}
 
protected function startDragging(event:Event):void  {
	event.stopPropagation();
	var newX:Number = ball.x + xSpeed;
	var newY:Number = ball.y + ySpeed;
 
	if (DistanceTwoPoints(newX, СX,  newY, СY) > RADIUS){
ball.x = newX; //Вот в этой части никак не соображу как правильно задать координаты шарика
ball.y = newY;
xSpeed = 0;
ySpeed = 0;
	} else {
ball.x += xSpeed*20;
ball.y += ySpeed*20;
	}
}
 
protected function DistanceTwoPoints(x1:Number, x2:Number,  y1:Number, y2:Number): Number {
				var dx:Number = x1-x2;
				var dy:Number = y1-y2;
				return Math.sqrt(dx * dx + dy * dy);
			}

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

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Если расстояние от вашего объекта до центра больше нужного радиуса, то просто возвращайте объект обратно. Примерно такой вариант:
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.text.TextField;
 
	/**
	 * ...
	 * @author Samana
	 */
	public class Main extends Sprite 
	{
		static public const RADIUS:int = 150;
		private var centerPoint:Point = new Point(300, 300);
 
		private var circle:Circle = new Circle();
 
 
		public function Main():void 
		{
			circle.x = 300;
			circle.y = 300;
			addChild(circle);
 
			stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
		}
 
		private function stage_mouseMove(e:MouseEvent):void 
		{
			circle.x = mouseX;
			circle.y = mouseY;
 
			var dx:Number = circle.x - centerPoint.x;
			var dy:Number = circle.y - centerPoint.y;
			var dist:Number = Math.sqrt(dx * dx + dy * dy);
			var ang:Number = Math.atan2(dy, dx);
 
			if (dist > RADIUS)
			{
				circle.x = centerPoint.x + Math.cos(ang) * RADIUS;
				circle.y = centerPoint.y + Math.sin(ang) * RADIUS;
			}
		}
 
 
	}
 
}

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

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Спасибо работает, но, к сожалению, на мобиле тормозит. Видимо сложноватые просчеты.
Для своего случая, я ещё добавил обнуление скорости когда dist > RADIUS
Код AS3:
xSpeed = 0;
ySpeed = 0;
Добавлено через 1 час 55 минут
Интересно, а можно ли как-то сделать HitTest внутри объекта? Нужно попробовать RealHitTest.

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

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

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


 


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


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