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

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

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

Регистрация: Nov 2006
Сообщений: 93
По умолчанию Как программно изменить точку привязки?

Есть клип с точкой привязки в левом верхнем углу. А я хочу вращать и скалировать его вокруг центра. Как мне поменять программно эту точку? Типа поменять , повернуть, вернуть точку на место.

Пытался с помощью матриц, что-то хреново получается.


Код:
onClipEvent (load) 
{
	import flash.geom.Matrix;
	import flash.geom.Point;
	var m_curr_time:Number = 0;
}

onClipEvent (enterFrame) 
{
	m_curr_time += 0.1;		

	{
		var old_x = _x;
		var old_y = _y;
		var myMatrix:Matrix = new Matrix();	
		myMatrix.translate(-_width/2 - old_x ,-_height/2 - old_y);				
		myMatrix.rotate(Math.PI*0.1 *m_curr_time);		
		myMatrix.translate(_width/2 + old_x ,_height/2 + old_y);

		var tmpMatrix:Matrix = transform.matrix;
	    tmpMatrix.concat(myMatrix);				
	    transform.matrix = tmpMatrix;
	}
}
Any suggestions?

Старый 03.01.2007, 14:32
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 2  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
Вы читали правила раздела?

Цитата:
Вам не разрешаеться постить в данном разделе примеры с использованием обработчиков on(), onClipEvent(), или методов loadVariables/loadVariablesNum.
не стоит пользоваться методами и обработчиками, которые использовались в 2000ом году, не стоит учить этому других.
Долой вас в раздел для нубов!
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^

Старый 03.01.2007, 15:24
N!kE вне форума Посмотреть профиль Отправить личное сообщение для N!kE Найти все сообщения от N!kE
  № 3  
Ответить с цитированием
N!kE

Регистрация: Jun 2006
Сообщений: 107
я пользовался заменой объекта на другой, с другим центрированием, хотя не думаю, что это умный способ

Старый 03.01.2007, 15:51
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 4  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
Код:
/* 
rotation (mc, angle, dx, dy)
mc - мувиклип к которому нужно применить вращение
angle - угол
dx - новая точка вращения относительно начала координат клипа по оси X
dy - новая точка вращения относительно начала координат клипа по оси Y
*/
rotation = function (mc:MovieClip, angle:Number, dx:Number, dy:Number):Void {
	if (mc.x == undefined || mc.y == undefined) {
		mc.x = mc._x;
		mc.y = mc._y;
	}
	var radAngle = angle * (Math.PI / 180);
	var x = Math.cos (radAngle) * dx - Math.sin (radAngle) * dy;
	var y = Math.sin (radAngle) * dx + Math.cos (radAngle) * dy;
	mc._rotation = angle;
	mc._x = mc.x + dx - x;
	mc._y = mc.y + dy - y;
};
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 03.01.2007 в 18:20.
Старый 03.01.2007, 18:16
Ляксей вне форума Посмотреть профиль Отправить личное сообщение для Ляксей Найти все сообщения от Ляксей
  № 5  
Ответить с цитированием
Ляксей

Регистрация: Nov 2006
Сообщений: 93
iNils, спаcибо большое. Как-то такое решение даже не приходило в голову.
Только, на сколько я понял, dx и dy это точка не относительно центра, а относительно начала координат клипа ( в моём случае Top-Left).


Последний раз редактировалось Ляксей; 03.01.2007 в 18:19.
Старый 03.01.2007, 18:19
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 6  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
Цитата:
Сообщение от Ляксей
dx и dy это точка не относительно центра, а относительно начала координат клипа
Верно, не правильно описал, сейчас поменяю.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 04.01.2007, 12:57
Ляксей вне форума Посмотреть профиль Отправить личное сообщение для Ляксей Найти все сообщения от Ляксей
  № 7  
Ответить с цитированием
Ляксей

Регистрация: Nov 2006
Сообщений: 93
К сожалению, эта ф-я хорошо работает, пока не начнёшь двигать клип. Потом начинается что-то непонятное.

Старый 04.01.2007, 16:26
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 8  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
Цитата:
Сообщение от Ляксей
К сожалению, эта ф-я хорошо работает, пока не начнёшь двигать клип. Потом начинается что-то непонятное.
Потому, что mc.x и mc.y фиксируются при первом обращении.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 05.01.2007, 14:21
Ляксей вне форума Посмотреть профиль Отправить личное сообщение для Ляксей Найти все сообщения от Ляксей
  № 9  
Ответить с цитированием
Ляксей

Регистрация: Nov 2006
Сообщений: 93
Короче, мне всё равно такая ф-я нужна, которая будет вращать вокруг центра и потом можно будет двигать клип. Так что вот кое-что написал, если кому интересно. Оптимизацией не занимался, так как смутно представляю как это в ActionScript сделать. Может надо уменьшить количество операторов new или ещё что. Зато общая идея в коде прослеживается, а именно:
1.Находим центральную точку клипа
2. Затем находим позицию, в которой окажется Top-Left угол после поворота вокруг центра.
3. Выставляем все соотв. значения.

Код:
//---------------------------------------------------------------------------------
	// ф-я вращения клипа вокруг центра при точке привязки Top-Left
	//mc - клип, который будем вращать
	//angle - в градусах	
	setRotaionAroundCenter = function (mc:MovieClip,angle:Number)
	{
		// находим центр клипа
		var old_rot = mc._rotation;
		mc._rotation = 0;
		var w = mc._width;
		var h = mc._height;
		mc._rotation = old_rot;
		var center_point = new Point(w/2,h/2);
		var matr = new Matrix();
		matr.rotate((old_rot/180)*Math.PI);		
		center_point = matr.transformPoint(center_point);
		center_point.offset(mc._x,mc._y);	//теперь это настоящая точка нахождения центра клипа

		//находим точку , где после поворота вокруг центра клипа будет находиться 
		// его изначальная точка привязки (Top-Left)
		var new_pos = new Point(-w/2,-h/2);
		var matr1 = new Matrix();
		matr1.rotate((angle/180)*Math.PI);
		new_pos = matr1.transformPoint(new_pos);
		new_pos = new_pos.add(center_point);		
		mc._rotation = angle;
		mc._x = new_pos.x;
		mc._y = new_pos.y;
	}
//-----------------------------------------------------------------------------------------
	// установить центр клипа в позицию pos, независимо от того какой у него _rotation
	// точка привязки клипа Top-Left
	// прчём центром клипа считается точка пересечения диагоналей 
	// ограждающего прямоугольника при _rotation == 0
	setCenterPos = function (mc:MovieClip,pos:Point)
	{
		// находим центр клипа
		var old_rot = mc._rotation;
		mc._rotation = 0;
		var w = mc._width;
		var h = mc._height;
		mc._rotation = old_rot;
		var center_point = new Point(w/2,h/2);
		var matr = new Matrix();
		matr.rotate((old_rot/180)*Math.PI);
		center_point = matr.transformPoint(center_point);
		center_point.offset(mc._x,mc._y);	//теперь это настоящая точка нахождения центра клипа
		
		pos.x = pos.x - center_point.x;
		pos.y = pos.y - center_point.y;
		
		mc._x += pos.x ;
		mc._y += pos.y ;
	}	
//---------------------------------------------------------------------------------
	// установить виртуальный Top-Left угол в позицию pos, независимо от того какой у него _rotation
	// точка привязки клипа Top-Left
	// т.е. если мы при _rotation == 0, виртуальный и реальный Top-Left угол совпадают, 
	// но когда мы изменим _rotation и выставим виртальный Top-Left на прежнем месте, 
	// то клип повернётся относительно центра
	setVirtualTopLeftPos = function(mc:MovieClip,pos:Point)
	{
		// находим центр клипа
		var old_rot = mc._rotation;
		mc._rotation = 0;
		var w = mc._width;
		var h = mc._height;
		mc._rotation = old_rot;
		var center_point = new Point(w/2,h/2);
		var matr = new Matrix();
		matr.rotate((old_rot/180)*Math.PI);
		//trace(mc._x + "  " + mc._y);
		center_point = matr.transformPoint(center_point);
		center_point.offset(mc._x,mc._y);	//теперь это настоящая точка нахождения центра клипа
		
		pos.x = pos.x - center_point.x;
		pos.y = pos.y - center_point.y;
		
		mc._x += (pos.x + w/2);
		mc._y += (pos.y + h/2);		
	}

Старый 05.01.2007, 15:52
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 10  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
По мойму проще дописать к моему способу пару методов и двигать через них, а не на прямую через _x и _y, а в методах менять mc.x и mc.y.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

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

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


 


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


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