3.2改动不少,有很方便的物理引擎封装,下面代码为物理引擎注册碰撞监听的回调,注册触摸事件监听的回调,注册键盘事件的监听和回调。
void MainGame::onEnter(){
Layer::onEnter();
//添加碰撞 回调监听
auto physicsListener = EventListenerPhysicsContact::create();
physicsListener->onContactBegin = CC_CALLBACK_1(MainGame::onContactBegin,this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(physicsListener,this);
//添加键盘事件监听
EventListenerKeyboard* keyPadListener = EventListenerKeyboard::create();
keyPadListener->onKeyPressed = CC_CALLBACK_2(MainGame::onKeyPressed,this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(keyPadListener,this);
//添加触摸事件监听
auto touchListener = EventListenerTouchOneByOne::create();
touchListener->setSwallowTouches(true);
touchListener->onTouchBegan = CC_CALLBACK_2(MainGame::onTouchBegan,this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener,this);
}
bool MainGame::onTouchBegan(Touch* pTouch,Event* pEvent){
CCLOG("%s","onTouchesBegan");
return true;
}
void MainGame::onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event){
CCLOG("%s","onKeyPressed");
//方向键
if ( keyCode== EventKeyboard::KeyCode::KEY_DPAD_LEFT ||
keyCode== EventKeyboard::KeyCode::KEY_KP_LEFT ||
keyCode== EventKeyboard::KeyCode::KEY_LEFT_ARROW ||
keyCode == EventKeyboard::KeyCode::KEY_LEFT_BRACE ||
keyCode == EventKeyboard::KeyCode::KEY_LEFT_BRACKET ||
keyCode == EventKeyboard::KeyCode::KEY_LEFT_PARENTHESIS
)
{
CCLOG("LEFT");
}
else
if(
keyCode== EventKeyboard::KeyCode::KEY_DPAD_RIGHT ||
keyCode== EventKeyboard::KeyCode::KEY_KP_RIGHT ||
keyCode== EventKeyboard::KeyCode::KEY_RIGHT_ARROW ||
keyCode== EventKeyboard::KeyCode::KEY_RIGHT_BRACE ||
keyCode== EventKeyboard::KeyCode::KEY_RIGHT_BRACKET ||
keyCode== EventKeyboard::KeyCode::KEY_RIGHT_PARENTHESIS
)
{
CCLOG("RIGHT");
}
else
if(
keyCode== EventKeyboard::KeyCode::KEY_DPAD_UP ||
keyCode== EventKeyboard::KeyCode::KEY_KP_UP ||
keyCode== EventKeyboard::KeyCode::KEY_UP_ARROW ||
keyCode== EventKeyboard::KeyCode::KEY_KP_PG_UP ||
keyCode== EventKeyboard::KeyCode::KEY_PG_UP
)
{
CCLOG("UP");
}
else
if( keyCode== EventKeyboard::KeyCode::KEY_DPAD_DOWN ||
keyCode== EventKeyboard::KeyCode::KEY_KP_DOWN ||
keyCode== EventKeyboard::KeyCode::KEY_DOWN_ARROW ||
keyCode== EventKeyboard::KeyCode::KEY_KP_PG_DOWN ||
keyCode== EventKeyboard::KeyCode::KEY_PG_DOWN
)
{
CCLOG("DOWN");
}
else
//确定
if( keyCode== EventKeyboard::KeyCode::KEY_KP_ENTER ||
keyCode== EventKeyboard::KeyCode::KEY_DPAD_CENTER ||
keyCode== EventKeyboard::KeyCode::KEY_ENTER)
{
CCLOG("ENTER");
}
else
//返回
if( keyCode== EventKeyboard::KeyCode::KEY_BACKSPACE ||
keyCode== EventKeyboard::KeyCode::KEY_SPACE ||
keyCode== EventKeyboard::KeyCode::KEY_ESCAPE)
{
CCLOG("BACK");
}
else
//菜单
if( keyCode== EventKeyboard::KeyCode::KEY_MENU)
{
CCLOG("MENU");
}
}
bool MainGame::onContactBegin(PhysicsContact& contact){
auto spriteA = (Sprite*)contact.getShapeA()->getBody()->getNode();
<span style="white-space:pre"> </span>auto spriteB = (Sprite*)contact.getShapeB()->getBody()->getNode();
int tagA = spriteA->getTag();
int tagB = spriteB->getTag();
return true;
}
还有关于 cocos2d-x 3.2 物理引擎的 物理刚体的碰撞标识有几个描述特别精髓
PhysicsBody* body = PhysicsBody::createBox(playerSize);
body->getShape(0)->setRestitution(0.0f);//反弹力
body->getShape(0)->setFriction(0.0f);//摩擦力
body->getShape(0)->setDensity(0.1f);//密度 10000000
body->setDynamic(false);
body->setGravityEnable(false);
body->setCategoryBitmask(0x01); // 0001 我是谁
body->setContactTestBitmask(0x02); // 0100 我和谁碰撞触发回调
body->setCollisionBitmask(0x02); // 0011 我实际和谁产生碰撞
补充一个和2.x版本差不多的添加触摸监听的方法
在init中调用如下函数进行设置
this->setTouchEnabled(true);
this->setTouchMode(Touch::DispatchMode::ONE_BY_ONE);