关于游戏中的碰撞检测 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codecrash
V2EX    问与答

关于游戏中的碰撞检测

  •  
  •   codecrash 2016 年 6 月 9 日 3356 次点击
    这是一个创建于 3536 天前的主题,其中的信息可能已经有所发展或是发生改变。

    2d 游戏,然后用 png 图片作为游戏素材,现在的方案是检测两个矩形重叠的部分,查看其中有没有黑色的像素点 但是这么做并不精确 https://i.imgur.com/GU3jeEt.png 会出现如图情况,明明没有撞到的因为右下角出现了黑块就认为相撞了,请问有什么好的解决方案来精确的确定两个物体是否相撞吗?

    19 条回复    2016-06-09 20:23:01 +08:00
    zmj1316
        1
    zmj1316  
       2016 年 6 月 9 日   1
    细分这个矩形,或者更彻底的搞个包围盒什么的?
    wodesuck
        2
    wodesuck  
       2016 年 6 月 9 日   1
    不是很懂问题是什么……难道不是应该把图片右下角的黑块扣掉吗

    碰撞检测一般就是八分树粗略找一下包围盒相交的,然后再细判
    codecrash
        3
    codecrash  
    OP
       2016 年 6 月 9 日
    @wodesuck 这是我检测到碰撞的图,也就是当前判定恐龙和右下角的那个黑块相撞了,然而事实上并没有
    codecrash
        4
    codecrash  
    OP
       2016 年 6 月 9 日
    @wodesuck 为什么要抠掉
    wodesuck
        5
    wodesuck  
       2016 年 6 月 9 日
    @codecrash 所以你对“碰撞”的定义是什么
    codecrash
        6
    codecrash  
    OP
       2016 年 6 月 9 日
    @wodesuck 两个不规则的物体在平面上有相交的部分
    wodesuck
        7
    wodesuck  
       2016 年 6 月 9 日
    @codecrash 那右下角那个黑块算不算物体的一部分呢,程序不能自己知道吧
    xmbaozi
        8
    xmbaozi  
       2016 年 6 月 9 日 via Android
    矩形直接根据坐标,长宽判断就好啦
    codecrash
        9
    codecrash  
    OP
       2016 年 6 月 9 日
    @xmbaozi 并不是简单的矩形,这个矩形并没有被全部占满,有一部分是透明的,也就是并不被物体占据,不应该简单将其处理为物体的一部分
    codecrash
        10
    codecrash  
    OP
       2016 年 6 月 9 日
    @zmj1316 可以稍微具体一点,或者有这方面的资料吗?
    jerain
        11
    jerain  
       2016 年 6 月 9 日   1
    我用 cocos 的时候,这家公司的工具是很不错的
    https://www.codeandweb.com
    bingwenshi
        12
    bingwenshi  
       2016 年 6 月 9 日   1
    如果是这个小龙的话,可以用圆形来判断吧? 肯定没法根据像素来判断啊,那计算量太重了
    codecrash
        13
    codecrash  
    OP
       2016 年 6 月 9 日
    @bingwenshi 怎么说?
    likai
        14
    strong>likai  
       2016 年 6 月 9 日
    要精确。碰撞钢体最好用不规则的吧。直接一个圆形或者四方形都不那么精解确
    ZyZyZzz
        15
    ZyZyZzz  
       2016 年 6 月 9 日
    你这是要做像素级别的精细碰撞?
    如果是的话,好奇为什么会有这种需求
    codecrash
        16
    codecrash  
    OP
       2016 年 6 月 9 日
    @likai 是不规则的呀,我希望的就是不规则的
    zmj1316
        17
    zmj1316  
       2016 年 6 月 9 日   1
    @codecrash 你现在就是用一个大的矩形表示这个物体,所以导致了误差,你可以把这个物体用多个更小的矩形表示,比如做成一个倒 L 形上下两个矩形,最极限的方式就是一个像素点一个矩形,这样最精确但是开销也大
    codecrash
        18
    codecrash  
    OP
       2016 年 6 月 9 日
    @ZyZyZzz 因为想模仿 chrome 里面的那个小恐龙的游戏,但是不知道要怎么处理碰撞
    ZyZyZzz
        19
    ZyZyZzz  
       2016 年 6 月 9 日   1
    @codecrash 然而仔细看, chrome 的小恐龙游戏也没到逐像素级别的

    如果非要逐像素,更建议仅对恐龙检测边缘的一圈像素是否进入了其他物体的包围盒
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3527 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 08:00 PVG 16:00 LAX 00:00 JFK 03:00
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86