Collision detection 如何在cocos2d-x中使用box2d进行碰撞检测
我的两个精灵是roll和hero。我想在cocos2d-x中使用box2d检测它们的碰撞 我已经让两个精灵在屏幕上移动(自动滚动,手动英雄) 我只想调用函数intersection() 当两个精灵碰撞时。(精灵在*.h文件中全局声明)Collision detection 如何在cocos2d-x中使用box2d进行碰撞检测,collision-detection,box2d,cocos2d-x,marmalade,Collision Detection,Box2d,Cocos2d X,Marmalade,我的两个精灵是roll和hero。我想在cocos2d-x中使用box2d检测它们的碰撞 我已经让两个精灵在屏幕上移动(自动滚动,手动英雄) 我只想调用函数intersection() 当两个精灵碰撞时。(精灵在*.h文件中全局声明) #包括“GameScene.h” #包括“HomeScene.h” 使用\u NS\u CC; CCScene*游戏场景::场景() { //“场景”是一个自动释放对象 CCScene*scene=ccscscene::node(); //“层”是一个自动释放对象
#包括“GameScene.h”
#包括“HomeScene.h”
使用\u NS\u CC;
CCScene*游戏场景::场景()
{
//“场景”是一个自动释放对象
CCScene*scene=ccscscene::node();
//“层”是一个自动释放对象
游戏场景*层=游戏场景::节点();
//将层作为子层添加到场景中
场景->添加子对象(层);
//返回现场
返回场景;
}
//在“init”中,您需要初始化实例
bool游戏场景::init()
{
//////////////////////////////
//1.超级初始化优先
如果(!CCLayerColor::initWithColor(ccc4(0,0,0255)))
{
返回false;
}
//////////////////////////////
//2.在下面添加您的代码。。。
计数=0;
寿命=3;
CCSize WinSize=CCDirector::sharedDirector()->getWinSize();
//背景
CCSprite*bg=CCSprite::spriteWithFile(“bg.png”);
背景->设置位置(CCPointZero);
bg->setAnchorPoint(CCPointZero);
bg->setScaleX(WinSize.width/460);
背景->设置比例(WinSize.height/325);
此->添加子对象(bg,0,1);
//关闭按钮
CCSprite*back=CCSprite::spriteWithFile(“close.png”);
CCSprite*back1=CCSprite::spriteWithFile(“closeS.png”);
CCMenuItemSprite*home=CCMenuItemSprite::itemFromNormalSprite(后退,后退1,此,菜单选择器(游戏场景::callNext));
CCMenu*MenuClose=CCMenu::menuWithItem(主页);
菜单关闭->设置位置(ccp(WinSize.width-20,WinSize.height-20));
这->添加子对象(菜单,5,1);
//生命偶像
CCSprite*rc=CCSprite::spriteWithFile(“rc.png”);
rc->设置位置(ccp(20,WinSize.height-20));
这个->addChild(rc,5,15);
//得分图标
CCSprite*dp=CCSprite::spriteWithFile(“dp.png”);
dp->设置位置(ccp(55,WinSize.height-20));
这个->addChild(dp,5,18);
//在任意位置插入滚轮
roll=CCSprite::spriteWithFile(“ball.png”);
int minY=(roll->getContentSize().height/2)+(WinSize.height/(4.5));
int maxY=(WinSize.height)-(滚动->获取内容大小().height/2);
int rangy=maxY-minY;
srand(时间(空));
int实际=(rand()%rangeY)+minY;
CCLOG(“实际为oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo;
滚动->设置位置(ccp(20,实际));
这->添加子对象(滚动,5,8);
//确定滚筒的速度
智力持续时间=3;
int maxDuration=7;
int rangeDuration=maxDuration-minDuration;
int actualDuration=(rand()%rangeDuration)+minDuration;
/*
//为滚轮创建约束
float maxXX=WinSize.width-roll->getContentSize().width/2;
float minXX=roll->getContentSize().width/2;
如果(滚动->获取位置().x>maxXX)
{
滚动->设置位置(ccp(maxXX,滚动->获取位置().y));
}
否则如果(滚动->获取位置().x设置位置(ccp(minXX,滚动->获取位置().y));
}
float maxYY=WinSize.height-roll->getContentSize().height/2;
float minYY=roll->getContentSize().height/2;
如果(滚动->获取位置().y>maxYY)
{
滚动->设置位置(ccp(滚动->获取位置().x,maxYY));
}
else if(getPosition().y设置位置(ccp(滚动->获取位置().x,minYY));
}
*/
//创建滚动动作
滚动->运行操作(CCRepeatForever::actionWithAction((CCSequence*)CCSequence::actions(
CCJumpTo::actionWithDuration(实际持续时间,ccp(WinSize.width,(rand()%rangeY)+minY),(rand()%rangeY)+minY,4),
CCHide::action(),
CCMoveTo::持续时间为(0,ccp(20,(rand()%range)+minY)的操作,
CCShow::action(),
CCCallFunc::actionWithTarget(这是callfunc_选择器(游戏场景::分数)),
空);;
//显示分数
sprintf(分数,“%d”,计数);
scr=CCLabelBMFont::labelWithString(分数,“arial16.fnt”);
scr->设置位置(ccp(55,WinSize.height-20));
scr->setColor(ccc3(0,0255));
此->添加子对象(scr,50);
//展示生活
sprintf(生命标签,“%d”,生命);
lif=CCLabelBMFont::labelWithString(lifeLabel,“arial16.fnt”);
lif->设置位置(ccp(20,WinSize.height-20));
lif->setColor(ccc3(0,0255));
此->添加子对象(lif,50);
//插入动画英雄
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(“boyJog.plist”、“boyJog.png”);
CCMutableArray*proFrame=新的CCMutableArray;
hero=CCSprite::spritewithpriteframename(“boyJog1.png”);
英雄->设置位置(ccp(WinSize.width/2-30,WinSize.height/(4.5));
英雄->设置主播点(CCPointZero);
字符buff[60];
对于(inti=1;iaddObject((CCSpriteFrameCache::sharedSpriteFrameCache())->spriteFrameByName(buff));
}
cAnimation*progressAnimation=cAnimation::animationWithFrames(proFrame,0.05);
//在此处设置动画对象
CCAnimate*animate=CCAnimate::actionWithAnimation(progressAnimation,false);
英雄->runAction(CCRepeatForever::actionWithAction(动画));
英雄->设置刻度(.5);
这个孩子(英雄);
//左右按钮
CCSprite*moveRight=CCSprite::spriteWithFile(“arrowRight.png”);
CCSprite*moveLeft=CCSprite::spriteWithFile(“arrowLeft.png”);
CCSprite*moveRightS=CCSprite::spriteWithFile(“arrowRight.png”);
CCSprite*moveLeftS=CCSprite::spriteWithFile(“arrowLeft.png”);
CCMenuItemSprite*right=CCMenuItemSprite::itemFromNormalSprite(moveRight,moveRightS,this,菜单选择器(游戏场景::heroRight));
CCMenuItemSprite*left=CCMenuItemSprite::itemFromNormalSprite(moveLeft,moveLeftS,this,菜单选择器(games::heroLeft));
CCMenu*RL=CCMenu::menuWithItems(左、右、空);
RL->alignitemshorizontallywhithpadding(20);
RL->设置位置(ccp(WinSize.width-40,20));
RL->设置不透明度(1)
#include "GameScene.h"
#include "HomeScene.h"
USING_NS_CC;
CCScene* GameScene::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::node();
// 'layer' is an autorelease object
GameScene *layer = GameScene::node();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool GameScene::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayerColor::initWithColor(ccc4(0,0,0,255) ))
{
return false;
}
//////////////////////////////
// 2. add your codes below...
count=0;
life=3;
CCSize WinSize= CCDirector::sharedDirector()->getWinSize();
// background
CCSprite * bg=CCSprite::spriteWithFile("bg.png");
bg->setPosition(CCPointZero);
bg->setAnchorPoint(CCPointZero);
bg->setScaleX(WinSize.width/460);
bg->setScaleY(WinSize.height/325);
this->addChild(bg,0,1);
//close button
CCSprite * back=CCSprite::spriteWithFile("close.png");
CCSprite * back1=CCSprite::spriteWithFile("closeS.png");
CCMenuItemSprite *home=CCMenuItemSprite::itemFromNormalSprite(back,back1,this,menu_selector(GameScene::callNext));
CCMenu *MenuClose=CCMenu::menuWithItem(home);
MenuClose->setPosition(ccp(WinSize.width-20,WinSize.height-20));
this->addChild(MenuClose,5,1);
//life icon
CCSprite * rc=CCSprite::spriteWithFile("rc.png");
rc->setPosition(ccp(20,WinSize.height-20));
this->addChild(rc,5,15);
//score icon
CCSprite * dp=CCSprite::spriteWithFile("dp.png");
dp->setPosition(ccp(55,WinSize.height-20));
this->addChild(dp,5,18);
//insert roller at a random place
roll=CCSprite::spriteWithFile("ball.png");
int minY = (roll->getContentSize().height/2)+(WinSize.height/(4.5));
int maxY = (WinSize.height)- (roll->getContentSize().height/2);
int rangeY = maxY - minY;
srand ( time(NULL) );
int actualY = ( rand() % rangeY ) + minY;
CCLOG("the actualY is oooooooooooooooooooooooooooooooooooooooooooooooooooooooo %d",actualY);
roll->setPosition(ccp(20,actualY));
this->addChild(roll,5,8);
// Determine speed of the roller
int minDuration = 3;
int maxDuration = 7;
int rangeDuration = maxDuration - minDuration;
int actualDuration = ( rand() % rangeDuration)+ minDuration;
/*
//creating constraints for the roller
float maxXX = WinSize.width - roll->getContentSize().width/2;
float minXX =roll->getContentSize().width/2;
if (roll->getPosition().x > maxXX)
{
roll->setPosition( ccp(maxXX, roll->getPosition().y)) ;
}
else if (roll->getPosition().x < minXX)
{
roll->setPosition (ccp(minXX,roll->getPosition().y));
}
float maxYY = WinSize.height - roll->getContentSize().height/2;
float minYY = roll->getContentSize().height/2;
if (roll->getPosition().y > maxYY)
{
roll->setPosition ( ccp(roll->getPosition().x, maxYY));
}
else if (getPosition().y < minYY)
{
roll->setPosition( ccp(roll->getPosition().x, minYY));
}
*/
// Create the rolling action
roll->runAction(CCRepeatForever::actionWithAction((CCSequence*) CCSequence::actions(
CCJumpTo::actionWithDuration( actualDuration,ccp(WinSize.width,( rand() % rangeY ) + minY ),( rand() % rangeY ) + minY,4 ),
CCHide::action(),
CCMoveTo::actionWithDuration(0,ccp(20,( rand() % rangeY ) + minY)),
CCShow::action(),
CCCallFunc::actionWithTarget( this,callfunc_selector(GameScene::scores)),
NULL)) );
//displaying scores
sprintf(score,"%d",count);
scr= CCLabelBMFont::labelWithString(score , "arial16.fnt");
scr->setPosition(ccp(55,WinSize.height-20));
scr->setColor(ccc3(0,0,255));
this->addChild(scr,50);
//displaying lifes
sprintf(lifeLabel,"%d",life);
lif= CCLabelBMFont::labelWithString(lifeLabel , "arial16.fnt");
lif->setPosition(ccp(20,WinSize.height-20));
lif->setColor(ccc3(0,0,255));
this->addChild(lif,50);
// insert animated hero
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("boyJog.plist","boyJog.png");
CCMutableArray<CCSpriteFrame*> *proFrame = new CCMutableArray<CCSpriteFrame *>;
hero = CCSprite::spriteWithSpriteFrameName("boyJog1.png");
hero->setPosition(ccp(WinSize.width/2-30,WinSize.height/(4.5)));
hero->setAnchorPoint(CCPointZero);
char buff[60];
for(int i=1;i<=13;i++)
{
sprintf(buff,"boyJog%d.png",i);
proFrame->addObject( (CCSpriteFrameCache::sharedSpriteFrameCache())->spriteFrameByName(buff));
}
CCAnimation *progressAnimation=CCAnimation::animationWithFrames(proFrame, 0.05);
//set animation object here
CCAnimate *animate=CCAnimate::actionWithAnimation(progressAnimation,false);
hero->runAction(CCRepeatForever::actionWithAction(animate));
hero->setScale(.5);
this->addChild( hero);
//left right button
CCSprite *moveRight= CCSprite::spriteWithFile("arrowRight.png");
CCSprite *moveLeft= CCSprite::spriteWithFile("arrowLeft.png");
CCSprite *moveRightS= CCSprite::spriteWithFile("arrowRight.png");
CCSprite *moveLeftS= CCSprite::spriteWithFile("arrowLeft.png");
CCMenuItemSprite *right=CCMenuItemSprite::itemFromNormalSprite(moveRight,moveRightS,this,menu_selector(GameScene::heroRight));
CCMenuItemSprite *left=CCMenuItemSprite::itemFromNormalSprite(moveLeft,moveLeftS,this,menu_selector(GameScene::heroLeft));
CCMenu *RL =CCMenu::menuWithItems(left,right,NULL);
RL->alignItemsHorizontallyWithPadding(20);
RL->setPosition(ccp(WinSize.width-40,20));
RL->setOpacity(150);
this->addChild(RL);
//jump button
CCSprite *jump= CCSprite::spriteWithFile("arrowUp.png");
CCSprite *jumpS= CCSprite::spriteWithFile("arrowUp.png");
CCMenuItemSprite *mmJump=CCMenuItemSprite::itemFromNormalSprite(jump,jumpS,this,menu_selector(GameScene::heroJump));
CCMenu *menuJump=CCMenu::menuWithItem(mmJump);
menuJump->setPosition(ccp(20,20));
menuJump->setOpacity(150);
this->addChild(menuJump,5,12);
//////////////////////////////
return true;
}
void GameScene::callNext(CCObject *sender)
{
CCLOG("game played");
CCDirector::sharedDirector()->replaceScene(CCTransitionFade::transitionWithDuration(1,(HomeScene::scene())));
//exit(1);
}
void GameScene::heroJump(CCObject *sender)
{
CCLOG(" U");
CCSize WinSize= CCDirector::sharedDirector()->getWinSize();
CCPoint Pt=hero->getPosition();
hero->runAction(CCJumpTo::actionWithDuration(1,ccp(Pt.x,WinSize.height/(4.5)),50,1));
}
void GameScene::heroLeft(CCObject *sender)
{
CCLOG(" L");
CCSize WinSize= CCDirector::sharedDirector()->getWinSize();
CCPoint Pt=hero->getPosition();
hero->runAction(CCJumpTo::actionWithDuration(1,ccp(Pt.x-30,WinSize.height/(4.5)),0,1));
hero->setFlipX(1);
//hero->runAction(CCRepeatForever::actionWithAction(animate));
}
void GameScene::heroRight(CCObject *sender)
{
CCLOG(" R");
CCSize WinSize= CCDirector::sharedDirector()->getWinSize();
CCPoint Pt=hero->getPosition();
hero->runAction(CCJumpTo::actionWithDuration(1,ccp(Pt.x+30,WinSize.height/(4.5)),0,1));
hero->setFlipX(0);
//hero->runAction(CCRepeatForever::actionWithAction(animate));
}
void GameScene::scores()
{
count+=10;
CCLOG("count ==========================%d",count);
sprintf(score,"%d",count);
scr->setString(score);
}
void GameScene::intersection()
{
CCLOG("collided..........................................................");
}
yourFixtureDef.filter.groupIndex = -1; // for example