Godot引擎中控制移动的几种方式
1。我们要讲什么?
本篇我们要梳理一下游戏中常见的几种角色移动的控制方式,比如:
使用键盘或手柄:
- 八个方向移动
- 旋转(左右键控制) + 移动(上下键控制)
使用鼠标:
- 自由移动(点击位置)
- 旋转(始终朝向鼠标) + 移动(上下键控制)
2。准备一个简单的演示
本篇为了聚焦我们要研究的问题,我们不再给角色加入动画等其它效果,仅使用godot引擎的图标作为精灵,之后的一切控制演示都由它承担。
- 首先建立一个以KinematicBody2D为载体的精灵,其包含的节点和层级关系如上图。
- KinematicBody2D是一个运动学性质的节点。(在另一篇文章里会详细说)
- Sprite是一个精灵节点,把godot的图标(icon.png)拖到它的Texture属性上。
- CollisionShape2D是一个碰撞检测盒,我们给了它一个矩形形状。本篇文章中可以不使用。(加上是为了消除警告)
- 给KinematicBody2D节点附加一个脚本。(选中此节点,然后点击右上角的
图标) - 最后我们可以看到如下效果,因为精灵默认处于(0,0)处,所以会展示在窗口的角落。因为我们脚本里什么都没做,所以图标也只是静静的躺在那里。
3。配置输入映射(Input Map)
输入映射可以理解成什么东西呢?它相当于提前把我们可能按的键,比如键盘的W A S D、手柄的某个键或鼠标的某个键绑定到一个字符串,而godot提供了一个方便的函数,我们只要把我们绑定的字符串提供给这个函数,根据返回值真假(true or false)就可以知道与这个字符串绑定的的键是否被按下。
- 找到配置的对话框:Project -> Project Settings… -> Input Map选项卡
- 从上面的图中可以知道,我们配置了5个映射关系:
- 好,现在如果我们要检测上、下、左、右键是否有按下,我们可能写出这样的代码:
func get_input():
...
if Input.is_action_pressed('move_right'):
velocity.x += 1
if Input.is_action_pressed('move_left'):
velocity.x -= 1
if Input.is_action_pressed('move_down'):
velocity.y += 1
if Input.is_action_pressed('move_up'):
velocity.y -= 1
...
- 下面是输入映射的基本操作:在Action文本框中输入你想绑定的字符串名字,一般是提示性的(比如:move_left、attack等等);点击Add按钮后,你要绑定的字符串会出现在下面的列表里;最后在你的字符串右边,点击"+"号来添加你要将哪些键映射到这个字符串。
- 能不能对godot所有支持的键做一个基本的介绍,比如:
- 其中Joy Axis(轴)的标记会多一点,因为一般手柄上会有左右两个摇杆,所以:0表示左摇杆横轴,1表示左摇杆纵轴,2表示右摇杆横轴,3表示右摇杆纵轴;“+” 表示正半轴,"-"表示负半轴;这两组标记组合一下得到下面的所有输入:
- 复习一遍。所以,下面这个映射的含义是:当第0号玩家(Device x表示第x号玩家,用于多个人玩的时候)的手柄的左摇杆的横轴推向正半轴的时候,表示它要往右移动(呼~)