Суббота, 18 Января 2020, 02:50

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Общие обсуждения программистов » вопросы по разным алгоритмам (вопрос по реализации алгоритмов)
вопросы по разным алгоритмам
arrow25Дата: Пятница, 17 Августа 2012, 05:20 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
суть вопроса, такова.
Есть спрайт, есть функция вращения спрайта например: FunctionRotate(sprite, angel) - думаю параметры объяснять не стоит.

мне нужно чтоб при нажатии например клавиши вправо, спрайт повернулся на 90 градусов, но не мгновенно, а с определенной скоростью.
если не понятно объяснил то пишите, объясню с картинками)
с поворотами разобрался с помощью Mikle biggrin и встроенного таймера в сам движок
С геометрией у меня очень туго, столкнулся с новой проблемой.
Как сделать управление объектом на подобие гонок, то есть если жмем вправо, влево то крутимся на месте, если вверх то едем в направлении где у нас нос(перед) , если жмем вниз то задний ход.
Я знаю что тут для определения движения нужно использовать sin, cos но я в этом полный нуб. За пример кода с меня ++
алгоритмы поворота мне не нужны, они есть в простой функции.


Сообщение отредактировал arrow25 - Четверг, 13 Сентября 2012, 17:29
ArchidoДата: Пятница, 17 Августа 2012, 08:12 | Сообщение # 2
Сэнсэй
Сейчас нет на сайте
Quote (arrow25)
если не понятно объяснил то пишите, объясню с картинками)

Да, давай с картинками biggrin .

Если я правильно все понял, то вроде же это просто.
Есть некоторая ф-ция Update(), которая периодически вызывается и обновляет состояния (перемещение спрайтов, тут же обработка клавиш, etc). Так вот, что мешает завести две переменных, типа TargetAngle и CurrentAngle, при нажатии клавиши делать TargetAngle = 90 и в этой ф-ции проверять "ecли TargetAngle != CurrentAngle, то CurrentAngle += 5" и постоянно звать FunctionRotate(sprite, CurrentAngle)


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Stalker_ShooterДата: Пятница, 17 Августа 2012, 08:41 | Сообщение # 3
3D XNA'шник
Сейчас нет на сайте
Quote (Archido)
Есть некоторая ф-ция 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
ArchidoДата: Пятница, 17 Августа 2012, 09:04 | Сообщение # 4
Сэнсэй
Сейчас нет на сайте
Quote (Stalker_Shooter)
Но это уже больше по технической части

Да, детали уже пошли в ход, но ты прав smile

С "деталями" я бы сделал так:
Code

const int Value = 5;

int Offset = TargetAngle - CurrentAngle;
if (Offset > Value) Offset = Value;
if (Offset < -Value) Offset = -Value;

if (TargetAngle != CurrentAngle) CurrentAngle += Offset; //тут даже условие не обязательно

Тогда при любом CurrentAngle оно "приедет" в любой TargetAngle smile . Правда есть один нюанс: если угол ограничен множеством [0; 360), то неплохо еще определять в какую сторону "быстрее" поворачивать, но это уже еще более детальные детали happy


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Пятница, 17 Августа 2012, 09:05
arrow25Дата: Пятница, 17 Августа 2012, 09:25 | Сообщение # 5
постоянный участник
Сейчас нет на сайте
всем спасибо за наводку), почти то что нужно
ad141Дата: Вторник, 21 Августа 2012, 23:40 | Сообщение # 6
почетный гость
Сейчас нет на сайте
с плавным затуханием скорости

Code
CurrentAngle += (TargetAngle - CurrentAngle) * 0.01f; // Последнее число - скорость (1.0) - мгновенно, 0.000001 - очень плавно...
FunctionRotate(sprite, CurrentAngle);



Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
ArchidoДата: Вторник, 21 Августа 2012, 23:59 | Сообщение # 7
Сэнсэй
Сейчас нет на сайте
ad141
Это называется линейной интерполяцией, повернется не "с определенной скоростью" как хотел ТС, а плавно да. Но эффект весьма забавный smile


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
ad141Дата: Среда, 22 Августа 2012, 08:22 | Сообщение # 8
почетный гость
Сейчас нет на сайте
Archido, круто... А я на самом деле незнал... Подобирал формулу и тут бац, с плавным затуханием...

Добавлено (22.08.2012, 08:22)
---------------------------------------------
А какие есть ещё интерполяции?
Есть с плавным наростом скорости?



Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
arrow25Дата: Среда, 22 Августа 2012, 11:34 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
кто пример может рабочий кинуть по моему вопросу? Не важно на чем написан (кроме конструкторов), и чтоб был скомпилированный файл.
и главная фишка в том что, само событие которое вызывает действие поворота(в данном случае это нажатие клавиши) должно быть просто KEY_HIT.
обычно функций проверки нажатия клавиш несколько, есть например простое нажатие клавиши - без удержания её (KEY_HIT), и есть (KEY_DOWN) когда клавиша нажата, и удерживается в нажатом состоянии.

