コード例 #1
0
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;
}
コード例 #2
0
ファイル: Demo.cpp プロジェクト: 1900zyh/SYSU_Win8App
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;
}
コード例 #3
0
ファイル: GameScene.cpp プロジェクト: kajaani/Konks
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));
	}
}
コード例 #4
0
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;
}
コード例 #5
0
ファイル: CCPhysicsWorld.cpp プロジェクト: 6520874/pipiGame
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();
}
コード例 #6
0
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;
}
コード例 #7
0
ファイル: ObjectLayer.cpp プロジェクト: dlakwwkd/WeaponCook
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;
}
コード例 #8
0
ファイル: Balloon.cpp プロジェクト: ricky-flyguy/RMZ_2014
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;
}
コード例 #9
0
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);
        }
        
    }
    
}
コード例 #10
0
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;
}
コード例 #11
0
ファイル: HelloWorldScene.cpp プロジェクト: JimmyCheung94/1
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;
}
コード例 #12
0
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;
}
コード例 #13
0
ファイル: MainScene.cpp プロジェクト: evamango/democpp36
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);
	}
}
コード例 #14
0
ファイル: MainScene.cpp プロジェクト: anyexxx/Brave_cpp
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);
	}
}
コード例 #15
0
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;
}
コード例 #16
0
ファイル: MainScene.cpp プロジェクト: anyexxx/Brave_cpp
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;
}
コード例 #17
0
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;
}
コード例 #18
0
ファイル: Enemy.cpp プロジェクト: dsdfc/BulletFight
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;
}
コード例 #19
0
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);
		}
	

	}
	
}
コード例 #20
0
ファイル: MainScene.cpp プロジェクト: evamango/democpp36
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;
}
コード例 #21
0
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;
}
コード例 #22
0
ファイル: PlayScene.cpp プロジェクト: Lana2114/Banana-Slug
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;
}
コード例 #23
0
ファイル: GameLayer.cpp プロジェクト: baokuanze/-
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;
    
}
コード例 #24
0
ファイル: PlayScene.cpp プロジェクト: ffpwserver/Parkour
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;
}
コード例 #25
0
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;
}
コード例 #26
0
ファイル: SceneGameMain.cpp プロジェクト: linml/FlyBirdCC3
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;
    
    
}
コード例 #27
0
ファイル: Blocks.cpp プロジェクト: 4an70m/FallingBlocks
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);
}
コード例 #28
0
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;
}
コード例 #29
0
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;
}
コード例 #30
0
ファイル: GameScene.cpp プロジェクト: z67798/Numic
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;
}