![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
[+1 26.12.11]
[+1 11.09.11] Регистрация: Feb 2011
Сообщений: 117
|
Добрый день, проблема такая.
Есть квадрат, мы вращаем его с малой скоростью, и спрайт съезжает с центра. Прилагаю swf там наглядно видно. Проблемы когда скорость средняя или большая нет, но мне нужно чтобы он мог вращаться медленно и при это центр масс этого спрайта четко лежал там где нужно. Заранее спасибо! П.С. Когда запустите, дайте ему покрутится минуту и увидите, что он уехал от координаты своего центра, опять же при больших скоростях такого нет. Не знаю что делать. Последний раз редактировалось udaaff; 10.08.2015 в 18:30. |
|
|||||
|
[+1 26.12.11]
[+1 11.09.11] Регистрация: Feb 2011
Сообщений: 117
|
public function rotateAroundCenter(object:DisplayObject, t:Number):void // вращаем спрайт но не апдейтим вершины { var matrix:Matrix = object.transform.matrix; //trace(matrix.tx, matrix.ty) ; var rect:Rectangle = object.getBounds(object.parent); var Znak : Number = 1 ; (t == 0 ) ? Znak=1 : Znak = Math.abs(t) / t ; W_t = Math.abs(t) * AngVel + ((Ftorq/Mass)/2) * t * t * Znak ; trace("W_t=",W_t) ; matrix.translate(-XX, -YY); matrix.rotate((W_t * Znak / 180.0) * Math.PI); trace("XX,YY",(rect.left + (rect.width / 2)), (rect.top + (rect.height / 2))); trace("true XX, YY=",XX,YY) ; matrix.translate(XX, YY); object.transform.matrix = matrix; } со временем получается такая ситуация : XX,YY 295.5 291.425 // координата центра спрайта, считается как (rect.left + (rect.width / 2)), (rect.top + (rect.height / 2))) true XX, YY= 300 300 //а это наш центр массы которые никто не трогает на протяжении всего движения timer.currentCount= 253 Добавлено через 2 минуты стоит добавить что вначале центр масс квадрата и спрайта совпадают, но со временем почему-то разъезжаются, угловая скорость(переменная AngVel) имеет значение 0.1 |
|
|||||
|
Рассчитывать поворот нужно каждый раз из начальных параметров.
Вот тут тема освещена: http://www.flasher.ru/forum/showthread.php?t=175235
__________________
Дети не должны знать о своих родителях |
|
|||||
|
[+1 26.12.11]
[+1 11.09.11] Регистрация: Feb 2011
Сообщений: 117
|
Спасибо! сейчас попробую
попробовал, спрайт почему-то начинает уменьшаться.. как бы код осознал, не понимаю.. public function pointRotate(object:DisplayObject, center:Point, angle:Number) : void { /* * * * * * * * * * * * * @author wolsh * * * \* * * * * * * * * */ // return to zero angle += object.rotation; var a0:Number = - object.rotation * Math.PI / 180; var s0:Number = Math.sin(a0); var c0:Number = Math.cos(a0); var dX0:Number = object.x - center.x; var dY0:Number = object.y - center.y; object.rotation = 0; object.x = Math.round(center.x + dX0 * c0 - dY0 * s0); object.y = Math.round(center.y + dX0 * s0 + dY0 * c0); // new rotation var r:Number = angle * Math.PI / 180; var s:Number = Math.sin(r); var c:Number = Math.cos(r); var dX:Number = object.x - center.x; var dY:Number = object.y - center.y; object.rotation += angle; object.x = center.x + dX * c - dY * s; object.y = center.y + dX * s + dY * c; } Добавлено через 33 секунды почему, сейчас буду выяснять.. Добавлено через 50 минут а как перемещать при малых скоростях не подскажите? все работает при скорости по оси X большей пикселя за 1/60 секунды но при малой скорости все криво, спрайт куда-то уходит не в ту сторону( по оси Y) Последний раз редактировалось udaaff; 13.08.2015 в 19:35. |
|
|||||
|
Регистрация: Mar 2011
Сообщений: 38
|
Попробуйте вставить вот такую строчку в Ваш исходный код:
И посмотрите меняются ли у Вас значения height и width Дело в том что у Вас не написано в каком месте и сколько раз Вы вычисляете координаты XX и YY, но вот тут: и вот тут: параметры XX и YY должны быть разные
__________________
☢ Если человек не задает вопрос - правильный ответ его ничему не научит © Joe Maputo Последний раз редактировалось MAPUTO; 11.08.2015 в 15:10. Причина: Дополнение сообщения |
|
|||||
|
[+1 26.12.11]
[+1 11.09.11] Регистрация: Feb 2011
Сообщений: 117
|
поворачиваю теперь так
public function pointRotate(object:DisplayObject, center:Point, angle:Number) : void { /* * * * * * * * * * * * * @author wolsh * * * \* * * * * * * * * */ // return to zero angle += object.rotation; var a0:Number = - object.rotation * Math.PI / 180; var s0:Number = Math.sin(a0); var c0:Number = Math.cos(a0); var dX0:Number = object.x - center.x; var dY0:Number = object.y - center.y; object.rotation = 0; object.x = Math.round(center.x + dX0 * c0 - dY0 * s0); object.y = Math.round(center.y + dX0 * s0 + dY0 * c0); // new rotation var r:Number = angle * Math.PI / 180; var s:Number = Math.sin(r); var c:Number = Math.cos(r); var dX:Number = object.x - center.x; var dY:Number = object.y - center.y; object.rotation += angle; object.x = center.x + dX * c - dY * s; object.y = center.y + dX * s + dY * c; } так выглядит перемещение тела public function MoveTo ( X : Number , Y : Number) // перемещаем спрайт { var matrix:Matrix = Rect.transform.matrix; //trace(matrix.tx, matrix.ty) ; var rect:Rectangle = Rect.getBounds(Rect.parent); var Dx : Number = X - this.XX ; var Dy : Number = Y - this.YY ; matrix.translate( Dx , Dy ); this.XX = ( rect.left + (rect.width / 2) + Dx) ; this.YY = ( rect.top + (rect.height / 2) + Dy) ; Rect.transform.matrix = matrix; } |
|
|||||
|
__________________
משיח לא בא משיח גם לא מטלפן |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:02. |
|
|
« Предыдущая тема | Следующая тема » |
|
|