void PlaneProtect::ContactEff( Node* node, float radius, const Vec2& pos, float s, const Vec2& offset ) { Vec2 randPos = Vec2(pos.x + rand_minus1_1() * 80, pos.y + rand_minus1_1() * 80); //两点之间的连线,计算碰撞特效需要旋转的角度 Vec2 mypos = node->convertToWorldSpaceAR(Vec2::ZERO); Vec2 newVec = randPos - mypos; float angle = newVec.getAngle() * Pi2Angle; newVec.normalize(); newVec *= radius; auto size = node->getContentSize(); auto endPos =Vec2( size.width*0.5 + newVec.x, size.height*0.5 + newVec.y); endPos += offset; auto sp = Sprite::create("Effect/contactEff/contactEff.png"); sp->setPosition(endPos); sp->setRotation(90 - angle); node->addChild(sp); auto parti1 = EffectsManager::addParticle("particla/SpeedUpContact/SpeedUpContact.plist",node,endPos); if (parti1) { parti1->setScale(s); } ActionInterval* scale = ScaleTo::create(0.1f,(7.0 + rand_0_1()) * s,(2.0f + rand_0_1())*s); CallFuncN* func = CallFuncN::create(nullptr,callfuncN_selector(PlaneProtect::removeEff)); ActionInterval* seq = Sequence::create(scale, func, nullptr); sp->runAction(seq); }
Bullet* BulletFactory::createStrayBullet() { Bullet* bullet = Bullet::create(getResByTag(ResTag::defaultType)); bullet->setBitmask( SELF_AMMO_CATEGORYBITMASK, SELF_AMMO_COLLISIONBITMASK_P, SELF_AMMO_CONTACTTESTBITMASK); bullet->setUnitId(UnitId::eBullet_15); bullet->setBltFlySpeed(1000 + rand_minus1_1() * 100); bullet->resetHurt(-150000); bullet->setScale(1 + rand_minus1_1() * 0.2); //²¥·Å»ðÄñ¶¯» UIController::getInstance()->getEffectsLayer()->playFireBirdAnimation(bullet); return bullet; }
cocos2d::Vec2 BossTimeOut::randPos() { int randNum = cocos2d::random(0,20); if (randNum == m_curRandPos) { randPos(); } m_curRandPos = randNum; auto ws = Director::getInstance()->getWinSize(); return Vec2(ws.width/20 * randNum + rand_minus1_1() * 10, ws.height + 70); }
void WealthEffect::createEffect1(const char* spriteFrameName,int count,float scale,Vec2 startPoint,Vec2 stopPoint) { auto findIter=_animateMap.find(spriteFrameName); if (findIter==_animateMap.end()) return; Animate* animate=findIter->second; Sprite* effectSprite; Vec2 position; auto runningScene=Director::getInstance()->getRunningScene(); ExplosionData* explosionData; for (int i=0; i<count; ++i) { effectSprite=Sprite::create(); effectSprite->setScale(scale); runningScene->addChild(effectSprite,_localZOrder); position.x=startPoint.x+rand_minus1_1()*50; position.y=startPoint.y+rand_minus1_1()*20; explosionData=new ExplosionData; explosionData->_explosionSprite=effectSprite; explosionData->delayTime=0.03*rand_0_1(); explosionData->stage=0; explosionData->_animate=animate; explosionData->_startPoint=position; explosionData->_stopPoint=stopPoint; explosionData->ID=5; explosionData->_speed=Vec2(0,0); explosionData->_acceleration=Vec2(0,-2000);; position.y+=100; effectSprite->setPosition(position); _explosionDataVector.push_back(explosionData); } startEffect(); }