Всем привет.
Решил написать полетушки на VTOL'е. И сразу начал интересовать такой вопрос: как правильно будет написать плавное увеличение высоты и скорости при нажатии кнопки? Сам принцип я понимаю, но реализовать не могу из-за плохого знания языка.
В общем, принцип таков: изначально VTOL находится уже в воздухе, его ускорение равно 0. При нажатии кнопки Shift (взлет) происходит увеличение высоты, следовательно ему придается некое ускорение. VTOL начинает плавно подниматься вверх. При отпускании кнопки VTOL еще некоторое время движется по инерции, пока его ускорение вновь не станет равным 0.
Я думаю так: ускорение А = 0. При зажатии кнопки
постепенно прибавлять к ускорению А дельту А до определенного предела. После отпускания кнопки
из получившегося значения А постепенно вычитать дельту А до нуля. Интересует выделенное. Не могу понять как делать
Помогите пожалуйста написать код для всего этого.
UPD: Итак, поборов свою лень, я таки придумал способ, НО сразу же уперся в другую стену. Вот кусок кода:
;1. Движение VTOL
If z_thrust <> 0 xMoveEntity VTOL,0,0,z_thrust# ; Назад S
If xKeyDown(17) xMoveEntity VTOL ,0,0,-z_thrust ; Вперед W
If xKeyDown(16) xMoveEntity VTOL,.05,0,0 ; Влево Q
If xKeyDown(18) xMoveEntity VTOL ,-.05,0,0 ; Вправо E
;2. Изменение высоты VTOLa
If xKeyDown(42) xMoveEntity VTOL,0,.04,0 ;Подъем
If xKeyDown (29) xMoveEntity VTOL,0,-.04,0 ;Спуск
;3. Режим сетки
If xKeyHit(59) xWireframe 1
If xKeyHit(60) xWireframe 0
;4. Ускорение
If xKeyDown (31) z_thrust# = z_thrust+.0006 ;Если вперед, то увеличение тяги
If z_thrust# > .05 z_thrust# = .05
If z_thrust# < -.05 z_thrust# = -.05
If Not xKeyDown(31) z_thrust# = z_thrust -.0006 ;Если ничего не нажато - уменьшение тяги
If z_thrust# < 0 z_thrust# = 0
Подчеркнуты те участки кода, которые я изменил или добавил. Так вот, в чем проблема: движение назад-то мы сделали, а вперед не получается, ибо
If z_thrust# < 0 z_thrust# = 0.
Т.е отрицательное ускорение невозможно. Я думаю, что исправить надо
If z_thrust <> 0 xMoveEntity VTOL,0,0,z_thrust#. Подтолкните в правильное русло
UPD 2: Итак, обновление. Код:
If z_thrust <> 0 xMoveEntity VTOL,0,0,z_thrust# ; Движение вперед - назад
If y_thrust <> 0 xMoveEntity VTOL,0,y_thrust#,0 ;Движение по оси Y (ВВЕРХ-ВНИЗ)
If xKeyDown (31) z_thrust# = z_thrust+.0006 ;Если назад, то увеличение тяги
If z_thrust# > .05 z_thrust# = .05
If z_thrust# < -.05 z_thrust# = -.05
If Not xKeyDown(31) z_thrust# = z_thrust -.0006 ;Если ничего не нажато - уменьшение ускорения
If Not xKeyDown (17)
If z_thrust# < zero z_thrust# = 0
EndIf
If xKeyDown(17) z_thrust# = z_thrust -.0006 ; Если вперед, то увеличение тяги
If xKeyDown(42) y_thrust# = y_thrust + .0004 ; Если вверх - увеличение тяги
If y_thrust# > .04 y_thrust# = .04 ;Проверка условий
If y_thrust# < -0.4 y_thrust# = -.04
If xKeyDown(29) y_thrust# = y_thrust - .0004 ;Если вниз - уменьшение тяги
If Not xKeyDown(42) y_thrust# = y_thrust - .0004 ;Если ничего не нажато - уменьшение ускорения
If y_thrust < zero y_thrust = 0
Что подчеркнуто - либо новое, либо изменено. В чем дело: при движении назад все отлично: плавное ускорение, плавное замедление. А вот при движении вперед все интересней: ускорение плавное, а вот замедление резкое. Все из-за
If Not xKeyDown (17)
If z_thrust# < zero z_thrust# = 0
EndIf
Пока думаю, чем можно заменить или исправить
UPD 2: Так ничего мне в голову и не пришло. Не понял я, что можно сделать с одной переменной, поэтому расписал для каждого направления по переменной.
Код:
;1. Движение VTOL
If z_thrust_fwrd# <> 0 xMoveEntity VTOL,0,0,z_thrust_fwrd# ; Движение вперед
If z_thrust_back# <> 0 xMoveEntity VTOL,0,0, z_thrust_back#
If x_thrust_left# <> 0 xMoveEntity VTOL,x_thrust_left#,0,0 ; Влево Q
If x_thrust_right# <> 0xMoveEntity VTOL ,x_thrust_right#,0,0 ; Вправо E
If left_turn# <> 0 xTurnEntity VTOL,0,left_turn# ,0 ;Поворот влево А
If right_turn# <> 0 xTurnEntity VTOL,0,right_turn# ,0 ;Поворот вправо D
;2. Изменение высоты VTOLa
If y_thrust_up# <> 0 xMoveEntity VTOL,0,y_thrust_up#,0 ;Движение по оси Y (ВВЕРХ-ВНИЗ)
If y_thrust_down# <> 0 xMoveEntity VTOL,0,y_thrust_down#,0
;3. Ускорение
; Ускорение вперед
If xKeyDown(17) z_thrust_fwrd# = z_thrust_fwrd + .0006 ; Если нажата кнопка - увеличить скорость движения вперед
If xKeyDown(17) z_thrust_back# = z_thrust_back + .0006 ; Если нажата кнопка - уменьшать скорость движения назад
If Not xKeyDown(17) z_thrust_fwrd#= z_thrust_fwrd - .0006 ; Если кнопка не нажата - уменьшать скорость движения вперед
If z_thrust_fwrd# > .5 z_thrust_fwrd = .5 ; Проверка условий: макс. скорость
If z_thrust_fwrd# < 0 z_thrust_fwrd = 0 ; мин. скорость
; Ускорение назад
If xKeyDown(31) z_thrust_back# = z_thrust_back - .0006
If xKeyDown(31) z_thrust_fwrd# = z_thrust_fwrd - .0006
If Not xKeyDown(31) z_thrust_back#= z_thrust_back + .0006
If z_thrust_back# < -.5 z_thrust_back = -.5
If z_thrust_back# > 0 z_thrust_back = 0
; Ускорение вверх
If xKeyDown(42) y_thrust_up# = y_thrust_up + .0006
If xKeyDown(42) y_thrust_down# = y_thrust_down - .0006
If Not xKeyDown(42) y_thrust_up#= y_thrust_up - .0006
If y_thrust_up# > .03 y_thrust_up = .03
If y_thrust_up# < 0 y_thrust_up = 0
; Ускорение вниз
If xKeyDown(29) y_thrust_down# = y_thrust_down# - .0006
If xKeyDown(29) y_thrust_up# = y_thrust_up# - .0006
If Not xKeyDown(29) y_thrust_down#= y_thrust_down# + .0006
If y_thrust_down# < -.03 y_thrust_down# = -.03
If y_thrust_down# > 0 y_thrust_down# = 0
; Ускорение влево
If xKeyDown(16) x_thrust_left# = x_thrust_left# - .0025
If xKeyDown(16) x_thrust_right# = x_thrust_right# - .0009
If Not xKeyDown(16) x_thrust_left#= x_thrust_left# + .0025
If x_thrust_left# < -.03 x_thrust_left# = -.03
If x_thrust_left# > 0 x_thrust_left# = 0
; Ускорение вправо
If xKeyDown(18) x_thrust_right# = x_thrust_right# + .0025
If xKeyDown(18) x_thrust_left# = x_thrust_left# + .0009
If Not xKeyDown(18) x_thrust_right#= x_thrust_right# - .0025
If x_thrust_right# > .03 x_thrust_right# = .03
If x_thrust_right# < 0 x_thrust_right# = 0
; Поворот влево
If xKeyDown(30) left_turn# = left_turn# + .35
If xKeyDown(30) right_turn# = right_turn# + .35
If Not xKeyDown(30) left_turn# = left_turn# - .35
If left_turn# > .5 left_turn# = .5
If left_turn# < 0 left_turn# = 0
; Поворот вправо
If xKeyDown(32) right_turn# = right_turn# - .35
If xKeyDown(32) left_turn# = left_turn# - .35
If Not xKeyDown(32) right_turn# = right_turn# + .35
If right_turn# < -.5 right_turn# = -.5
If right_turn# > 0 right_turn# = 0
Конечный результат:
здесь (файлообменник RGhost)
Да, знаю, способ далеко не идеальный. Но в программировании я абсолютный новичок, могу и ошибаться)
P.S: Зачем я все это сюда пишу? Вдруг кому будет интересно, тем же самым новичкам