建议首先熟练掌握 Defold 中常规输入的消息处理方式, 例如输入消息获取以及脚本间输入消息广播顺序等. 关于输入系统详情请见 输入系统教程.
鼠标触发器可以绑定鼠标按键和滚轮输入到游戏功能的映射.
鼠标按键输入 MOUSE_BUTTON_LEFT
, MOUSE_BUTTON_RIGHT
和 MOUSE_BUTTON_MIDDLE
等同于 MOUSE_BUTTON_1
, MOUSE_BUTTON_2
和 MOUSE_BUTTON_3
.
下面的例子中使用了上图的映射绑定配置. 映射与命名可以根据项目需要自由设置.
鼠标键可以生成按下, 抬起和连按消息. 获取鼠标键消息的方法如下 (按下和抬起):
function on_input(self, action_id, action)
if action_id == hash("mouse_button_left") then
if action.pressed then
-- 鼠标左键按下
elseif action.released then
-- 鼠标左键抬起
end
end
end
单点触摸也会触发 MOUSE_BUTTON_LEFT
(或 MOUSE_BUTTON_1
) 事件.
鼠标滚轮可以生成滚动消息. 如果 action.value
为 1
代表转动, 为 0
代表不转动. (滚轮转动被当作一种按钮消息来处理. Defold 目前不支持触摸板上的滚轮输入.)
function on_input(self, action_id, action)
if action_id == hash("mouse_wheel_up") then
if action.value == 1 then
-- 鼠标滚轮向上滚动
end
end
end
鼠标移动消息有点特别. 如果输入绑定表里没有鼠标的话, 鼠标移动事件也会被丢弃.
但是不用特地为了鼠标移动配置绑定, 因为鼠标移动时会自动生成事件, 其中 action_id
为 nil
并且 action
表保存了鼠标位置与移动距离.
function on_input(self, action_id, action)
if action.x and action.y then
-- 游戏对象跟随鼠标/触摸
local pos = vmath.vector3(action.x, action.y, 0)
go.set_position(pos)
end
end
iOS 和 Android 设备上运行的原生应用与HTML5应用都支持单点和多点触摸输入.
单点触摸不用在触摸映射部分进行设置. 而在 鼠标映射设置了 MOUSE_BUTTON_LEFT
或称 MOUSE_BUTTON_1
之后自行配置.
多点触摸在输入映射表里叫做 touch
. 其元素索引为数字 1
–N
, 这里 N
是触摸点的编号. 其元素值为触摸点数据:
function on_input(self, action_id, action)
if action_id == hash("touch_multi") then
-- 在触摸点的位置生成游戏对象
for i, touchdata in ipairs(action.touch) do
local pos = vmath.vector3(touchdata.x, touchdata.y, 0)
factory.create("#factory", pos)
end
end
end
多点触摸动作名不能与 MOUSE_BUTTON_LEFT
或 MOUSE_BUTTON_1
的动作名重名. 否则的话将导致事件覆盖, 就监听不到单点触摸事件了.
公共资源 Defold 输入手柄 可以用来在多点触摸屏上模拟手柄输入.
游戏里经常可见拾取操作. 可能是玩家点击界面按钮或者战略游戏里玩家选取一个作战单位, RPG 游戏点取宝箱等等. 不同组件有不同解决方法.
界面有一个 gui.pick_node(node, x, y)
函数来判断点击输入是否处在某个节点范围之内. 详见 API 文档, 指针悬停示例 或者 按钮示例.
游戏对象检测有点复杂, 因为摄像机移动和渲染脚本映射都会影响位置计算. 方法主要分为两种:
公共资源 Defold 输入库 是一个开箱即用的输入检测库.
无论哪种方案都必须将鼠标手点选的屏幕坐标转换成游戏对象的世界坐标. 实现思路如下:
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB