Главная страница
    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.033 c
4-1098259395
snake1977
2004-10-20 12:03
2004.12.05
Версия файла


14-1099305727
Юрий Федоров
2004-11-01 13:42
2004.12.05
Вакансия в москве


6-1091286304
Koala
2004-07-31 19:05
2004.12.05
Как програмно послать в сеть сообщение....


14-1100779938
Baks
2004-11-18 15:12
2004.12.05
Кнопки


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