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

Вниз

Хитрый вопросец: создание поворачиваемого прицела   Найти похожие ветки 

 
greenrul ©   (2003-02-13 10:16) [0]

Есть юнит, и при нажатии Влево/Вправо, его прицел должен по/против часовой стрелки ездить. Но если вставлять проверку нажатий в TMyUnit.DoMove, то прицел будет вертеться слишком быстро!
Как его замедлить? Пробовал делать отдельный таймер, но он слишком сильно затормаживает...

Текущий код:
Procedure TSnarad.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if (isLeft in MainForm.DXInput1.States) then Dec(pusk_angle);
if (isRight in MainForm.DXInput1.States) then Inc(pusk_angle);
<...>
y:=SelectedUnit.Y+Weaponz[SelectedWeapon].speed*sin(DegToRad(pusk_angle))*(time/speed) + g*(((time*time)/(speed*speed))/2);
x:=SelectedUnit.x+Weaponz[SelectedWeapon].speed*cos(DegToRad(pusk_angle))*(time/speed);
end;


 
pasha676   (2003-02-13 10:27) [1]

Вообще-то что то мало что из кода понял. Но вообщем надо

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

Что непонятно спрашивай.


 
greenrul ©   (2003-02-13 14:12) [2]

если честно я вообще ничего тут не понял...
я ожидал рекомендации по коду - я раньше эту же функцию сделал потормознутей %), только забыл как это сделал


 
Михаил   (2003-02-13 15:05) [3]

На самом деле pasha676 дал дельный совет в непонятной форме(никто не знает, причем тут джойстик, коэффициенты).

Суть в том, что вместо
if (isLeft in MainForm.DXInput1.States) then Dec(pusk_angle);
if (isRight in MainForm.DXInput1.States) then Inc(pusk_angle);
надо писать
if (isLeft in MainForm.DxInput1.States) then povorot := 0.01;
if (isLeft in MainForm.DxInput1.States) then povorot := -0.01;

а перед прорисовкой
pusk_angle := pusk_angle + povorot;

Другая простая идея(перед этим я какую-то чушь порол): сделать угол дробным.


 
Михаил   (2003-02-13 15:08) [4]

Это все работает.
Зайди на www.mik-korobov.narod.ru
игрушка "Авиация" там сделана по этому принципу.


 
pasha676   (2003-02-13 15:24) [5]

2Михаил

Я просто имел в виду примерно следующее

if (isLeft in MainForm.DxInput1.States) then
( 0.01<собственно и есть коэффицент>) 2Михаил

Я просто имел в виду примерно следующее

if (isLeft in MainForm.DxInput1.States) then
povorot := (0.01<собственно и есть коэффицент>)*KWeapon
<коэффицент подвижности объекта>*DxInput1.States.X<вроде так там - если надо зависимость от джойстика>;

если не умножать на достаточно маленькие коэффиценты - то может происходить либо быстрое прибавление (если отрисовка ведеться часто) либо вообще прибавление в радианах. А 1 радиан - это уже до фига градусов.



 
Михаил ©   (2003-02-13 15:39) [6]

Понятно.



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

Текущий архив: 2003.08.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
14-45077
Viktor Kushnir
2003-07-27 08:17
2003.08.14
Delphi 5 Service Packs - Где найти?


14-45098
Григорий
2003-06-16 16:06
2003.08.14
Авторизация в IdHTTP


14-45008
Шишкин Илья
2003-07-23 10:03
2003.08.14
Помогите найти компонент для работы с mp3


14-45075
AdilAliev
2003-07-27 04:25
2003.08.14
WinAPI functions


14-45043
Начитанный
2003-07-28 13:23
2003.08.14
SQL - это язык программирования?