forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Передвижение по сетке (http://forum.boolean.name/showthread.php?t=19639)

Petrofan 15.01.2015 02:48

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

Код:

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


Жека 15.01.2015 08:50

Ответ: Передвижение по сетке
 
1. в параметре по умолчанию Entity=0 - лишнее, объект всегда должен передаваться, либо нужна проверка if(Entity = 0) then return
2.
PHP код:

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 и их использовать, при необходимости их всегда можно будет переназначить

Petrofan 15.01.2015 13:08

Ответ: Передвижение по сетке
 
Здесь нужно как-то отключить инерцию но как. И знаю что решение простое но никак не могу к нему прийти. Наверное нужно менять алгоритм.

Petrofan 15.01.2015 14:00

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

Nex 15.01.2015 14:09

Ответ: Передвижение по сетке
 
В 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 это скорость.

Жека 15.01.2015 14:32

Ответ: Передвижение по сетке
 
Цитата:

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

можешь просто скорость сделать 0,05, тогда скейлить не придётся, всё будет плавно.

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


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot