суть вопроса, такова. Есть спрайт, есть функция вращения спрайта например: FunctionRotate(sprite, angel) - думаю параметры объяснять не стоит.
мне нужно чтоб при нажатии например клавиши вправо, спрайт повернулся на 90 градусов, но не мгновенно, а с определенной скоростью. если не понятно объяснил то пишите, объясню с картинками) с поворотами разобрался с помощью Mikle и встроенного таймера в сам движок С геометрией у меня очень туго, столкнулся с новой проблемой. Как сделать управление объектом на подобие гонок, то есть если жмем вправо, влево то крутимся на месте, если вверх то едем в направлении где у нас нос(перед) , если жмем вниз то задний ход. Я знаю что тут для определения движения нужно использовать sin, cos но я в этом полный нуб. За пример кода с меня ++ алгоритмы поворота мне не нужны, они есть в простой функции.
Сообщение отредактировал arrow25 - Четверг, 13 Сентября 2012, 17:29
если не понятно объяснил то пишите, объясню с картинками)
Да, давай с картинками .
Если я правильно все понял, то вроде же это просто. Есть некоторая ф-ция Update(), которая периодически вызывается и обновляет состояния (перемещение спрайтов, тут же обработка клавиш, etc). Так вот, что мешает завести две переменных, типа TargetAngle и CurrentAngle, при нажатии клавиши делать TargetAngle = 90 и в этой ф-ции проверять "ecли TargetAngle != CurrentAngle, то CurrentAngle += 5" и постоянно звать FunctionRotate(sprite, CurrentAngle) C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Есть некоторая ф-ция Update(), которая периодически вызывается и обновляет состояния (перемещение спрайтов, тут же обработка клавиш, etc). Так вот, что мешает завести две переменных, типа TargetAngle и CurrentAngle, при нажатии клавиши делать TargetAngle = 90 и в этой ф-ции проверять "ecли TargetAngle != CurrentAngle, то CurrentAngle += 5" и постоянно звать FunctionRotate(sprite, CurrentAngle)
+1. Не успел ответить =). Правда, немного подправлю. Лучше писать не "TargetAngle != CurrentAngle", а "TargetAngle >= (или <=) CurrentAngle", т.к. если к CurrentAngle прибавлять пять, а изначально она была равна 1, то равной 90 она никогда не станет и спрайт будет вертеться вечно =). Но это уже больше по технической части. Основной алгоритм Archido описал. *Не убегай от снайпера, умрешь уставшим. *Мои статьи...
Сообщение отредактировал Stalker_Shooter - Пятница, 17 Августа 2012, 08:47
int Offset = TargetAngle - CurrentAngle; if (Offset > Value) Offset = Value; if (Offset < -Value) Offset = -Value;
if (TargetAngle != CurrentAngle) CurrentAngle += Offset; //тут даже условие не обязательно
Тогда при любом CurrentAngle оно "приедет" в любой TargetAngle . Правда есть один нюанс: если угол ограничен множеством [0; 360), то неплохо еще определять в какую сторону "быстрее" поворачивать, но это уже еще более детальные детали C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Пятница, 17 Августа 2012, 09:05
ad141 Это называется линейной интерполяцией, повернется не "с определенной скоростью" как хотел ТС, а плавно да. Но эффект весьма забавный C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
кто пример может рабочий кинуть по моему вопросу? Не важно на чем написан (кроме конструкторов), и чтоб был скомпилированный файл. и главная фишка в том что, само событие которое вызывает действие поворота(в данном случае это нажатие клавиши) должно быть просто KEY_HIT. обычно функций проверки нажатия клавиш несколько, есть например простое нажатие клавиши - без удержания её (KEY_HIT), и есть (KEY_DOWN) когда клавиша нажата, и удерживается в нажатом состоянии.
при событии с удержанием клавиши проблем нет, а вот как сделать чтоб при простом нажатии(KEY_HIT) спрайт делал тоже самое.
сам поворот нужен только в 4-ех углах 0,90,180,270. Например текущий угол спрайта равен 180, при нажатии KEY_HIT(вверх), спрайт должен повернутся на 180 градусов (влево или вправо, это не важно). Этого делать за меня не прошу нужен просто пример того что написано выше спойлера.
нашел игру в которой это реализовано, игра называется "алмазные бойцы", это игра танчики
Сообщение отредактировал arrow25 - Среда, 22 Августа 2012, 11:41
-Mikle-, не компилируется программа), пример не работает( а за исходник спасибо, ну буду рад если пере зальешь рабочий пример, так как пишу на уровне бейсика. посмотрел исходник, ппц) чес слово я в нем дубом встану) мне надо что то по проще, простой пример нахождения пути, по траектории куда повернут спрайт. а у тебя там все слитно, сорри но этого мне не понять. пример не работает потому что он вообще не работает) , изображение есть, а движений нет
Сообщение отредактировал arrow25 - Четверг, 13 Сентября 2012, 22:40
-Mikle-, а ну все заработало), надо было сразу писать управление ну там очень много лишнего для меня. Всякие мигалки, пукалки, и т.д мне и без них там не разобратся), а тут еще и они))
Добавлено (13.09.2012, 23:02) --------------------------------------------- -Mikle-, а ну все заработало), надо было сразу писать управление ну там очень много лишнего для меня. Всякие мигалки, пукалки, и т.д мне и без них там не разобратся), а тут еще и они))
Добавлено (13.09.2012, 23:14) --------------------------------------------- -Mikle-, я пишу на purebasic'e в паре с движком "MP3D" я с поворотом то голову себе сломал)(полтора дня колдовал с встроенной функцией таймера), а тут ты мне кидаешь почти голый код без коментов), для меня это полный лес), хотя я бейсик не много но знаю, ну и понимаю программирование на 3 из 5 в общем. беда такая вообще, которую я не предвидел начал писать по твоему примеру поворот спрайта. блин я в собственных ифах так запутался))) что очень трудно кому то будет его распутать) у меня реально получилось примерно 8 вложенных ифов на одну проверку(и только в одну сторону то есть проверял по текущему направлению спрайта ), куда нажата клавиша), и еще мне предстояло написать примерно столько же ифов для всей моей мечты). кароче твой пример для меня лес), я это имел виду.
Сообщение отредактировал arrow25 - Четверг, 13 Сентября 2012, 23:19
arrow25, попроси PBPROG чтобы перевёл мой пример на пурик, думаю, не откажет. Когда отсеится то, что характерно для VB6, то станет видно, что там не так много кода.