大家都玩过战棋类的游戏,角色基于网格进行运动,这里我们先创建一个64*64的网格,也可以是tilemap:
func _draw():
for i in 20:
draw_line(Vector2(i*64,0),Vector2(i*64,1500),Color.black,3,true)
draw_line(Vector2(0,i*64),Vector2(1500,i*64),Color.black,3,true)
效果如下:

创建一只精灵,以及精灵的初始位置:

var tile_size = 64
func _ready():
position = position.snapped(Vector2.ONE \* tile_size)
position += Vector2.ONE \* tile_size/2
效果如下:

监听按键以及每次移动一个tilesize大小的距离:
var inputs = {"ui_right": Vector2.RIGHT,"ui_left": Vector2.LEFT,"ui_up": Vector2.UP,"ui_down": Vector2.DOWN}
func _unhandled_input(event):
for dir in inputs.keys():
if event.is_action_pressed(dir):
move(dir)
func move(dir):
position += inputs[dir] \* tile_size
添加射线用于碰撞检测:
onready var ray = $RayCast2D
func move(dir):
ray.cast_to = inputs[dir] \* tile_size
ray.force_raycast_update()
if !ray.is_colliding():
position += inputs[dir] \* tile_size
效果截图:

试玩(小键盘上下左右移动):