基于cocos2d-x对俯视角游戏碰撞检测及碰撞处理的探究

本文详细探讨了在基于cocos2d-x的俯视角游戏中,如何进行碰撞检测和处理。作者通过AABB-AABB碰撞盒的方法进行碰撞检测,并提出一种处理碰撞的思路,通过调整玩家位置实现更真实的碰撞反馈。文章还分享了实际测试过程和处理要点,包括确定碰撞方向、判断撞击方位以及注意事项。
摘要由CSDN通过智能技术生成

作者:i_dovelemon
来源:CSDN
日期:2015/2/10
主题:俯视角游戏,碰撞检测,碰撞处理

引言

对于任何游戏来说,碰撞检测和碰撞处理都是非常重要的内容。最近自己在编写一个俯视角的类rouge-like的游戏。游戏基于网格来设计地图,在游戏设计过程中,尤其是在设计游戏的碰撞系统的时候遇到了麻烦。经过多方面的努力,终于解决了问题,现在就此问题,记录下我的心得和体会。

碰撞检测

在我的游戏中,大部分的时候都是使用AABB-AABB这种碰撞盒来进行碰撞。对于此种的碰撞体,在前面的文章中也讲述过了,有很多的描述方式。我选用的是Max-Min的描述方式,即使用一个最大点Max和一个最小点Min。这样对于两个AABB盒,我们只要简单的使用下面的代码就能够判断是否发生碰撞了:

bool AABB::intersectWithAABB(AABB aabb)
{
    if(aabb.vMax.x < m_vMin.x) return false ;
    if(aabb.vMax.y < m_vMin.y) return false ;
    if(aabb.vMin.x > m_vMax.x) return false ;
    if(aabb.vMin.y > m_vMax.y) return false ;
    return true ;
}// end for intersectWithAABB

对于AABB碰撞盒来说,这种检测方式最简单,也最实用。

碰撞处理

思路由来

正如大家看到的一样,这样的游戏碰撞检测是非常容易的,我在编写的时候,也是如上所示那样编写的。但是,我在进行碰撞处理的时候,即发生玩家与障碍物发生碰撞之后,该如何反应上面遇到了问题。我原先的方案在实际运行之后,发现玩家会在地图上乱窜,完全没有碰到障碍物的那种感觉。所以为了更好的研究这个问题的解决方案,我另外开辟了一个应用程序来专门对这个问题进行了研究。
那么,该使用什么样的处理方法才能够很合适的碰撞了?在考虑这个问题的时候,我发现在我以前写的游戏Demo中,我总会给游戏加上一个世界的边界,大多时候是一个矩形来完成的。我控制一个矩形在这个大的矩形世界里面到处移动。当移动到边缘的时候,我会检测它是否超出了大的矩形世界的边缘,然后强制的将玩家的位置设置到刚好和矩形世界边缘触碰的位置处。而在使用这样的方法之后,发现我们控制的小矩形能够很好的与矩形世界进行碰撞反应。

实际测试

在明白了上面的那个处理方法能够带来比较好的效果之后,我就想:能不能使用同样的思路,在我的游戏中,当我们检测到碰撞的时候,只要强制的将玩家放在一个刚好触碰的障碍物的位置就可以了。为此,我马上在新开辟的应用程序中编写了如下的代码:

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

class HelloWorld : public cocos2d::CCLayer
{
public:
    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();  

    // there's no 'id' in cpp, so we recommand to return the exactly class pointer
    static cocos2d::CCScene* scene();

    // a selector callback
    void menuCloseCallback(CCObject* pSender);

    // implement the "static node()" method manually
    CREATE_FUNC(HelloWorld);

    //
    void update(float dt) ;

    void collisionTest1();
    void collision();
private:
    cocos2d::CCSprite*  m_pWalls[10]    ;
    coco
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值