Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.034 c
1-1100777872
termit
2004-11-18 14:37
2004.12.05
как удалить запись из файла?


14-1100684389
nookie84
2004-11-17 12:39
2004.12.05
ссылки


8-1094308103
AndersoNRules
2004-09-04 18:28
2004.12.05
Flash &amp; Delphi


14-1100534104
KilkennyCat
2004-11-15 18:55
2004.12.05
Завтра в Петербургском СКК начинают работать несколько выставок.


1-1100852111
Torin
2004-11-19 11:15
2004.12.05
Чтение/запись строк в поток