![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: 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;
}
}
|
|
|||||
|
4AM Games
|
Вы читали правила раздела?
Цитата:
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^ |
|
|||||
|
Регистрация: Jun 2006
Сообщений: 107
|
я пользовался заменой объекта на другой, с другим центрированием, хотя не думаю, что это умный способ
![]() |
|
|||||
|
Негуру
администратор
Регистрация: 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;
};
Последний раз редактировалось iNils; 03.01.2007 в 18:20. |
|
|||||
|
Регистрация: Nov 2006
Сообщений: 93
|
iNils, спаcибо большое. Как-то такое решение даже не приходило в голову.
Только, на сколько я понял, dx и dy это точка не относительно центра, а относительно начала координат клипа ( в моём случае Top-Left). Последний раз редактировалось Ляксей; 03.01.2007 в 18:19. |
|
|||||
|
Регистрация: Nov 2006
Сообщений: 93
|
К сожалению, эта ф-я хорошо работает, пока не начнёшь двигать клип. Потом начинается что-то непонятное.
|
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
|
Цитата:
|
|
|||||
|
Регистрация: 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);
}
|
![]() |
![]() |
Часовой пояс GMT +4, время: 02:21. |
|
|
« Предыдущая тема | Следующая тема » |
|
|