bool MonsterDevil::onContactBegin(cocos2d::PhysicsContact& contact) { auto bodyA = contact.getShapeA()->getBody(); auto bodyB = contact.getShapeB()->getBody(); auto componentA = (BaseComponent*)bodyA->getNode(); auto componentB = (BaseComponent*)bodyB->getNode(); BaseComponent* enemyComponent; bool isComponentA = true; //어떤것 끼리 부딪혔는지는 안가르쳐주기 때문에 //여기서 어느쪽이 monsterDevil인지 밝혀낸다. if (componentA->getType() == getType()) { enemyComponent = componentB; isComponentA = true; } else { enemyComponent = componentA; isComponentA = false; } //FLOOR 충돌 무시 if (enemyComponent->getType() == OT_FLOOR) { return false; } //미사일이랑 충돌 처리 if (enemyComponent->getPhysicsBody()->getCategoryBitmask() == PHYC_MISSILE) { Missile* missile = static_cast<Missile*>(enemyComponent); //수류탄은 뎀 안 입음 if (missile->getType() == OT_MISSILE_GRENADE) { return false; } //몹이 쏜 건 안 맞음. if (!missile->isPlayerMissile()) { return false; } float damage = missile->getDamage(); m_Info.m_CurrentHp -= damage * 100 / (100 + m_Info.m_DefensivePower); //사망 if (m_Info.m_CurrentHp <= 0) { m_IsDead = true; } } return true; }
bool RushPig::onContactBegin(cocos2d::PhysicsContact& contact) { auto bodyA = contact.getShapeA()->getBody(); auto bodyB = contact.getShapeB()->getBody(); auto componentA = (BaseComponent*)bodyA->getNode(); auto componentB = (BaseComponent*)bodyB->getNode(); BaseComponent* enemyComponent; bool isComponentA = true; if (componentA->getType() == getType()) { enemyComponent = componentB; isComponentA = true; } else { enemyComponent = componentA; isComponentA = false; } //미사일이랑 충돌 처리 if (enemyComponent->getPhysicsBody()->getCategoryBitmask() == PHYC_MISSILE) { Missile* missile = static_cast<Missile*>(enemyComponent); float damage = missile->getDamage(); m_Info.m_CurrentHp -= damage * 100 / (100 + m_Info.m_DefensivePower); cocos2d::log("HP : %d / %d", m_Info.m_CurrentHp, m_Info.m_MaxHp); //사망 if (m_Info.m_CurrentHp <= 0) { m_IsDead = true; } } return true; }
bool MonsterRush::onContactBegin(cocos2d::PhysicsContact& contact) { auto bodyA = contact.getShapeA()->getBody(); auto bodyB = contact.getShapeB()->getBody(); auto componentA = (BaseComponent*)bodyA->getNode(); auto componentB = (BaseComponent*)bodyB->getNode(); BaseComponent* enemyComponent; bool isComponentA = true; if (componentA->getType() == getType()) { enemyComponent = componentB; isComponentA = true; } else { enemyComponent = componentA; isComponentA = false; } //미사일이랑 충돌 처리 if (enemyComponent->getPhysicsBody()->getCategoryBitmask() == PHYC_MISSILE) { Missile* missile = static_cast<Missile*>(enemyComponent); //수류탄은 뎀 안 입음 if (missile->getType() == OT_MISSILE_GRENADE) { return false; } //몹이 쏜 건 안 맞음. if (!missile->isPlayerMissile()) { return false; } float damage = missile->getDamage(); m_Info.m_CurrentHp -= damage * 100 / (100 + m_Info.m_DefensivePower); //미사일에 의한 상태 이상 처리 if (missile->getState() == Missile::MST_KNOCKBACK) { GET_SOUND_MANAGER()->createSound(SoundManager::PIG, false); m_KnockbackStartTime = GET_GAME_MANAGER()->getMicroSecondTime(); if (missile->getAttackDir() == DIR_LEFT) { CommonState::enterKnockback(this, DIR_LEFT); } else { CommonState::enterKnockback(this, DIR_RIGHT); } setState(0,STAT_KNOCKBACK); } else if (missile->getState() == Missile::MST_BIND) { m_KnockbackStartTime = GET_GAME_MANAGER()->getMicroSecondTime(); getPhysicsBody()->setVelocity(cocos2d::Vect(0, 0)); setState(0,STAT_KNOCKBACK); } //사망 if (m_Info.m_CurrentHp <= 0) { m_IsDead = true; } } //플레이어랑 부딪친 경우 이펙트 생성 if (enemyComponent->getType() == OT_PLAYER) { GET_EFFECT_MANAGER()->createEffect(ET_PUNCH_MISSILE, enemyComponent->getPosition())->enter(); } return true; }