Главная страница
    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.038 c
3-1099574728
DelphiN!
2004-11-04 16:25
2004.12.05
Глюки фильтра TClientDataSet


1-1100687999
Chuk
2004-11-17 13:39
2004.12.05
Туплю по заголовку формы


3-1099645317
Pavor
2004-11-05 12:01
2004.12.05
Как побороть "Directory is controlled by other .NET file"?


4-1098466459
Dot
2004-10-22 21:34
2004.12.05
изменить байт


3-1099915106
SergP
2004-11-08 14:58
2004.12.05
Как узнать находится ли dataset в режиме insert или edit?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский