Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 17.07.2013, 23:17   #1
jekardo666
AnyKey`щик
 
Регистрация: 12.07.2013
Сообщений: 2
Написано 0 полезных сообщений
(для 0 пользователей)
Вопрос Вопрос. Плавное движение VTOL

Всем привет.

Решил написать полетушки на 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: Зачем я все это сюда пишу? Вдруг кому будет интересно, тем же самым новичкам

Последний раз редактировалось jekardo666, 23.07.2013 в 14:45. Причина: обновление поста
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 03:22.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com