cocos2d-x开发之动作游戏实战--5
? 先看一下這篇文章:
Cocos2d-x游戲開發(fā)之TecturePacker的plist解析 ?
? 將一下碰撞檢測的實(shí)現(xiàn)原理,應(yīng)為圖片基于plist的壓縮,碰撞過程中npc以及hero是一個運(yùn)動的動畫,也就是說,一個動作有很多圖片合成,比如***動畫有五張圖片,而npc的運(yùn)動動畫有三張,這種情況下的碰撞檢測就比較難一點(diǎn),簡單的來說是矩形碰撞。
? ?碰撞算法的具體是實(shí)現(xiàn),初始化動畫的過程中將,npc和hero的動作的圖片生成一個pictureArray的集合,然后成plist中讀取圖片的大小與npc的位置生成碰撞矩行,判斷5*3次。
生成picArray的實(shí)現(xiàn):
bool?AnimationManager::loadAnimation(AnimationFormation?*af,int?count) {//緩沖——這會加載對應(yīng)的png,并裁切成SpriteFrame,而且還會完成索引memset(charBuffer,0,sizeof(charBuffer));//sprintf(charBuffer,"objectTexture/16bit/4444-%sYPding.plist",af[0].animateName);//CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(charBuffer);CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(totoYPdingPlist);//創(chuàng)建動畫數(shù)據(jù)CCMutableArray<CCSpriteFrame*>?*spriteFrames?=?new?CCMutableArray<CCSpriteFrame*>();for?(int?i=0;i<count;i++){CCMutableArray<CCString*>?*picArray?=?new?CCMutableArray<CCString*>();for(int?j=getDirection(af[i].direction);j<getDirection(af[i].direction)+af[i].frameNum;j++){memset(charBuffer,0,sizeof(charBuffer));sprintf(charBuffer,"%s_%d.png",af[i].animateName,/*getBehaviour(af[i].behaviour)*/j);CCString*?picName=new?CCString();picName->m_sString=charBuffer;picArray->addObject(picName);//printf("------AnimationPicture:????%s\n",charBuffer);//CCLOG("------AnimationPicture:????%s",charBuffer);//FrameCacheCCSpriteFrame?*spriteFrame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(charBuffer);spriteFrames->addObject(spriteFrame);}//使用cache緩沖管理CCAnimation?*animation=CCAnimation::animationWithFrames(spriteFrames,0.1f);memset(charBuffer,0,sizeof(charBuffer));sprintf(charBuffer,"%s_%s%s",af[i].animateName,getBehaviour(af[i].behaviour),getDirectionName(af[i].direction));//CCLOG("AnimationName:???????%s\n",charBuffer);//parse?plistCCPlistParseCache::sharedPlistParseCache()->addPictureArrayWithAnimationName(charBuffer,picArray);CCAnimationCache::sharedAnimationCache()->addAnimation(animation,charBuffer);spriteFrames->removeAllObjects();}spriteFrames->release();return?true; }關(guān)鍵代碼
CCPlistParseCache::sharedPlistParseCache()>addPictureArrayWithAnimation(charBuffer,picArray);初始話后將CCPlistParseCache類的實(shí)現(xiàn)
class?CCRectangle?:public?CCObject { public:const?char*?m_string;CCSize??size;CCRectangle();CCRectangle(const?char*?name,int?width,int?height);static?float?rectangleGetWidth(const?CCRectangle&?rect);static?float?rectangleGetHeight(const?CCRectangle&?rect);static?const?char*?rectangleGetName(CCRectangle*?rect);void??setRectangle(const?char*?name,int?width,int?height);float?geRectangleWidth();CCRectangle*?rect;//inlinebool?initRectangle(const?char*?m_name,int?m_width,int?m_height);inline?int?getWidth(void){return?width;}inline?int?getHeight(void){return?height;}inline?const?char*?getName(void){return?name;}inline?const?CCSize&?getRect(void)?{?return?m_obRect;?}/**?set?size?of?the?frame?*/void?setRect(const?CCSize&?rect); protected:const?char*?name;int?width;int?height;CCSize?m_obRect; }; #define?CCRectangleMake(name,width,height)?CCRectangle((name),(width),(height)) class?CCPlistParseCache?:?public?CCObject { public:bool?init(void);~CCPlistParseCache(void); public:/**?Returns?the?shared?instance?of?the?Sprite?Frame?cache?*/static?CCPlistParseCache*?sharedPlistParseCache(void);CCPlistParseCache(void):m_pSpriteName(NULL),m_pSpriteNameAliases(NULL),m_pAnimPic(NULL){}static?void?purgeSharedSpriteFrameCache(void);void?addSpriteCollisionWithFile(const?char?*pszPlist);void?addWeaponCollisionWithFile(const?char?*pszPlist);void?addObjCollisionWithFile(const?char?*pszPlist);void?addMoonkCollisionWithFile(const?char?*pszPlist);CCRectangle*?spriteCollisionByName(const?char?*pszName);void?addPictureArrayWithAnimationName(const?char?*pszName,CCMutableArray<CCString*>*pic);CCMutableArray<CCString*>*?pictureArrayByAnimationName(const?char?*pszName); private:CCDictionary<std::string,?CCMutableArray<CCString*>*>?*m_pAnimPic;const?char?*?picForKey(const?char?*key,?CCDictionary<std::string,??CCMutableArray<CCString*>*>?*picDict);CCDictionary<std::string,?CCString*>?*m_pSpriteNameAliases;CCDictionary<std::string,?CCRectangle*>?*m_pSpriteName;const?char?*?valueForKey(const?char?*key,?CCDictionary<std::string,?CCRectangle*>?*dict); }; #endif//_CCPLISTPARSECACHE_H_部分函數(shù)的實(shí)現(xiàn)
此類基于CCTextureCache類實(shí)現(xiàn),可以參考實(shí)現(xiàn)其他的。
void?CCPlistParseCache::addPictureArrayWithAnimationName(const?char?*pszName,CCMutableArray<CCString*>*pic) {CCMutableArray<CCString*>?*?picture=m_pAnimPic->objectForKey(pszName);//CCLOG("addPic:??????-???%s",pszName);picture=pic;std::string?picName=pszName;m_pAnimPic->setObject(picture,picName); } CCMutableArray<CCString*>*?CCPlistParseCache::pictureArrayByAnimationName(const?char?*pszName) {CCMutableArray<CCString*>?*pictureArray?=m_pAnimPic->objectForKey(std::string(pszName));if?(!pictureArray){//printf("No?PictureArray!");//CCLOG("No?PictureArray!");}return?pictureArray; }然后碰撞collision類的實(shí)現(xiàn)
class?CCCollisionRect { public:const?char*?m_string;CCSize??size;CCCollisionRect();CCCollisionRect(const?char*?name,int?width,int?height); public:static?CGFloat?CCRectGetHeight(const?CCCollisionRect&?rect);static?CGFloat?CCRectGetWidth(const?CCCollisionRect&?rect);static?const?char*?CCRectGetName(const?CCCollisionRect&?rect); }; #define?CCCollisionRectMake(name,width,?height)?CCCollisionRect((name),?(width),?(height)) class?collision:public?Singleton<collision> { public:collision(void);~collision(void);bool?spriteCollision(CCNode*?a,CCNode*?b,const?char*?animationA,const?char*?animationB,Direction?dir,Behaviour?be);void?spriteArray(const?char*?plistName);void?plistParse();void?getCollisionRect(const?char*?animationName,Direction?dir,Behaviour?be,CCNode*?node);CCMutableArray<CCString*>*?getAnimationPictureName(const?char*?animationName,Direction?dir,Behaviour?be);char*?getDirectionName(Direction?direction);char*?getBehaviour(Behaviour?behaviour);bool?isCCNodeCollision(const?char*?animNameA,const?char*?animNameB,Boy*?boy,Enemy*?enemy);bool?isMoonkCollision(const?char*?animNameA,const?char*?animNameB,Boy*?boy,Boss*?boss);bool?isPlayerCollision(const?char*?animNameA,const?char*?animNameB,Player*?p,Enemy*?enemy);bool?bulletsCCNodeCollision(int?i,const?char*?animNameA,const?char*?animNameB,Bullet*?bullet,Enemy*?enemy);bool?bulletsMoonkCollision(int?i,const?char*?animNameA,const?char*?animNameB,Bullet*?bullet,Boss*?moonk);private:BoxCollision?boxCollision;bool?isWingInit;bool?isYdingInit;bool?isPdingInit;bool?isMoonkInit; }; #define?sCollision?collision::getInstance() #endif//_COLLISION_H_實(shí)現(xiàn)一個函數(shù)
bool?collision::isCCNodeCollision(const?char*?animNameA,const?char*?animNameB,Boy*?boy,Enemy*?enemy) {//data?not?had?initedCCMutableArray<CCString*>*collisionPicArrayA=getAnimationPictureName(animNameA,boy->getDirection(),boy->getBehaviour());CCMutableArray<CCString*>*collisionPicArrayB=getAnimationPictureName(animNameB,enemy->getDirection(),enemy->getBehaviour());for(int?i=0;i<collisionPicArrayA->count();i++){for(int?j=0;j<collisionPicArrayB->count();j++){CCString*?strA=collisionPicArrayA->getObjectAtIndex(i);//return?rectangle?width?and?heightCCRectangle*?rectangleA=CCPlistParseCache::sharedPlistParseCache()->spriteCollisionByName(strA->m_sString.c_str());int?widthA=rectangleA->getWidth();int?heightA=rectangleA->getHeight();//CCLOG("---------------Collision:%s",strA->m_sString.c_str());CCString*?strB=collisionPicArrayB->getObjectAtIndex(j);CCRectangle*?rectangleB=CCPlistParseCache::sharedPlistParseCache()->spriteCollisionByName(strB->m_sString.c_str());int?widthB=rectangleB->getWidth();int?heightB=rectangleB->getHeight();char?charBuffer[128];memset(charBuffer,0,sizeof(charBuffer));//CCLOG("COLLISION:animName:%s----width:%d????height:%d\n",strA->m_sString.c_str(),widthA,heightA);//CCLOG("COLLISION:animName:%s----width:%d????height:%d\n",strB->m_sString.c_str(),widthB,heightB);//attackAnimation?toto_14.png~toto_19.png//ATTACK?ANIMATION?COLLISION校正for(int?i=14;i<14+5;i++){sprintf(charBuffer,"toto_%d.png",i);if(strcmp(charBuffer,strA->m_sString.c_str())==0){widthA=widthA-70;heightA=heightA-50;}memset(charBuffer,0,sizeof(charBuffer));}CCRect?a;CCRect?b;a=boy->getCollisionRect(widthA,heightA);b=enemy->getCollisionRect(widthB,heightB);if(CCRect::CCRectIntersectsRect(a,b)){//CCLOG("COLLISION?YES!");return?true;}}}return?false; }具體怎么用下一篇再講,待續(xù)(兩月后,期間沒網(wǎng))。。。。。。。。。。。。。。。。。。
long原創(chuàng)
轉(zhuǎn)載于:https://blog.51cto.com/lonag/1223189
總結(jié)
以上是生活随笔為你收集整理的cocos2d-x开发之动作游戏实战--5的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 克莱斯勒中国召回部分进口牧马人 4XE
- 下一篇: Oracle PL/SQL 非预定义异常