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

作者: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中,我总会给游戏加上一个世界的边界,大多时候是一个矩形来完成的。我控制一个矩形在这个大的矩形世界里面到处移动。当移动到边缘的时候,我会检测它是否超出了大的矩形世界的边缘,然后强制的将玩家的位置设置到刚好和矩形世界边缘触碰的位置处。而在使用这样的方法之后,发现我们控制的小矩形能够很好的与矩形世界进行碰撞反应。

实际测试

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

class HelloWorld : public cocos2d::CCLayer{public:// Here’s a difference. Method ‘init’ in cocos2d-x returns bool, instead of returning ‘id’ in cocos2d-iphone();// there’s no ‘id’ in cpp, so we recommand to return the exactly class pointerstatic cocos2d::CCScene* scene();// a selector callbackvoid menuCloseCallback(CCObject* pSender);// implement the “static node()” method manuallyCREATE_FUNC(HelloWorld);//void update(float dt) ;void collisionTest1();void collision();private:cocos2d::CCSprite* m_pWalls[10] ;cocos2d::CCSprite* m_pRole ;};namespace cocos2d;CCScene* HelloWorld::scene(){CCScene * scene = NULL;do{// ‘scene’ is an autorelease objectscene = CCScene::create();CC_BREAK_IF(! scene);// ‘layer’ is an autorelease objectHelloWorld *layer = HelloWorld::create();CC_BREAK_IF(! layer);// add layer as a child to scenescene->addChild(layer);} while (0);// return the scenereturn scene;}// on “init” you need to initialize your instancebool HelloWorld::init(){bool bRet = false;do{////CC_BREAK_IF(! CCLayer::init());////m_pRole = CCSprite::create(“Wood.png”);addChild(m_pRole);m_pRole->setPosition(ccp(100,100));memset(m_pWalls,0,sizeof(CCSprite*) * 6);m_pWalls[0] = CCSprite::create(“Wall.png”);m_pWalls[0]->setPosition(ccp(160,120));addChild(m_pWalls[0]);m_pWalls[1] = CCSprite::create(“Wall.png”);m_pWalls[1]->setPosition(ccp(160,120+32));addChild(m_pWalls[1]);m_pWalls[2] = CCSprite::create(“Wall.png”);m_pWalls[2]->setPosition(ccp(160+32,120+62));addChild(m_pWalls[2]);m_pWalls[3] = CCSprite::create(“Wall.png”);m_pWalls[3]->setPosition(ccp(160+64,120-32));addChild(m_pWalls[3]);scheduleUpdate();bRet = true;} while (0);return bRet;}void HelloWorld::menuCloseCallback(CCObject* pSender){// “close” menu item clickedCCDirector::sharedDirector()->end();}void HelloWorld::update(float dt){CCPoint pos = m_pRole->getPosition();if(GetKeyState(VK_UP) & 0x8000){pos.y += 3 ;}else if(GetKeyState(VK_DOWN) & 0x8000){pos.y -= 3 ;}if(GetKeyState(VK_LEFT) & 0x8000){pos.x -= 3 ;}else if(GetKeyState(VK_RIGHT) & 0x8000){pos.x += 3 ;}m_pRole->setPosition(pos);collision();}// end for updatevoid HelloWorld::collision(){for(int i = 0 ; i < 10 ; i ++){if(0 == m_pWalls[i])break ;//check if they collidedif(m_pRole->boundingBox().intersectsRect(m_pWalls[i]->boundingBox())){CCPoint rolePos = m_pRole->getPosition();CCPoint wallPos = m_pWalls[i]->getPosition();CCPoint temp = ::ccpSub(rolePos, wallPos);if(abs(temp.x) > abs(temp.y)){if(rolePos.x >= wallPos.x &&wallPos.x + 16 + 16 >= rolePos.x){rolePos.x = wallPos.x + 16 + 16 ;}else if(rolePos.x <= wallPos.x &&rolePos.x + 16 + 16 >= wallPos.x){rolePos.x = wallPos.x – 16 – 16 ;}}else{if(rolePos.y >= wallPos.y &&rolePos.y – 16 – 16 <= wallPos.y){rolePos.y = wallPos.y + 16 + 16 ;}else if(rolePos.y <= wallPos.y &&rolePos.y + 16 + 16 >=wallPos.y){rolePos.y = wallPos.y – 16 – 16 ;}}m_pRole->setPosition(rolePos);}}//end for}// end for collision家门前的那条小路,到底通向了什么样的远方呢?

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

相关文章:

你感兴趣的文章:

标签云: