int PhysicsWorld::collisionBeginCallback(PhysicsContact& contact) { bool ret = true; PhysicsShape* shapeA = contact.getShapeA(); PhysicsShape* shapeB = contact.getShapeB(); PhysicsBody* bodyA = shapeA->getBody(); PhysicsBody* bodyB = shapeB->getBody(); std::vector<PhysicsJoint*> jointsA = bodyA->getJoints(); // check the joint is collision enable or not for (PhysicsJoint* joint : jointsA) { if (std::find(_joints.begin(), _joints.end(), joint) == _joints.end()) { continue; } if (!joint->isCollisionEnabled()) { PhysicsBody* body = joint->getBodyA() == bodyA ? joint->getBodyB() : joint->getBodyA(); if (body == bodyB) { contact.setNotificationEnable(false); return false; } } } // bitmask check if ((shapeA->getCategoryBitmask() & shapeB->getContactTestBitmask()) == 0 || (shapeA->getContactTestBitmask() & shapeB->getCategoryBitmask()) == 0) { contact.setNotificationEnable(false); } if (shapeA->getGroup() != 0 && shapeA->getGroup() == shapeB->getGroup()) { ret = shapeA->getGroup() > 0; } else { if ((shapeA->getCategoryBitmask() & shapeB->getCollisionBitmask()) == 0 || (shapeB->getCategoryBitmask() & shapeA->getCollisionBitmask()) == 0) { ret = false; } } if (contact.isNotificationEnabled()) { contact.setEventCode(PhysicsContact::EventCode::BEGIN); contact.setWorld(this); _scene->getEventDispatcher()->dispatchEvent(&contact); } return ret ? contact.resetResult() : false; }
bool Demo::onContactBegan(PhysicsContact& contact) { auto m_action = FadeOut::create(0.3f); auto sp1 = (Sprite*)contact.getShapeA()->getBody()->getNode(); auto sp2 = (Sprite*)contact.getShapeB()->getBody()->getNode(); if (sp1->getTag() == 1 && sp2->getTag() == 2) { sp1->runAction(m_action); testParticleFireworks(); } else if (sp1->getTag() == 2 && sp2->getTag() == 1) { sp2->runAction(m_action); testParticleFireworks(); } return true; }
void GameScene::onContactPostSolve(PhysicsContact &contact, const PhysicsContactPostSolve &solve) { auto bodyA = contact.getShapeA()->getBody(); auto bodyB = contact.getShapeB()->getBody(); if (bodyA->getTag() == PLAYER && bodyB->getTag() == TILE) { bodyA->setVelocity(Vec2(bodyA->getVelocity().x * RESTITUTION, bodyA->getVelocity().y * RESTITUTION)); } if (bodyB->getTag() == PLAYER && bodyA->getTag() == TILE) { bodyB->setVelocity(Vec2(bodyB->getVelocity().x * RESTITUTION, bodyB->getVelocity().y * RESTITUTION)); } }
bool PassGateComponent::onContactSeparate(PhysicsContact& contact) { if ((contact.getShapeA()->getCollisionBitmask() == PLAYER_ID) && (contact.getShapeB()->getCollisionBitmask() == PASSGATE_AREA_ID)) { if ((_collisionPointX != 0) && (abs(_collisionPointX - contact.getShapeA()->getBody()->getPosition().x) > GATE_WIDTH-5)) { // change 'Y' coordinate of the 'gate' main point auto action = MoveTo::create(GATE_ACTION_SPEED, Point(_visibleSize.width / 2, nextPosY())); _mainNode->runAction(action); } _collisionPointX = contact.getShapeA()->getBody()->getPosition().x; } return false; }
int PhysicsWorld::collisionPreSolveCallback(PhysicsContact& contact) { if (!contact.isNotificationEnabled()) { cpArbiterIgnore(static_cast<cpArbiter*>(contact._contactInfo)); return true; } contact.setEventCode(PhysicsContact::EventCode::PRESOLVE); contact.setWorld(this); EventCustom event(PHYSICSCONTACT_EVENT_NAME); event.setUserData(&contact); _scene->getEventDispatcher()->dispatchEvent(&event); return contact.resetResult(); }
bool PlayerComponent::onContactBegin(PhysicsContact& contact) { if (!is_endGame) { PhysicsBody *a = contact.getShapeB()->getBody(); if ((a->getCollisionBitmask() == OBSTACLE_ID) || (a->getCollisionBitmask() == SPIKESBORDER_ID)) { is_onTouch = false; is_fall = false; is_endGame = true; // display 'dialog box' this->getOwner()->addChild(MyDialogBox::create( { Label::create("Your Score:", "Calibri", 30), Label::create(StringUtils::toString(((ScoreCounterComponent*)this->getOwner()->getComponent(SCORECOUNTER_NAME))->getScore()), "Calibri", 120) }, { DialogBoxButton("TRY AGAIN", TextHAlignment::LEFT, CC_CALLBACK_1(GameScene::goToGameScene, ((GameScene*)this->getOwner()))), DialogBoxButton("BACK TO\n MAIN MENU", TextHAlignment::RIGHT, CC_CALLBACK_1(GameScene::goToMainMenuScene, ((GameScene*)this->getOwner()))) } ), 10); } } return false; }
bool ObjectLayer::onContactBegin(PhysicsContact& contact) { auto objectA = static_cast<custom::Object*>(contact.getShapeA()->getBody()->getNode()); auto objectB = static_cast<custom::Object*>(contact.getShapeB()->getBody()->getNode()); if (!objectA || !objectB || !objectA->GetOwner() || !objectB->GetOwner()) { return false; } if (objectA->GetOwner()->GetType() != objectB->GetOwner()->GetType()) { objectA->Damaged(objectB->GetDefInfo().m_Damage); objectB->Damaged(objectA->GetDefInfo().m_Damage); } return true; }
bool Balloon::onContactBegin(PhysicsContact& contact) { auto balloon = static_cast<Balloon*>(contact.getCurrentTarget()); //if (obj1->getTag() != obj2->getTag()) //{ //obj1->removeFromParent(); /* Event e = contact; auto balloon = static_cast<Balloon*>(e.getCurrentTarget()); contact. balloon->setVisible(false);*/ //} //int tag = s->getTag(); //CCLog("Contact tag: %d", obj1->getTag()); //CCLog("Contact tag: %d", obj2->getTag()); //this->removeFromParent(); //this->setVisible(false); //HelloWorld::removeBalloon(this); return true; }
void GameScene_Box2D::onContactPostSolve(PhysicsContact& contact, const PhysicsContactPostSolve& solve) { auto node1 = contact.getShapeA()->getBody()->getNode(); auto node2 = contact.getShapeB()->getBody()->getNode(); if (node1->getTag()== spriteType::kFloor && node2->getTag()== spriteType::kBall) { BallSprite *ball = (BallSprite *)node2; bool ball_state_none = (ball->getBallContState() == BallSprite::ballContactState::kNone); if (ball_state_none) { ball->setBallContState(BallSprite::ballContactState::kFloorContact); } } else if (node2->getTag()== spriteType::kFloor && node1->getTag()== spriteType::kBall) { BallSprite *ball = (BallSprite *)node1; bool ball_state_none = (ball->getBallContState() == BallSprite::ballContactState::kNone); ball->setBallContState(BallSprite::ballContactState::kFloorContact); if (ball_state_none) { ball->setBallContState(BallSprite::ballContactState::kFloorContact); } } else if (node2->getTag()== spriteType::kBall && node1->getTag()== spriteType::kBall) { BallSprite *ball1 = (BallSprite *)node1; BallSprite *ball2 = (BallSprite *)node2; bool ball1_state_floor = (ball1->getBallContState() == BallSprite::ballContactState::kFloorContact); bool ball2_state_floor = (ball2->getBallContState() == BallSprite::ballContactState::kFloorContact); bool ball1_state_none = (ball1->getBallContState() == BallSprite::ballContactState::kNone); bool ball2_state_none = (ball2->getBallContState() == BallSprite::ballContactState::kNone); bool ball1_state_second = (ball1->getBallContState() == BallSprite::ballContactState::kSecondContact); bool ball2_state_second = (ball2->getBallContState() == BallSprite::ballContactState::kSecondContact); if (ball1_state_none || ball2_state_floor) { ball1->setBallContState(BallSprite::ballContactState::kSecondContact); } else if (ball1_state_floor || ball2_state_none) { ball2->setBallContState(BallSprite::ballContactState::kSecondContact); } else if (ball1_state_none || ball2_state_second) { ball1->setBallContState(BallSprite::ballContactState::kSecondContact); } else if (ball2_state_none || ball1_state_second) { ball2->setBallContState(BallSprite::ballContactState::kSecondContact); } } }
bool GamePlay::onContactBegan(PhysicsContact &contact) { auto nodeA = contact.getShapeA()->getBody()->getNode(); auto nodeB = contact.getShapeB()->getBody()->getNode(); auto bang = Sprite::create("HelloWorld.png"); bang->setScale(0.03); bang->setPosition(nodeA->getPosition()); this->addChild(bang); auto actionMove = MoveTo::create(1, nodeA->getPosition()); auto actionRemove = RemoveSelf::create(); bang->runAction(Sequence::create(actionMove,actionRemove, nullptr)); nodeA->removeFromParent(); nodeB->removeFromParent(); return true; }
bool HelloWorld::onContactBegin(PhysicsContact& contact){ //接触开始 auto a = contact.getShapeA()->getTag(); auto b = contact.getShapeB()->getTag(); if ((a*b) == PLAYER_TAG * EDGE_TAG) { isContact = true; isPressedW = false; jumped = false; } else if ((a*b) == PLAYER_TAG*ENEMY_TAG_ZERO){ player1->contactNumber++; } auto temp = String::createWithFormat("%d", player1->contactNumber); log(temp->getCString()); log("onContactBegin"); return true; }
bool WorldLayer::onContactBegin(PhysicsContact& contact) { PhysicsBody *aBody = contact.getShapeA()->getBody(); PhysicsBody *bBody =contact.getShapeB()->getBody(); Player *player = NULL; Entity *object = NULL; if(aBody->getNode()->getTag() == 1) { player = (Player *)aBody->getNode(); object = (Entity *)bBody->getNode(); player->setCollided(object); return true; } else if(bBody->getNode()->getTag() == 1) { player = (Player *)bBody->getNode(); object = (Entity *)aBody->getNode(); player->setCollided(object); return true; } return false; }
void MainScene::onContactSeperate(const PhysicsContact& contact) { auto playerA = (Player*)contact.getShapeA()->getBody()->getNode(); auto playerB = (Player*)contact.getShapeB()->getBody()->getNode(); auto typeA = playerA->getPlayerType(); auto typeB = playerB->getPlayerType(); if (typeA == Player::PlayerType::PLAYER) { log("leave enemy!"); playerB->setCanAttack(false); playerA->removeAttacker(playerB); } if (typeB == Player::PlayerType::PLAYER) { log("leave enemy!"); playerA->setCanAttack(false); playerB->removeAttacker(playerA); } }
void MainScene::onContactSeperate(const PhysicsContact& contact) { auto playerA = (Player*)contact.getShapeA()->getBody()->getNode(); auto playerB = (Player*)contact.getShapeB()->getBody()->getNode(); auto typeA = playerA->getPlayerType(); auto typeB = playerB->getPlayerType(); if(typeA == Player::PlayerType::PLAYER) { // only one player so ShapeB must belong to an enemy log("leave enemy!"); playerB->setCanAttack(false); } if(typeB == Player::PlayerType::PLAYER) { // only one player so ShapeA must belong to an enemy log("leave enemy!"); playerA->setCanAttack(false); } }
bool CBullet::onContactBegin(PhysicsContact &contact) { auto nodeA = contact.getShapeA()->getBody()->getNode(); auto nodeB = contact.getShapeB()->getBody()->getNode(); if (nodeA && nodeB) { //bullet collision with enemy objects and wall objects if (nodeA->getTag() == BULLET_TAG && nodeB->getTag() == ENEMY_TAG) { nodeA->removeFromParentAndCleanup(true); } else if (nodeB->getTag() == BULLET_TAG && nodeA->getTag() == ENEMY_TAG) { nodeB->removeFromParentAndCleanup(true); } } return true; }
bool MainScene::onContactBegin(const PhysicsContact& contact) { auto playerA = (Player*)contact.getShapeA()->getBody()->getNode(); auto playerB = (Player*)contact.getShapeB()->getBody()->getNode(); auto typeA = playerA->getPlayerType(); auto typeB = playerB->getPlayerType(); if(typeA == Player::PlayerType::PLAYER) { // only one player so ShapeB must belong to an enemy log("contact enemy!"); playerB->setCanAttack(true); } if(typeB == Player::PlayerType::PLAYER) { // only one player so ShapeA must belong to an enemy log("contact enemy!"); playerA->setCanAttack(true); } return true; }
bool PlayMapSix::onContactBegin(PhysicsContact &contact) { switch (contact.getShapeA()->getBody()->getContactTestBitmask() | contact.getShapeB()->getBody()->getContactTestBitmask()) { //注意整个解决方法中各类中碰撞处理函数中的 case的值不要相同,同一个的碰撞只能有一个地方在处理 /*case ARROW_BIT_MASK | MONSTER1_BIT_MASK://箭射中怪物 { //dead->removeFromParentAndCleanup(true); MA1->removeFromParentAndCleanup(true); } break;*/ case ARROW_BIT_MASK|CAN_DISPEAR_BIT_MASK: { auto a = contact.getShapeA()->getBody()->getNode(); auto b = contact.getShapeB()->getBody()->getNode(); log("dispear!!!!!!!!!!!!!!!"); if (a != NULL) { long at = a->getTag();// tilemap->removeChildByTag(); if (UserDefault::getInstance()->getBoolForKey(SOUND_KEY)) { SimpleAudioEngine::getInstance()->playEffect(sound_5); } a->removeFromParentAndCleanup(true); log("at %d", at); long bt = b->getTag(); log("bt %d", bt); if (-1 < at < 10001) { do { tilemap->getLayer("collideLayer")->removeChildByTag(at); } while (tilemap->getLayer("collideLayer")->getChildByTag(at)); } } if (b!= NULL) { //long bt = b->getTag();// tilemap->removeChildByTag(); //b->removeFromParentAndCleanup(true); //log("bt %d", bt); //if (-1 < bt < 10001)tilemap->getLayer("pengzhuang")->removeChildByTag(bt); } }break; default: break; } return true; }
bool Enemy::onContactBegin(const PhysicsContact& contact) { log("Enemy::onContactBegin"); auto spriteA = (Sprite*)contact.getShapeA()->getBody()->getNode(); auto spriteB = (Sprite*)contact.getShapeB()->getBody()->getNode(); //log("TagA: %d; TagB: %d", spriteA->getTag(), spriteB->getTag()); //log("tagA.x = %f, tagA.y = %f, TagB.x = %f, TagB.y = %f", spriteA->getPosition().x, spriteA->getPosition().y, // spriteB->getPosition().x, spriteB->getPosition().y); if (spriteA->getTag() == TAG_ENEMY_BULLET && spriteB->getTag() == TAG_ACTOR) { spriteA->removeFromParent(); SimpleAudioEngine::getInstance()->playEffect(hit_fx_1); } else if (spriteB->getTag() == TAG_ENEMY_BULLET && spriteA->getTag() == TAG_ACTOR) { spriteB->removeFromParent(); SimpleAudioEngine::getInstance()->playEffect(hit_fx_1); } return true; }
void TollgateMapLayer::onContactSeperate(PhysicsContact& contact){ auto nodeA = contact.getShapeA()->getBody()->getNode(); auto nodeB = contact.getShapeB()->getBody()->getNode(); if (nodeA && nodeB){ auto tagA = nodeA->getTag(); auto tagB = nodeB->getTag(); if (tagA == MONSTERBODYTAG&&tagB == MONSTERTAG){ auto monster = (Entity*)nodeB; monster->setchangebodySpeed(0); } else if (tagA == MONSTERTAG&&tagB == MONSTERBODYTAG){ auto monster = (Entity*)nodeA; monster->setchangebodySpeed(0); } } }
bool MainScene::onContactBegin(const PhysicsContact& contact) { //auto playerA = (Player*)contact.getShapeA()->getBody()->getNode(); //auto playerB = (Player*)contact.getShapeB()->getBody()->getNode(); auto playerA = dynamic_cast<Player*>(contact.getShapeA()->getBody()->getNode()); auto playerB = dynamic_cast<Player*>(contact.getShapeB()->getBody()->getNode()); auto typeA = playerA->getPlayerType(); auto typeB = playerB->getPlayerType(); if (typeA == Player::PlayerType::PLAYER) { log("contact enemy!"); playerB->setCanAttack(true); playerA->addAttacker(playerB); } if (typeB == Player::PlayerType::PLAYER) { log("contact enemy!"); playerA->setCanAttack(true); playerB->addAttacker(playerA); } return true; }
bool GameScene::OnCollision(PhysicsContact& contact) { PhysicsBody *a = contact.getShapeA()->getBody(); PhysicsBody *b = contact.getShapeB()->getBody(); if ((a->getName() == "player" && b->getName() == "slowCar") || (b->getName() == "player" && a->getName() == "slowCar")) { SimpleAudioEngine::getInstance()->stopBackgroundMusic(); SimpleAudioEngine::getInstance()->playEffect("bomb.wav"); GoToGameOverScene(); } else if ((a->getName() == "player" && b->getName() == "spectacle") || (b->getName() == "player" && a->getName() == "spectacle")) { m_score += SCORE_INCREMENT; std::stringstream ss; ss << m_score; m_scoreLabel->setString("Score: " + ss.str()); } else if (a->getName() == "player" && b->getName() == "gas") { SimpleAudioEngine::getInstance()->playEffect("pickupBonus.wav"); m_gasoline += 3.0f; b->setName("empty"); RemoveBonus(); } else if (b->getName() == "player" && a->getName() == "gas") { SimpleAudioEngine::getInstance()->playEffect("pickupBonus.wav"); m_gasoline += 3.0f; a->setName("empty"); RemoveBonus(); } return false; }
bool PlayScene::onContactBegin(PhysicsContact &contact) { auto shapeA = contact.getShapeA(); auto shapeB = contact.getShapeB(); if ((shapeA->getCategoryBitmask() == objectBitmask::CHARACTER && shapeB->getCategoryBitmask() == objectBitmask::LASER) || (shapeB->getCategoryBitmask() == objectBitmask::CHARACTER && shapeA->getCategoryBitmask() == objectBitmask::LASER)) { // Đụng laser là chết, xử lý sau //isDead = true; isDead = true; } else { if ((shapeA->getCategoryBitmask() == objectBitmask::CHARACTER && shapeB->getCategoryBitmask() == objectBitmask::DIAMOND) || (shapeB->getCategoryBitmask() == objectBitmask::CHARACTER && shapeA->getCategoryBitmask() == objectBitmask::DIAMOND)) { // delete diamond listDiamond.back()->removeDiamond(); listDiamond.pop_back(); } if ((shapeA->getCategoryBitmask() == objectBitmask::CHARACTER && shapeB->getCategoryBitmask() == objectBitmask::BONUS) || (shapeB->getCategoryBitmask() == objectBitmask::CHARACTER && shapeA->getCategoryBitmask() == objectBitmask::BONUS)) { //listLightning.pop_back(); //listLightning.clear(); if (listLightning.empty() == false) { listLightning.back()->removeBonus(); listLightning.clear(); } } } return true; }
bool GameLayer::on(PhysicsContact& contact) { switch (contact.getShapeA()->getBody()->getContactTestBitmask()|contact.getShapeB()->getBody()->getContactTestBitmask()) { case BALL_MASK|WALL_MASK: { auto A = dynamic_cast<Bullet*>(contact.getShapeA()->getBody()->getNode()); auto B = dynamic_cast<Bullet*>(contact.getShapeB()->getBody()->getNode()); if (A==nullptr && B==nullptr) { return false; } Bullet* M; if (A==nullptr) { M=B; }else { M=A; } int a = M->getHp(); M->setHp(--a); if (M->getHp() ==0) { M->removeFromParent(); bulletArray.eraseObject(M); M=nullptr; } } break; default: break; log("子弹碰到墙壁"); } return true; }
bool PlayScene::onContactBegin(PhysicsContact& contact){ auto body_1 = (Sprite*)contact.getShapeA()->getBody()->getNode(); auto body_2 = (Sprite*)contact.getShapeB()->getBody()->getNode(); CCLOG("ssssss"); //if(body_1->getTag() == 5 || body_2->getTag() == 5) return true; //这里表示是要人物和岩石相撞 if((body_1->getTag() == 3 && body_2->getTag() == 1) || (body_1->getTag() == 1 && body_2->getTag() == 3) ){ GameOver(); } if(body_1->getTag() == 2){ body_1->setVisible(false); } if(body_2->getTag() == 2){ body_2->setVisible(false); } return false; }
bool CollisionDetectionLayer::onContactBegin(PhysicsContact& contact) { auto spA = (Sprite*)contact.getShapeA()->getBody()->getNode(); auto spB = (Sprite*)contact.getShapeB()->getBody()->getNode(); int tagA = spA->getTag(); int tagB = spB->getTag(); //检测坦克与子弹的碰撞 if (tagA == BulletTag && tagB == TankTag || tagA == TankTag && tagB == BulletTag) { //检测到碰撞后进行的处理. log("Tank and Bullet Contacted!"); } else if (tagA == BulletTag && tagB == TankTag || tagA == TankTag && tagB == BulletTag) { //检测到碰撞后进行的处理. log("Tank and Enemy Contacted!"); } return true; }
bool SceneGameMain::onContactBegin(EventCustom* event, const PhysicsContact& contact) { auto node = contact.getShapeA()->getBody()->getNode();// .node; if (node->getTag()==7) { log("is bird tag"); CManagerAudio::getInstance()->playBeginContact(); _eventDispatcher->removeEventListener(_touchListener); _touchListener = nullptr; } return true; }
Point Blocks::remove(const PhysicsContact &contact, Layer *layer) { float x = 0; float y = 0; if(BLOCKS_BITMASK == contact.getShapeA()->getBody()->getCollisionBitmask()) { x = contact.getShapeA()->getBody()->getPosition().x; y = contact.getShapeA()->getBody()->getPosition().y; contact.getShapeA()->getBody()->removeFromWorld(); layer->removeChild(contact.getShapeA()->getBody()->getNode()); } else { x = contact.getShapeB()->getBody()->getPosition().x; y = contact.getShapeB()->getBody()->getPosition().y; contact.getShapeB()->getBody()->removeFromWorld(); layer->removeChild(contact.getShapeB()->getBody()->getNode()); } return Point(x, y); }
bool Game1::onContactBegin(const PhysicsContact& contact) { Sprite* spriteA = (Sprite*)contact.getShapeA()->getBody()->getNode(); Sprite* spriteB = (Sprite*)contact.getShapeB()->getBody()->getNode(); int tagA = spriteA->getTag(); int tagB = spriteB->getTag(); if (tagA >= 3) { spriteA->removeFromParentAndCleanup(true); counts--; if (tagA == 3) { paddle->setScale(1.35f); } if (tagA == 4) { paddle->setScale(0.8f); } if (tagA == 5) { paddle->setScale(1.2f); } if (tagA == 10) { flag = 1; ba2 = Ball::create(); ba2->bindSprite(Sprite::create("Game/Level_1/ball.png")); this->addChild(ba2); ball2 = ba2->getSprite(); ball2->setPosition(100, 100); auto ballBody = PhysicsBody::createCircle(ball->getContentSize().width / 2.); ballBody->getShape(0)->setRestitution(1.0f); ballBody->getShape(0)->setFriction(0.0f); ballBody->getShape(0)->setDensity(1.0f); ballBody->setGravityEnable(false); Vect force = Vect(40000.0f, 40000.0f); ballBody->applyImpulse(force); ballBody->setCategoryBitmask(0x0001); ballBody->setCollisionBitmask(0x0001); ballBody->setContactTestBitmask(0x0001); ball2->setPhysicsBody(ballBody); ball2->setTag(1); ball2->setScale(1.1f); } } if (tagB >= 3) { spriteB->removeFromParentAndCleanup(true); counts--; if (tagB == 3) { paddle->setScale(1.35f); } if (tagB == 4) { paddle->setScale(0.8f); } if (tagB == 5) { paddle->setScale(1.2f); } if (tagB == 10) { flag = 1; ba2 = Ball::create(); ba2->bindSprite(Sprite::create("Game/Level_1/ball.png")); this->addChild(ba2); ball2 = ba2->getSprite(); ball2->setPosition(100, 100); auto ballBody = PhysicsBody::createCircle(ball->getContentSize().width / 2.); ballBody->getShape(0)->setRestitution(1.0f); ballBody->getShape(0)->setFriction(0.0f); ballBody->getShape(0)->setDensity(1.0f); ballBody->setGravityEnable(false); Vect force = Vect(40000.0f, 40000.0f); ballBody->applyImpulse(force); ballBody->setCategoryBitmask(0x0001); ballBody->setCollisionBitmask(0x0001); ballBody->setContactTestBitmask(0x0001); ball2->setPhysicsBody(ballBody); ball2->setTag(1); ball2->setScale(1.1f); } } return true; }
bool LevelFifteen::onContactBegin(const PhysicsContact& contact) { // 当碰撞的两个对象,是hero和吐出来的刚体的时候,处理 if (((contact.getShapeA()->getBody()->getCategoryBitmask() & 2) == 2) && ((contact.getShapeB()->getBody()->getCategoryBitmask() & 1) == 1)) { contact.getShapeA()->getBody()->getNode()->removeFromParent(); ++nTimes; test3->setString(String::createWithFormat("%d", nTimes)->getCString()); test3->setScale(2.0f); } if (((contact.getShapeA()->getBody()->getCategoryBitmask() & 1) == 1) && ((contact.getShapeB()->getBody()->getCategoryBitmask() & 2) == 2)) { contact.getShapeB()->getBody()->getNode()->removeFromParent(); ++nTimes; test3->setString(String::createWithFormat("%d", nTimes)->getCString()); test3->setScale(2.0f); } if (((contact.getShapeA()->getBody()->getCategoryBitmask() & 8) == 8) && ((contact.getShapeB()->getBody()->getCategoryBitmask() & 2) == 2)) { contact.getShapeB()->getBody()->getNode()->removeFromParent(); } if (((contact.getShapeA()->getBody()->getCategoryBitmask() & 2) == 2) && ((contact.getShapeB()->getBody()->getCategoryBitmask() & 8) == 8)) { contact.getShapeA()->getBody()->getNode()->removeFromParent(); } return true; }
bool gameLayer::onContactBegin(PhysicsContact& contact) { //if (cuttedState == 2) //{ // this->removeChildByTag(3151); // this->removeChildByTag(3152); // this->setSlashObj(); // this->addChild(slashObj); // // cuttedState = 0; // return true; //} //else if (cuttedState == 0) //{ // cuttedState++; // return false; //} //else // return true; auto nodeA = (Sprite*)contact.getShapeA()->getBody()->getNode(); auto nodeB = (Sprite*)contact.getShapeB()->getBody()->getNode(); if(nodeA->getTag() + nodeB->getTag() == 6303) return true; if(nodeA->getTag() == 3151 || nodeA->getTag() == 3152) this->removeChild(nodeA); string effect = "effect0.ogg"; int match; if(0.2-abs(matchRate-1) < 0) match = 0; else match = 1; switch (nodeA->getTag()) { case 3151: this->removeChild(nodeA); effect[6] = tar[1]*match + 48; SimpleAudioEngine::getInstance()->playEffect(effect.c_str()); break; case 3152: this->removeChild(nodeA); effect[6] = (tar[0]-tar[1])*match + 48; SimpleAudioEngine::getInstance()->playEffect(effect.c_str()); break; default: break; } switch (nodeB->getTag()) { case 3151: this->removeChild(nodeB); effect[6] = tar[1]*match + 48; SimpleAudioEngine::getInstance()->playEffect(effect.c_str()); break; case 3152: this->removeChild(nodeB); effect[6] = (tar[0]-tar[1])*match + 48; SimpleAudioEngine::getInstance()->playEffect(effect.c_str()); break; default: break; } if(this->getChildByTag(3151) == NULL && this->getChildByTag(3152) == NULL) { this->setSlashObj(); this->setTarget((float)this->tar[1], (float)this->tar[0]); this->addChild(slashObj); } return false; }