при событии с удержанием клавиши проблем нет, а вот как сделать чтоб при простом нажатии(KEY_HIT) спрайт делал тоже самое.



нашел игру в которой это реализовано, игра называется "алмазные бойцы", это игра танчики


Сообщение отредактировал arrow25 - Среда, 22 Августа 2012, 11:41
-Mikle-Дата: Среда, 22 Августа 2012, 14:06 | Сообщение # 10
Изобретатель велосипедов
Сейчас нет на сайте
Quote (arrow25)
Не важно на чем написан (кроме конструкторов), и чтоб был скомпилированный файл.

Вот Пример.
Написан на vb6, нужные тебе рассчёты в процедуре Tick().
arrow25Дата: Четверг, 13 Сентября 2012, 16:32 | Сообщение # 11
постоянный участник
Сейчас нет на сайте
обновил первый пост, с новым вопросом smile
-Mikle-Дата: Четверг, 13 Сентября 2012, 19:54 | Сообщение # 12
Изобретатель велосипедов
Сейчас нет на сайте
Вот готовая физика машины в 2D на VB6:
ss2d


Сообщение отредактировал -Mikle- - Четверг, 13 Сентября 2012, 19:54
arrow25Дата: Четверг, 13 Сентября 2012, 22:21 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
-Mikle-,
не компилируется программа), пример не работает( а за исходник спасибо, ну буду рад если пере зальешь рабочий пример, так как пишу на уровне бейсика.
посмотрел исходник, ппц) чес слово я в нем дубом встану) мне надо что то по проще, простой пример нахождения пути, по траектории куда повернут спрайт.
а у тебя там все слитно, сорри но этого мне не понять.
пример не работает потому что он вообще не работает) , изображение есть, а движений нет


Сообщение отредактировал arrow25 - Четверг, 13 Сентября 2012, 22:40
-Mikle-Дата: Четверг, 13 Сентября 2012, 22:50 | Сообщение # 14
Изобретатель велосипедов
Сейчас нет на сайте
Quote (arrow25)
пример не работает

Понял smile там ручная КПП и машина изначально стоит на нейтралке. Кнопки A-Z повышают-понижают передачу.
А совсем простой пример попробую, напишу.
arrow25Дата: Четверг, 13 Сентября 2012, 23:14 | Сообщение # 15
постоянный участник
Сейчас нет на сайте
-Mikle-, а ну все заработало), надо было сразу писать управление biggrin ну там очень много лишнего для меня. Всякие мигалки, пукалки, и т.д smile мне и без них там не разобратся), а тут еще и они))

Добавлено (13.09.2012, 23:02)
---------------------------------------------
-Mikle-, а ну все заработало), надо было сразу писать управление biggrin ну там очень много лишнего для меня. Всякие мигалки, пукалки, и т.д smile мне и без них там не разобратся), а тут еще и они))

Добавлено (13.09.2012, 23:14)
---------------------------------------------
-Mikle-,
я пишу на purebasic'e
в паре с движком "MP3D" я с поворотом то голову себе сломал)(полтора дня колдовал с встроенной функцией таймера), а тут ты мне кидаешь почти голый код без коментов), для меня это полный лес), хотя я бейсик не много но знаю, ну и понимаю программирование на 3 из 5 в общем.
беда такая вообще, которую я не предвидел surprised начал писать по твоему примеру поворот спрайта. блин я в собственных ифах так запутался))) что очень трудно кому то будет его распутать) у меня реально получилось примерно 8 вложенных ифов на одну проверку(и только в одну сторону biggrin то есть проверял по текущему направлению спрайта ), куда нажата клавиша), и еще мне предстояло написать примерно столько же ифов для всей моей мечты). кароче твой пример для меня лес), я это имел виду.


Сообщение отредактировал arrow25 - Четверг, 13 Сентября 2012, 23:19
-Mikle-Дата: Пятница, 14 Сентября 2012, 19:21 | Сообщение # 16
Изобретатель велосипедов
Сейчас нет на сайте
arrow25, попроси PBPROG чтобы перевёл мой пример на пурик, думаю, не откажет. Когда отсеится то, что характерно для VB6, то станет видно, что там не так много кода.
Форум игроделов » Программирование » Общие обсуждения программистов » вопросы по разным алгоритмам (вопрос по реализации алгоритмов)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2020 Рейтинг