![]() |
|
||||||||||
|
|||||
|
[+1 26.12.11]
[+1 11.09.11] Регистрация: Feb 2011
Сообщений: 117
|
Да простят меня админы, создаю еще одну тему.
Задача следующая, есть спрайт, который постоянно движется и вращается. У нас есть таймер, к нему привязана функция которая через определенные промежутки времени вызывает вращение спрайта а затем перемещение. Все. Проблема в том, что спрайт отлично вращается если мы не задаем никакую скорость по x и y осям. Или если нет вращения, то отлично передвигается. Но если спрайту нужно передвинуться и повернуться во время движения, тут он начинает неадекватно двигаться. На форуме добрые люди помогли разобраться с вращением, оно выглядит так : public function rotateAroundCenter(object:DisplayObject, angle:Number):void { var center : Point = new Point(X,Y) ; 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; trace("object.x,object.y=",object.x,object.y) ; } Движение получается кривым. тут скорость по X и Y 1 и угловая скорость равна 1, а во втором случае просто вращаем тело, все работает. Гуглил, не очень помогло,буду еще гуглить, может кто-то сталкивался с похожей проблемой. Заранее спасибо! Последний раз редактировалось Bazel; 12.08.2015 в 15:05. |
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
Ерунда какая-то написано или я чего-то не понимаю
делаете спрайт в адоб флеш СС и указываете начало координат в центре или гуглите как отцентровать спрайт вращение |
|
|||||
|
[+1 26.12.11]
[+1 11.09.11] Регистрация: Feb 2011
Сообщений: 117
|
в вашем коде он не будет вращаться вокруг своей оси
вращается он нормально и перемещается, но если мы сделаем скорость Vx <1 и Vy <1 то начинается двигаться вот так а вот так например когда скорости Vy= 1 и Vx=1 , все нормально с тем же кодом не совсем понял, начало координат же это всегда левый верхний угол? Последний раз редактировалось udaaff; 13.08.2015 в 19:34. |
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
координаты можно считать как и относительно сцены, так и относительно других объектов
package { import flash.display.MovieClip; import flash.events.Event; public class main extends MovieClip { private var sprite:mc = new mc(); public function main() { sprite.x = sprite.y = 20; addChild(sprite); stage.addEventListener(Event.ENTER_FRAME, rot); } private function rot (e:Event):void { sprite.rotation +=5; sprite.x += 1; sprite.y += 2; } } } |
|
|||||
|
[+1 26.12.11]
[+1 11.09.11] Регистрация: Feb 2011
Сообщений: 117
|
ваша правда, нарисовал многоугольник так чтобы его центр лежал на точке 0,0 родительского контейнера и вращение теперь нормальное! Не совсем въезжаю почему так.
|
|
|||||
|
Потому, что так устроен рендер Flash.
Каждый DOC имеет свою систему координат, начало которой считается от x/y внутри родителя. Вращаются объекты вокруг своего центра координат. Если вы создадите 2 класса, например треугольник и круг, унаследовав их от Sprite, и центр у обоих будет слева вверху, и положите один в другой, например, треугольник в квадрат, и будем вращать квадрат, ничего не изменится, но если написать так то вращение будет происходить относительно центра треугольника. Т.е. смещается не центр, а мы смещаем треугольник относительно центра.
__________________
There is no thing in this world that is not simple. |
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
потому что скорее всего расчёт вёлся относительно родительского контейнера, по этому и нужно центровать спрайты, там две строчки кода, но счас не вспомню, в гугле найдётся
с другой стороны это очень удобно, например создаём класс, который расширяет данный спрайт, и создадим в нём пару спрайтов написав this.addChild (если stage.addChild то расчёт будет относительно координат сцены) и всё, данные спрайты будут двигаться относительно расширенного спрайта, не нужно никаких расчётов, слушателей и т.п. |
|
|||||
|
[+1 26.12.11]
[+1 11.09.11] Регистрация: Feb 2011
Сообщений: 117
|
понял вас, спасибо за помощь!
Последний раз редактировалось Bazel; 12.08.2015 в 16:22. |
![]() |
![]() |
Часовой пояс GMT +4, время: 18:49. |
|
|
« Предыдущая тема | Следующая тема » |
|
|