Corona/Box2D 检测与静态非移动对象的碰撞。
2011-10-8 14:47:42
收藏:0
阅读:125
评论:3
在屏幕上,我有一个简单的圆形对象,静态不动。然后用户可以拖放一条直线。如果直线穿过圆形,我希望发生碰撞事件。但似乎除非一个对象在移动,否则永远无法检测到碰撞。如何在绘制直线时检测碰撞?
碰撞事件
function onHit(e)
print("hit");
end
Runtime:addEventListener("collision", onHit)
触摸事件
local startX = 0;
local startY = 0;
local endX = 0;
local endY = 0;
function onTouch(e)
if(e.phase == "began") then
startX = e.x
startY = e.y
elseif(e.phase == "moved") then
endX = e.x
endY = e.y
elseif(e.phase == "ended") then
local line = display.newLine(startX, startY, endX, endY)
line:setColor(100, 100, 100)
line.width = 2
physics.addBody(line, "static", { })
end
end
Runtime:addEventListener("touch", onTouch)
创建圆形
local c = display.newCircle(50, 50, 24)
physics.addBody(c, "static", { radius = 24 })
原文链接 https://stackoverflow.com/questions/7697555
点赞
stackoverflow用户3503986
当你松开鼠标时进行一次光线投射(raycast)。通过光线投射回调函数,你可以保持两个物体的静止,并且知道它们的交点。
(我知道这篇文章已经有点过时了,但它是我谷歌搜索的第一个结果,而且我认为它是错误的。)
2015-05-08 12:10:40
stackoverflow用户9157296
将身体类型设置为运动学,将其设置为传感器,并在每帧更新其位置到与其绑定的实体。与静态不同,运动学可以与静态相互作用。
2021-12-20 21:32:32
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
这一页来自 Corona SDK 文档,大约在页面的一半描述了
bodyType
属性。 在描述 “静态” 物体时,它说(我加粗了):这意味着两个物体中有一个必须是
static
以外的。这里有个主意,虽然我自己没有尝试过:(见下面的 更新)创建线时首先将其设置为
dynamic
。使用timer.performWithDelay
函数稍后将其设置为static
。如果在此期间发生碰撞事件,则您将知道您有重叠,并可以立即将bodyType
设置回static
。如果没有发生碰撞事件,则在延迟的程序中bodyType
仍将是dynamic
,您将知道没有重叠。在这种情况下,您仍需要在延迟程序中将线设置为static
。更新:使用您的代码作为起点尝试了此操作
我更改了碰撞事件,以始终将两个物体的
bodyType
设置为静态:function onHit(e) print("hit") e.object1.bodyType = "static" e.object2.bodyType = "static" end
然后,我更改了线的
addBody
调用,将其作为dynamic
身体添加,并设置新的代码以设置timer.PerformWithDelay
函数来检查一段时间后:physics.addBody(line, "dynamic", { }) timer.performWithDelay(10, function() if line.bodyType == "dynamic" then print ("NO OVERLAP") line.bodyType = "static" end end)
结果不幸的是有些混乱。 它大多数情况下工作,也许有 95%,但有时会失败,例如从圆圈外部开始、从圆圈内部结束的线,这应该是重叠的,但有时会被报告为空重叠。我无法弄清楚为什么。我发帖是希望它能够帮助您,并希望有人能够找出不一致的行为并教育我们两个。
如果不行,您可以添加另一个检查来检查线的任一端点是否距中心的半径距离更近。这将使事情运作起来,但我认为它错过了让物理引擎工作的重点。
无论如何,祝您好运!