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

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

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

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
По умолчанию Поворот спрайта мышью

Нужно по нажатию на угол спрайта и удерживании мыши поварачивать спрайт в зависимости от текущей позиции мыши. Ну в общем как в фотошопе при FreeTransform картинка поворачиваеться так и мне нужно. Точка поворота цент (хотябы) лучшеб чтоб любая
Вот...
Код AS3:
public function AObject()
{	
	aRBox.addChild(aRPicture);
 
	addChild(aSprite);//спрайт который нужно поворачивать
	addChild(aRBox);//кнопочка в углу спрайта
 
	Active = isActive;
 
	aRBox.addEventListener(MouseEvent.MOUSE_DOWN, goRotate);
 
 
}
private function goRotate(event:MouseEvent):void
{
	isRotating = true;
 
	stage.addEventListener(MouseEvent.MOUSE_UP  , stopRotate);
	stage.addEventListener(MouseEvent.MOUSE_MOVE, onRotate  );
}
private function onRotate(event:MouseEvent):void
{
	if (!isRotating) {return}
 
	var midX:Number = aSprite.x + (aSprite.width / 2);
	var midY:Number = aSprite.y + (aSprite.height / 2);
 
	var dx:Number = stage.mouseX - aSprite.x;
	var dy:Number = stage.mouseY - aSprite.y;
 
	var Angle : Number = Math.atan2(dy, dx);
	Angle = (Angle*180/Math.PI);
	trace(Angle);
 
	rotateAround(midX, midY, Angle);
	event.updateAfterEvent();
}
private function stopRotate(event:MouseEvent):void
{
	isRotating = false;
 
	stage.removeEventListener(MouseEvent.MOUSE_UP  , stopRotate);
	stage.removeEventListener(MouseEvent.MOUSE_MOVE, onRotate  );
}
protected function rotateAround(offsetX:Number,offsetY:Number,toDegrees:Number):void 
{
	var relDegrees:Number = toDegrees - (this.rotation % 360);
	var relRadians:Number = Math.PI * relDegrees / 180;
	var M:Matrix = new Matrix(1, 0, 0, 1, 0, 0);
	M.rotate(relRadians);
	var AC:Point = new Point(offsetX, offsetY);
	AC = this.localToGlobal(AC);
	AC = this.parent.globalToLocal(AC);
	var AB:Point = new Point(this.x, this.y);
	var CB:Point = AB.subtract(AC);
	CB = M.transformPoint(CB);
	AB = AC.add(CB);
	trace(this.rotation);
	this.rotation = toDegrees;
	this.x = AB.x;
	this.y = AB.y;
}
Плиз помогите уже дня три маюсяа она переворачиваеться как хочет а не как мне надо

Добавлено через 6 минут
Или вот еще функция для поворота
Код AS3:
function rotateAroundCenter (ob:*, angleDegrees, point:Point) 
{
	var m:Matrix=ob.transform.matrix;
	m.tx -= point.x;
	m.ty -= point.y;
	m.rotate (angleDegrees*(Math.PI/180));
	m.tx += point.x;
	m.ty += point.y;
	ob.transform.matrix=m;
}
Но с ней тоже ниче не выходит. У мну складывается впечатление что я неправильно нахожу угол... но чет все перепробовал и иинет перерыл. Хелп ми плиз

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

Регистрация: Jul 2007
Сообщений: 805
Отправить сообщение для ramshteks с помощью ICQ Отправить сообщение для ramshteks с помощью Skype™
ну вникать мне лень, до минимума сведите код, до такого на каком вы можете предсказать что будет дальше, а уже потом развивайте код. Вполне возможно все дело в функции atan, я в свое время писал нечто похожее, суть в том что он не найдет именно тот угол который вы ищите, я так думаю, проследите верно ли находит. Возможно необходимо сделать поправку в зависимости от того где находится курсор, или что там у вас.

так вот как я находил, по теореме синусов, потом уже понял что мой подход нерационален, смотрите часть вделенную красным

Цитата:
public static function GetDistance(x_1:Number,y_1:Number,x_2:Number,y_2:Number):Number {
return Math.sqrt(Math.pow(x_1 - x_2,2) + Math.pow(y_1 - y_2,2));
}
public static function GetAngle(x_1:Number,y_1:Number,x_2:Number,y_2:Number):Number {
var angle:Number=Math.asin((y_1 - y_2)/GetDistance(x_1,y_1,x_2,y_2))*IN_DEG;
if (x_1<x_2) {
angle=180-angle;
} else if (y_1<y_2) {
angle=360+angle;
}

return angle;
}
еще возможно стоит запоминать предыдущий угол на который поворачивали и прежде чем применять матрицу трансформации делать поправку.


Последний раз редактировалось ramshteks; 08.02.2009 в 10:04.
Создать новую тему Ответ Часовой пояс GMT +4, время: 13:50.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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