Hero::Hero(Game* game_n) : Sprite(game_n), Collidable(game_n) { game = game_n; setTileset("assets\\spaceship2.png"); setAnimation(LOOP, 0, 0, 12.f); flags |= ACTIVE; pos[1] += 300.f; AABB local; local.min.set(0.f, 0.f); local.max.set(INT_INFO(this, INT_SIZE_X), INT_INFO(this, INT_SIZE_Y)); Collidable::setParams(local, 40.f); game->addNode(this); shootDelay = 1.f; shootProj = 0; weapon = new ProjectileWeapon(game); weapon->setPositionLookup(&pos); weapon->setPositionTranslation(size+vec2(25.f, 7.5f)); setCollisionCallback(&colevent); colevent.hasCollided = false; shield = new Sprite(game); shield->setTileset("assets\\shield.png"); shield->setFrame(0); shield->flags &= ACTIVE; game->addNode(shield, this); shieldPower = 100.f; shieldShowTimer = 0.f; dying = false; score = 0; }
bool Physics3DCollisionCallbackDemo::init() { if (!Physics3DTestDemo::init()) return false; { Physics3DRigidBodyDes rbDes; float scale = 2.0f; std::vector<Vec3> trianglesList = Bundle3D::getTrianglesList("Sprite3DTest/boss.c3b"); for (auto& it : trianglesList) { it *= scale; } rbDes.mass = 0.0f; rbDes.shape = Physics3DShape::createMesh(&trianglesList[0], (int)trianglesList.size() / 3); auto rigidBody = Physics3DRigidBody::create(&rbDes); auto component = Physics3DComponent::create(rigidBody); auto sprite = Sprite3D::create("Sprite3DTest/boss.c3b"); sprite->addComponent(component); sprite->setRotation3D(Vec3(-90.0f, 0.0f, 0.0f)); sprite->setScale(scale); sprite->setCameraMask((unsigned short)CameraFlag::USER1); this->addChild(sprite); //preload // rigidBody->setCollisionCallback([=](const Physics3DCollisionInfo &ci){ if (!ci.collisionPointList.empty()){ if (ci.objA->getMask() != 0){ auto ps = PUParticleSystem3D::create("Particle3D/scripts/mp_hit_04.pu"); ps->setPosition3D(ci.collisionPointList[0].worldPositionOnB); ps->setScale(0.05f); ps->startParticleSystem(); ps->setCameraMask(2); this->addChild(ps); ps->runAction(Sequence::create(DelayTime::create(1.0f), CallFunc::create([=](){ ps->removeFromParent(); }), nullptr)); ci.objA->setMask(0); } } //CCLOG("------------BoxB Collision Info------------"); //CCLOG("Collision Point Num: %d", ci.collisionPointList.size()); //for (auto &iter : ci.collisionPointList){ // CCLOG("Collision Position On A: (%.2f, %.2f, %.2f)", iter.worldPositionOnA.x, iter.worldPositionOnA.y, iter.worldPositionOnA.z); // CCLOG("Collision Position On B: (%.2f, %.2f, %.2f)", iter.worldPositionOnB.x, iter.worldPositionOnB.y, iter.worldPositionOnB.z); // CCLOG("Collision Normal On B: (%.2f, %.2f, %.2f)", iter.worldNormalOnB.x, iter.worldNormalOnB.y, iter.worldNormalOnB.z); //} //CCLOG("------------BoxB Collision Info------------"); }); } physicsScene->setPhysics3DDebugCamera(_camera); return true; }
void Flag::setCollisionTriangleSelector(irr::scene::ISceneManager* a_SceneManager, irr::scene::ITriangleSelector* a_TriangleSelector) { auto animator = a_SceneManager->createCollisionResponseAnimator(a_TriangleSelector, m_FlagNode, { 1.25f, 1.f, 1.25f }); m_Collider = new Collider(animator); m_Collider->setCallback([this](irr::scene::ISceneNode* a_CollidedNode) { if(Player* player = dynamic_cast<Player*>(a_CollidedNode->getParent())) { captureFlag(player); return true; } else if(a_CollidedNode->getID() == 1) { //Failed to get player class from attached node. return true; } return false; }); animator->setCollisionCallback(m_Collider); m_FlagNode->addAnimator(animator); }