![](images/chestnut/misc/left.gif) |
3D-программирование Вопросы, касающиеся программирования 3D мира |
15.01.2015, 02:48
|
#1
|
ПроЭктировщик
Регистрация: 26.08.2008
Сообщений: 149
Написано 10 полезных сообщений (для 18 пользователей)
|
Передвижение по сетке
Этот код что я написал работает криво, вернее движение дерганое из-за позиционирования но без него никак, нужно же как-то привязаться к виртуальной сетке. Помогите пожалуйста.
![](images/chestnut/misc/code_html.gif)
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=1
за 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
|
ПроЭктировщик
Регистрация: 26.08.2008
Сообщений: 149
Написано 10 полезных сообщений (для 18 пользователей)
|
Ответ: Передвижение по сетке
Здесь нужно как-то отключить инерцию но как. И знаю что решение простое но никак не могу к нему прийти. Наверное нужно менять алгоритм.
|
(Offline)
|
|
15.01.2015, 14:00
|
#4
|
ПроЭктировщик
Регистрация: 26.08.2008
Сообщений: 149
Написано 10 полезных сообщений (для 18 пользователей)
|
Ответ: Передвижение по сетке
Все решил как сделать поправил код и изменил размер сетки с 1 на 10 и теперь при прибавлении 0,5 к движению тело двигается сугубо по сетке, но появился один небольшой недостаток теперь объекты уровня нужно будет скейлить до нужного размера.
|
(Offline)
|
|
15.01.2015, 14:09
|
#5
|
Гигант индустрии
Регистрация: 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)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:06.
|