Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Вниз

Движение и торможение   Найти похожие ветки 

 
P@uk   (2004-08-02 21:33) [0]

здравсивуйте. Проблемка у меня такова.
Недавно нашел интересную реализацию механизма движения, именно такую как мне было нужно для моей игрушки(спейс-шуттер).
Принцип следующий: клавишами "влево" и "вправо" объект(корабль) вращается(фактически указываем угол движения) а при нажатии клавиши "акселератор" увеличиваем скорость по такому принципу:

XVel:=XVel+CosineArray^[Angle];
 
 if XVel>5 then XVel:=5
 else
 if XVel<-5 then XVel:=-5;

YVel:=YVel+SineArray^[Angle];

 if YVel>5 then YVel:=5
 else
 if YVel<-5 then YVel:=-5;

Думаю понятно, XVel и YVel скорость по Х и У,  CosineArray и SineArray массивы заранее просчитаных значений синусов и косинусов. Максимальная скорость 5 поэтому проверяем на превышение предела.
В общем все просто, кстати взял из какого-то семпла на этом сайте, кажется Asteroid.
А проблемка появилась когда начал реализовывать "торможение". Можно конечно сразу сбросить XVel и YVel на 0, но нужна плавность.
С изменением скорости вроде понятно

XVel:=XVel-CosineArray^[Angle];

YVel:=YVel-SineArray^[Angle];


А вот с пределами не получается.  Точнее получается, но слишком много if-ов. Хотелось бы по лаконичнее.

Вопрос в первую очередь к тем кто работал с подобным механизмом.

Спасибо.

ЗЫ. Пожалуйста, хотелось бы услышать ответы по сути, а не нравоучения и остроты.


 
Zer0 ©   (2004-08-02 23:01) [1]

ограничение скорости:

после изменения всех(!) скоростей в любом направлении

вариант N-1 bad

XVel = Min(Max(XVel,-5),5)
YVel = Min(Max(YVel,-5),5)

плохой потому что в при движении строго по диагонали реальная скорость больше ограничения в sqrt(2) раза.

вариант N1

V= (XVel,YVel,ZVel) {вектор скоростей }

вычисляем длину D вектора V если она превышает заданный порог MaxVel то нормализуем вектор исходных скоростей V и умножаем его на этот самый порог

итого - имеем скорость строго меньшую или равную MaxVel

вариант N2

V=V*(1-f*t)
где f - констатна трения, пропорциональная скорости, t - время движения обьектов от расчета предыдущего кадра до этого (при использовании таймеров =1/частота таймера)

при желани можно поизвращаться и f сделать зависмой от скорости, квадрата скорости и проч.

итого плавное ограничене скорости
===========
торомжение

см вариант N2, тока врубаем трение когда зажата кнопка тормоза

===========
полет назад

именно он в примере и есть =)

зы а вам таки не н`гавяца нашы ост`готы? =)


 
P@uk   (2004-08-03 00:10) [2]

Чтож, премного благодарен, есть над чем поковыряться.


> зы а вам таки не н`гавяца нашы ост`готы? =)

Боже-ж-мой, как ви могли так п"го нас подумать.
Просто после того как продолбешся полдня над такой вроде мелочью, и ждешь реального совета, особо не хочется получать ответы типа "сделай лучше тетрис","почитай книгу Ю.Суходрищенка "Полет и посадка в условяих нестабильной гравитации","Установи компонент TTormoz" итд.
Еще раз спасибо



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.041 c
1-1100622476
Gear
2004-11-16 19:27
2004.12.05
Как запретить перерисовку отдельному компоненту?


3-1099915999
Danila
2004-11-08 15:13
2004.12.05
InterBase 6.0 Как получить список полей из системной таблици


1-1100868269
yura2
2004-11-19 15:44
2004.12.05
Как показать документ Word в окне своей программы?


14-1100460788
KOMATO3
2004-11-14 22:33
2004.12.05
Я б в программеры пошел, пусть меня научат!


1-1101044563
ИМХО
2004-11-21 16:42
2004.12.05
Работая с текстовым файлом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский