创建物理节点 II
在本教程中,我们将深入探讨物理节点的高级功能,包括:
- 感应器(Sensor)功能:不参与物理碰撞,但能检测物体进入或离开指定区域。
- 单向通过的平台:使用
onContactFilter
回调创建只允许物体从一个方向通过的平台。 - 获取物体碰撞的事件:如何监听并处理物体的碰撞事件。
通过以下示例代码和讲解,您将学会如何在 Dora SSR 中实现这些功能。
1. 创建物理世界
首先,初始化物理世界并设置基本参数。
- Lua
local Vec2 <const> = require("Vec2")
local PhysicsWorld <const> = require("PhysicsWorld")
local gravity <const> = Vec2(0, -10) -- 定义重力方向和大小
local world = PhysicsWorld() -- 创建物理世界
world:setShouldContact(0, 0, true) -- 设置组间碰撞规则
world.showDebug = true -- 显示调试信息
2. 创建感应器(Sensor)
感应器是一种特殊 的物理对象,它不参与碰撞,但可以检测其他物体进入或离开其区域。
2.1 定义感应器
- Lua
local BodyDef <const> = require("BodyDef")
-- 通过定义一组顶点来创建一个空心的圆形静态刚体
-- 用于限制本示例的活动区域
local terrainDef = BodyDef()
local count <const> = 50
local radius <const> = 300
local vertices = {}
for i = 1, count + 1 do
local angle = 2 * math.pi * i / count
vertices[i] = Vec2(radius * math.cos(angle), radius * math.sin(angle))
end
-- 添加闭合的链形状的静态刚体的定义
terrainDef:attachChain(vertices, 0.4, 0)
-- 添加一个圆形感应器区域,标签为数字 99
terrainDef:attachDiskSensor(99, Vec2(80, 80), 100)
attachChain
:创建一个由多个顶点组成的链形状。attachDiskSensor
:在指定位置添加一个圆形感应器,不参与物理碰撞,但可检测进入的物体。
2.2 监听感应器事件
- Lua
local terrain = Body(terrainDef, world)
terrain:onBodyEnter(function(other, sensorTag)
if sensorTag == 99 then
-- 当有物体进入感应器区域时触发
other.velocity = other.velocity * 0.5 -- 将物体速度减半
end
end)
terrain:addTo(world)