Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Поворот по короткой дуге (http://www.flasher.ru/forum/showthread.php?t=134466)

Dos87 31.12.2009 08:52

Поворот по короткой дуге
 
Всех с Новым Годом!

Столкнулся с проблемой при повороте объекта.
При нажатии кнопки влево, вверх, вправо или вниз, объект должен повернуться по короткой дуге. Т.е., если нажата клавиша влево, то целевой угол (targetAngle) равен -90 градусов и объект (body), повёрнутый на 80 градусов должен повернуться против часовой стрелки на угол currentAngle.

У меня есть метод для поворота объекта:

currentAngle - угол, на который будем поворачивать объект.
targetAngle - угол, к которому будем стремиться (0, 90, -90, 180).
body - тело, которое будем поворачивать.

Код AS3:

public function rotate(currentAngle:Number, targetAngle:Number, body:DisplayObject):void
{
        var angle:Number = ???????;
        if (angle < 180)
                body.rotation += currentAngle;
        else
                body.rotation -= currentAngle;
        //Корректировка
        if (body.rotation > targetAngle - currentAngle && body.rotation < targetAngle + currentAngle) body.rotation = targetAngle;
}

Как узнать, когда поворачивать по часовой стрелке, а когда против?

AL.exe 01.01.2010 06:24

Что-то Вы сами все себе усложнили, плюс описали в примере значения всех переменных кроме той, которая у Вас вызывает вопрос.

Попробуйте пересмотреть проблему.

P.S. И кстати, почему переменная, означающая "угол, на который будем поворачивать объект", называется currentAngle? Вы точно не запутались? :)

Dos87 02.01.2010 04:17

Задам вопрос по-другому:

Как сделать, чтобы в событии ENTER_FRAME объект поворачивался в нужную сторону через меньший угол?
Н-р: если объект повёрнут на 100гр. как сделать, чтобы при нажатии кнопки "влево", он начал поворачиваться по часовой стрелке, пока не достигнет угла -90гр., а при нажатии кнопки вверх - против часовой, пока не достигнет угла 0гр.

VVall 02.01.2010 04:43

Надо привести оба угла (в градусах) в диапазон значений 0..360, вычесть из второго первый, снова привести результат в диапазон 0..360, и потом если результат меньше или равен 180, то крутить в одну сторону, если больше - в другую.

Dos87 02.01.2010 12:11

VVall, big thanks.

Вот рабочий метод, может кому пригодиться )

Код AS3:

public function rotate(currentAngle:Number, targetAngle:Number, body:DisplayObject):void
{
        var angle:Number = targetAngle - body.rotation;
        while (angle < 0) angle += 360;
        while (angle > 360) angle -= 360;
        trace (angle);
        if (angle > 180)
                body.rotation -= currentAngle;
        else
                body.rotation += currentAngle;
        if (body.rotation > targetAngle - currentAngle && body.rotation < targetAngle + currentAngle) body.rotation = targetAngle;
}



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

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