Постепенное вращение изображения от одного градуса к другому

Это мой первый пост, так что терпите меня. Я постараюсь объяснить свою проблему как можно более ясным. Во-первых, позвольте мне сказать, что я плохо разбираюсь в математике. Я провалил это в школе, и мне безмерно больно, что я не могу понять простые математические концепции, тем более что я люблю кодировать. Кто-то, кто хочет программировать, но не может выполнять базовые математические операции? Плохая комбинация. Ааа в любом случае, к проблеме.

Какой-то контекст. Пишу игру по типу астероидов. Все идет неплохо, и я преодолел все препятствия на данный момент благодаря этому сайту (спасибо!) И Google. Я тщательно искал решение моей проблемы, но мне всегда казалось, что я натыкаюсь на решение, которое либо не работает, либо я просто не понимаю и не могу включить его в свой код.

Речь идет о вращении корабля. У меня есть экранный класс джойстика, который возвращает угол, на который джойстик нажимается. Я использую этот угол, чтобы направить корабль в том же направлении.

Что я хочу сделать, так это постепенно повернуть корабль на угол, на который хочет пойти пользователь, используя самый короткий поворот, влево или вправо. В уме я думаю: «Как, черт возьми, я могу сказать… 350 градусов от 5 градусов, иду налево?». Я не знаю...

Вот мой код отрисовки:

public void draw(Canvas canvas){
    canvas.save();
    canvas.rotate((float) (fAngle + 90), (float) (dX + (mShip.getIntrinsicWidth() / 2)), (float) (dY + (mShip.getIntrinsicHeight() / 2)));
    mShip.setBounds((int)dX, (int)dY, (int)dX + mShip.getIntrinsicWidth(), (int)dY + mShip.getIntrinsicHeight());
    mShip.draw(canvas);
    canvas.restore();
}

Угол передается переменной fAngle из метода getangle джойстика. Затем угол увеличивается на 90 градусов из-за ориентации изображения.

user.fAngle = oJoystick.getAngle();

Поэтому на каждом этапе игры я хочу повернуть корабль в любом направлении, в котором хочет двигаться игрок, градус за градусом. Любая помощь с этим будет принята с благодарностью!

Спасибо за чтение!


person Salx    schedule 21.08.2011    source источник
comment
asgamer.com/2009/ - проверьте на выходе автор отлично объясняет движения, которые он делает.   -  person getn_outchea    schedule 21.08.2011


Ответы (1)


В вашей функции тика вместо: user.fAngle = oJoystick.getAngle ();

Используйте это (отрегулируйте шаг по своему вкусу - это контролирует скорость вращения):

const float increment = 1.0;
float direction;
float joy = oJoystick.getAngle();
float ang = user.fAngle;
float fudge = 5.0;

if (abs (joy - ang) > fudge) {
    if (joy > ang) {
        if (joy - ang < 180)
            direction = 1;
        else
            direction = -1;
    } else if (joy < ang) {       
        if (ang - joy < 180)
            direction = -1;
        else
            direction = 1;
    }
} else // already pointing right direction
    direction = 0;

user.fAngle = ang + direction * increment;
if (0 > user.fAngle)
    user.fAngle += 360;
if (360 < user.fAngle)
    user.fAngle -= 360;
person user885074    schedule 21.08.2011
comment
Это ОГРОМНЫЙ шаг в правильном направлении. Спасибо! Некоторые вопросы. Иногда корабль выходит из-под контроля. И корабль «трясется», когда он направлен в правильном направлении. Я предполагаю, что это как-то связано с поплавками и округлением. - person Salx; 21.08.2011
comment
Не уверен насчет вращения, но я отредактировал код, чтобы он меньше трясся. Настройте "фадж" по своему вкусу. - person user885074; 21.08.2011
comment
«Фадж» отлично работает, еще раз спасибо. Все еще смотрю на корабль, который выходит из-под контроля. У меня есть мысль. Как вы думаете, canvas.rotate ((float) (fAngle + 90) в моем коде с этим не справляется? Я наполовину думаю, что мне следует избавиться от этого, исправить изображение (повернуть его в самом растровом изображении) и, возможно, что исправлю? - person Salx; 21.08.2011
comment
Не знаю, что сказать о спиннинге. Мне отсюда сложно отлаживать. ;) Похоже, что ввод джойстика немного шаткий или что-то в этом роде. - person user885074; 21.08.2011
comment
Сделаем небольшую отладку здесь. User.fAngle переходит в отрицательные числа, что, конечно, полностью все портит. - person Salx; 21.08.2011
comment
Ах хорошо. Просто ограничьте fAngle до 0–360 в последнем утверждении, и все будет хорошо. (Для этого я обновил код) - person user885074; 21.08.2011
comment
да, пробовал. все еще не пойдет. Все, что делает, - это фиксирует корабль в одном направлении (0 или 359), когда что-то идет не так. Это странно, потому что большую часть времени он крутится бесконтрольно. Иногда я могу заставить его вращаться прямо неконтролируемо. А иногда это просто прекрасно! ах! - person Salx; 21.08.2011
comment
Понятно! Я провалил ограничение 0-360 в конце. Вот что у меня есть .. if (user.fAngle ›359) user.fAngle = 0; если (user.fAngle ‹0) user.fAngle = 359; Теперь он отлично работает с этим! СПАСИБО! Я хочу подбодрить вас, но мне кажется, мне нужна репутация. - person Salx; 21.08.2011