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

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

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

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

Ответ
 
Опции темы
Старый 15.01.2015, 02:48   #1
Petrofan
ПроЭктировщик
 
Аватар для Petrofan
 
Регистрация: 26.08.2008
Сообщений: 149
Написано 10 полезных сообщений
(для 18 пользователей)
Передвижение по сетке

Этот код что я написал работает криво, вернее движение дерганое из-за позиционирования но без него никак, нужно же как-то привязаться к виртуальной сетке. Помогите пожалуйста.

Function MoveToGrid(Entity=0,camera=0,A=17,B=31,C=30,D=32)
	
	Local SpeedMove#=.04
	Local SizeGrid=1
	Local DX#,DZ#
	
	;Обработка клавиш
	If KeyHit(A) And movez=0 Then movez=1:EZM= EntityZ(Entity)+SizeGrid:	timeout=1
	If KeyHit(B) And movez=0 Then movez=2:EZM=  EntityZ(Entity)-SizeGrid:	timeout=1
	If KeyHit(C) And movez=0 Then movez=3:EXM= EntityX(Entity)-SizeGrid:	timeout=1
	If KeyHit(D) And movez=0 Then movez=4:EXM=EntityX(Entity)+SizeGrid:	timeout=1
	
	If KeyDown(A) And movez=0 Then movez=1:EZM= EntityZ(Entity)+SizeGrid:	timeout=1
	If KeyDown(B) And movez=0 Then movez=2:EZM=  EntityZ(Entity)-SizeGrid:	timeout=1
	If KeyDown(C) And movez=0 Then movez=3:EXM= EntityX(Entity)-SizeGrid:	timeout=1
	If KeyDown(D) And movez=0 Then movez=4:EXM=EntityX(Entity)+SizeGrid:	timeout=1
	
	;Перемещение тела по сетке 
	If movez=1
		EZ=EntityZ(Entity)
		MoveEntity Entity,0,0,SpeedMove
		If EZ>=EZM
			PositionEntity Entity,EntityX(Entity),EntityY(Entity),EZM
			movez=0
		EndIf	
	EndIf
	;-----------------------------------------------------------------------------------------------
	If movez=2
		
		EZ=EntityZ(Entity)
		MoveEntity Entity,0,0,-SpeedMove
		If EZ<=EZM
			PositionEntity Entity,EntityX(Entity),EntityY(Entity),EZM
			movez=0
		EndIf	
	EndIf
	;-----------------------------------------------------------------------------------------------
	If movez=3
		
		EX=EntityX(Entity)
		MoveEntity Entity,-SpeedMove,0,0
		If EX<=EXM
			PositionEntity Entity,EXM,EntityY(Entity),EntityZ(Entity)
			movez=0
		EndIf	
	EndIf
	;-----------------------------------------------------------------------------------------------
	If movez=4
		
		EX=EntityX(Entity)
		MoveEntity Entity,SpeedMove,0,0
		If EX>=EXM
			PositionEntity Entity,EXM,EntityY(Entity),EntityZ(Entity)
			movez=0
		EndIf	
	EndIf
	timeout=timeout-0.01
	
	If timeout<0
		movez=0
		timeout=0
	EndIf
	;-----------------------------------------------------------------------------------------------
	;Смякчение движения камеры
	DX#=EntityX(Entity,True)-EntityX(camera,True)
	DZ#=EntityZ(Entity,True)-EntityZ(camera,True)
	TranslateEntity camera,DX*.05,0,DZ*.05
	
End Function
(Offline)
 
Ответить с цитированием
Старый 15.01.2015, 08:50   #2
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Передвижение по сетке

1. в параметре по умолчанию Entity=0 - лишнее, объект всегда должен передаваться, либо нужна проверка if(Entity = 0) then return
2.
Local SpeedMove#=.04
Local SizeGrid=
за 2 прохода ты сдвинешь объект на 2*0.4 = 0.8, а сетка 1.0 - зачем делать не кратное значение? шаг лучше делать GridSize/stepsCount.
также GridSize сделай дробным типом
3. перемещение камеры лучше убрать из этой функции, обрабатывать вне её
4. передача кодов клавиш движения в функцию, хоть и со значениями по умолчанию - тоже выглядит странно, можно сделать глобальные переменные KEY_LEFT KEY_RIGHT KEY_UP KEY_DOMW и их использовать, при необходимости их всегда можно будет переназначить
(Offline)
 
Ответить с цитированием
Старый 15.01.2015, 13:08   #3
Petrofan
ПроЭктировщик
 
Аватар для Petrofan
 
Регистрация: 26.08.2008
Сообщений: 149
Написано 10 полезных сообщений
(для 18 пользователей)
Ответ: Передвижение по сетке

Здесь нужно как-то отключить инерцию но как. И знаю что решение простое но никак не могу к нему прийти. Наверное нужно менять алгоритм.
(Offline)
 
Ответить с цитированием
Старый 15.01.2015, 14:00   #4
Petrofan
ПроЭктировщик
 
Аватар для Petrofan
 
Регистрация: 26.08.2008
Сообщений: 149
Написано 10 полезных сообщений
(для 18 пользователей)
Ответ: Передвижение по сетке

Все решил как сделать поправил код и изменил размер сетки с 1 на 10 и теперь при прибавлении 0,5 к движению тело двигается сугубо по сетке, но появился один небольшой недостаток теперь объекты уровня нужно будет скейлить до нужного размера.
(Offline)
 
Ответить с цитированием
Старый 15.01.2015, 14:09   #5
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: Передвижение по сетке

В AStar примере для Блитза есть такая функция:
Function MoveUnit(unit.unit)
	;Move the unit
	xVector# = unit\xPath-unit\xLoc
	yVector# = unit\yPath-unit\yLoc	
	angle# = ATan2(yVector#,xVector#)
	xSpeed# = Cos(angle)*unit\speed
	ySpeed# = Sin(angle)*unit\speed	
	If Abs(unit\xLoc - unit\xPath) < Abs(xSpeed)
		unit\xLoc = unit\xPath	
	Else	
		unit\xLoc = unit\xLoc + xSpeed 
	End If
	If Abs(unit\yLoc - unit\yPath) < Abs(ySpeed)
		unit\yLoc = unit\yPath
	Else										
		unit\yLoc = unit\yLoc + ySpeed	
	End If
	
End Function
Которая двигает объект по клеткам.
xPath и yPath это клетка на которую нужно передвинуться
xLoc и yLoc это клетка на которой находится объект (или наоборот. не помню уже)
unit\speed это скорость.
(Offline)
 
Ответить с цитированием
Старый 15.01.2015, 14:32   #6
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Передвижение по сетке

Сообщение от Petrofan Посмотреть сообщение
Все решил как сделать поправил код и изменил размер сетки с 1 на 10 и теперь при прибавлении 0,5 к движению тело двигается сугубо по сетке, но появился один небольшой недостаток теперь объекты уровня нужно будет скейлить до нужного размера.
можешь просто скорость сделать 0,05, тогда скейлить не придётся, всё будет плавно.

только нужно учесть ограничение кадров в секунду, чтобы на разных компах примерно одинаково работало, т.е. не со скоростью света на мощных.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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