Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Почему спрайт перестает поворачиваться, если значение угла больше 32768? (http://www.flasher.ru/forum/showthread.php?t=183357)

gait 19.08.2012 22:30

Почему спрайт перестает поворачиваться, если значение угла больше 32768?
 
Спрайт прикручен к телу в box2d. Тело вращается (колесо). Rotation спрайт получает от угла тела. Угол тела box2d не обнуляется, за каждый пройденный круг прибавляется 2П радиан. После того, как вращение тела произошло более 91 раз, угол тела становится 2П * 91 = 571.76, что в градусах 91 * 180 * П = 32760. И колесо еще сможет сделать оборот на 8 градусов. Но более этого уже не сможет. То есть колесо не сможет сделать 91-ый оборот до конца.
Обхожу это следующим (проверка в каждом кадре):
Код AS3:

var rotLimit:Number = 180 * 10;
while (wheelRotation > rotLimit)
{
        wheelRotation -= rotLimit;
}

Но как-то не очень красиво получается. Может есть другие способы борьбы с этой проблемой?

Krusty 19.08.2012 22:33

32768, что то мне это число напоминает :-)))))))))))))))
По теме сделайте присвоение через сеттер/геттер. Т.е. если у вас полный круг превышен(360), то отнимайте 360 или кратно 360.
Код:

wheelRotation%360
, если кратко

gait 19.08.2012 23:05

Спасибо! С остатком от деления действительно получается изящнее!
P.S. Может быть кто-нибудь знает корень проблемы? Почему так происходит? Почему спрайт не может поворачиваться, если значение более 32768?

Krusty 19.08.2012 23:13

потому что на него отведено 2 байта, со знаком. Это max_value для SI16 = 32768
но, надеюсь, вы не в каждом кадре это проверяете, а при присвоении?

gait 20.08.2012 00:36

В каждом кадре, так как присвоение в каждом кадре. Это плохо?

Aquahawk 20.08.2012 12:26

Недавно про него вспоминал, в прошлом году наткнулся. Тоже в box2d, колёса у машинки вращаться переставали. Почему так происходит не понятно. Ну. т.е. понятно что два байта, а почему именно два и почему в хелпе не написано об этом не ясно.

Krusty 20.08.2012 12:33

Цитата:

Сообщение от Aquahawk (Сообщение 1092938)
Недавно про него вспоминал, в прошлом году наткнулся. Тоже в box2d, колёса у машинки вращаться переставали. Почему так происходит не понятно. Ну. т.е. понятно что два байта, а почему именно два и почему в хелпе не написано об этом не ясно.

Потому что один байт мало, а три много. Поэтому два.

Добавлено через 39 секунд
Цитата:

Сообщение от gait (Сообщение 1092893)
В каждом кадре, так как присвоение в каждом кадре. Это плохо?

Нет, поскольку у вас это одно и то же, то нормально.

dimarik 20.08.2012 17:45

Каким образом переполнение сетки влияет на значение?
Код:

1110b + 1 =    1111b;
1111b + 1 = [1]0000b; -> новое значение 0000b;
0000b + 1 =    0001b;


Aquahawk 20.08.2012 19:23

Цитата:

Каким образом переполнение сетки влияет на значение?
Код:
1110b + 1 = 1111b;
1111b + 1 = [1]0000b; -> новое значение 0000b;
0000b + 1 = 0001b;
неправда ваша. При установке больших значений вращения не происходит. Таким образом оно бы продолжилось с рывком


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

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