使用面向对象编程的物理碰撞检测,使用一个对象的两个迭代。
2015-5-9 1:0:42
收藏:0
阅读:83
评论:1
我在尝试为游戏设计力学时遇到了理论写作障碍。基本上,我想要有两个圆形,它们会不断增长直到碰撞在一起,然后开始缩小,直到半径为0,然后重新开始增长,碰撞,以此类推。
我了解物理碰撞的工作原理,我了解如何使用圆形边界框来检测碰撞。但我不明白如何创建一个对象“circle”的两个迭代,并检测它们之间的碰撞。如何在函数中引用或检测两个不同的圆?我还希望建立可扩展性,以便可以让3、4或更多的圆相互作用。
如果这没有意义,下面是我正在使用的一些代码:
当屏幕被敲击时
circle = display.newCircle( event.x, event.y, 3)
end
display.currentStage:addEventListener( "tap", screenTap )
当屏幕被敲击时,将在那里出现一个半径为3的圆。我还没有完全弄清楚如何随着时间的推移增加半径,但这是我可以研究的东西。
这是Lua中的代码,但我不一定需要Lua代码答案。非常感谢您的任何指引或帮助。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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中获取用户配置主目录的跨平台方法
为什么要使用物理学来射击呢?
你至少有两个圆,这意味着(对于你查看的每一对圆),你有两个点 p1、p2和半径 r1、r2。
取这两个点的差异(pv = p2-p1)并计算这个向量(或“点差”)的长度:dist =(pv.x2+pv.y2)1/2。如果 r1 + r2 ≥ dist,则两个圆重叠,即发生碰撞。
现在看起来,你并没有可用的点或圆形表示,只有绘制在屏幕上的东西?或者你只有一个变量来存储最近的圆(并且忘记所有其他圆)?
如果是这样的话,那么你想做的事情是不可能实现的。你需要在某个地方存储坐标、半径和当前状态(增长还是缩小)的圆的信息,例如在一个数组中。
是完全没有意义的事情。迭代与循环有关。你可能混淆了层:你所谓的“对象”可能是一个类,你所谓的“迭代”可能是一个对象或一个类的实例?
你需要有圆的信息的某种表示(似乎你没有这个)。如果你有了这个,那么你只需查看存储信息的变量(或将你的信息传递给那个函数)。
因为我之前已经建立了这个功能,所以这里提供一些你可以根据自己的需求进行改编的代码:
SPEED = 40 circles = { } -- 每帧调用一次(dt 是自上一帧以来的时间) function love.update( dt ) -- 增长/缩小 for i, circle in ipairs( circles ) do local dir = circle.direction == "grow" and 1 or -1 circle.r = circle.r + SPEED*dir*dt if circle.r <= 0 then circle.r, circle.direction = -circle.r, "grow" end end -- 碰撞 for i, c1 in ipairs( circles ) do for j, c2 in ipairs( circles ) do if i ~= j then if c1.r + c2.r > ((c2.x-c1.x)^2 + (c2.y-c1.y)^2)^(1/2) then c1.direction, c2.direction = "shrink", "shrink" end end end end end -- 每帧调用一次,绘制圆 function love.draw( ) for i, circle in ipairs( circles ) do love.graphics.circle( "fill", circle.x, circle.y, circle.r ) end end -- 在点击时添加新圆 function love.mousepressed( x, y, btn ) circles[#circles+1] = { x = x, y = y, r = 0, direction = "grow" } end -- 按 ESC 键退出 keys = { escape = love.event.quit, } function love.keypressed( k ) local action = keys[k] if action then return action( k ) end end(如果你想直接运行这个:你需要先装好 love2d,然后将上述内容粘贴到一个名为
main.lua的文件中,在该目录下运行命令love .,或者将包含该文件夹的文件夹拖动到 love2d 的可执行程序上,等等。)