26#include "../testResource.h"
27#include "editor-support/cocostudio/CocosStudioExtension.h"
44 _emitter = ParticleFireworks::create();
48 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_stars1) );
55 return "ParticleFireworks";
72 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_fire) );
74 _emitter->setPosition( Vec2(p.x, 100.0f) );
81 return "ParticleFire";
97 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_fire) );
104 return "ParticleSun";
120 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_fire) );
141 return "Pause Particle";
153 _emitter = ParticleGalaxy::create();
157 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_fire) );
164 return "ParticleGalaxy";
176 _emitter = ParticleFlower::create();
179 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_stars1) );
186 return "ParticleFlower";
198 _emitter = ParticleSystemQuad::createWithTotalParticles(50);
203 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_stars1) );
227 _emitter->setPosition( Vec2(160,240) );
241 Color4F startColor(0.5f, 0.5f, 0.5f, 1.0f);
242 _emitter->setStartColor(startColor);
244 Color4F startColorVar(0.5f, 0.5f, 0.5f, 1.0f);
245 _emitter->setStartColorVar(startColorVar);
247 Color4F endColor(0.1f, 0.1f, 0.1f, 0.2f);
250 Color4F endColorVar(0.1f, 0.1f, 0.1f, 0.2f);
251 _emitter->setEndColorVar(endColorVar);
256 _emitter->setEndSize(ParticleSystem::START_SIZE_EQUAL_TO_END_SIZE);
269 return "ParticleBigFlower";
281 _emitter = ParticleSystemQuad::createWithTotalParticles(300);
286 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_stars2) );
311 _emitter->setPosition( Vec2(160,240) );
325 Color4F startColor(0.5f, 0.5f, 0.5f, 1.0f);
326 _emitter->setStartColor(startColor);
328 Color4F startColorVar(0.5f, 0.5f, 0.5f, 1.0f);
329 _emitter->setStartColorVar(startColorVar);
331 Color4F endColor(0.1f, 0.1f, 0.1f, 0.2f);
334 Color4F endColorVar(0.1f, 0.1f, 0.1f, 0.2f);
335 _emitter->setEndColorVar(endColorVar);
340 _emitter->setEndSize(ParticleSystem::START_SIZE_EQUAL_TO_END_SIZE);
353 return "ParticleRotFlower";
365 _emitter = ParticleMeteor::create();
369 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_fire) );
376 return "ParticleMeteor";
388 _emitter = ParticleSpiral::create();
392 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_fire) );
399 return "ParticleSpiral";
411 _emitter = ParticleExplosion::create();
415 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_stars1) );
417 _emitter->setAutoRemoveOnFinish(
true);
424 return "ParticleExplosion";
439 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_fire) );
442 _emitter->setPosition( Vec2( p.x, 100.0f) );
449 return "ParticleSmoke";
466 _emitter->setPosition( Vec2( p.x, p.y-110) );
471 _emitter->setGravity(Vec2(0.0f,-10.0f));
478 Color4F startColor =
_emitter->getStartColor();
482 _emitter->setStartColor(startColor);
484 Color4F startColorVar =
_emitter->getStartColorVar();
485 startColorVar.b = 0.1f;
486 _emitter->setStartColorVar(startColorVar);
490 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_snow) );
497 return "ParticleSnow";
514 _emitter->setPosition( Vec2( p.x, p.y-100) );
517 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_fire) );
524 return "ParticleRain";
538 _emitter = ParticleSystemQuad::createWithTotalParticles(1000);
544 auto s = Director::getInstance()->getWinSize();
550 _emitter->setGravity(Vec2(0.0f,0.0f));
569 _emitter->setPosition( Vec2( s.width/2, s.height/2) );
580 Color4F startColor(0.5f, 0.5f, 0.5f, 1.0f);
581 _emitter->setStartColor(startColor);
583 Color4F startColorVar(0.5f, 0.5f, 0.5f, 1.0f);
584 _emitter->setStartColorVar(startColorVar);
586 Color4F endColor(0.1f, 0.1f, 0.1f, 0.2f);
589 Color4F endColorVar(0.1f, 0.1f, 0.1f, 0.2f);
590 _emitter->setEndColorVar(endColorVar);
599 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_fire) );
609 return "Varying size";
621 _emitter = ParticleFlower::create();
626 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_stars1) );
653 auto p = ParallaxNode::create();
656 auto p1 = Sprite::create(
s_back3);
657 auto p2 = Sprite::create(
s_back3);
659 p->addChild( p1, 1, Vec2(0.5f,1.0f), Vec2(0.0f,250.0f) );
660 p->addChild(p2, 2, Vec2(1.5f,1.0f), Vec2(0.0f,50.0f) );
662 _emitter = ParticleFlower::create();
664 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_fire) );
667 _emitter->setPosition( Vec2(250,200) );
669 auto par = ParticleSun::create();
670 p2->addChild(par, 10);
671 par->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_fire) );
673 auto move = MoveBy::create(4, Vec2(300.0f,0.0f));
674 auto move_back = move->reverse();
675 auto seq = Sequence::create( move, move_back,
nullptr);
676 p->runAction(RepeatForever::create(seq));
681 return "Parallax + Particles";
693 _color->setColor(Color3B::BLACK);
697 _emitter = ParticleSystemQuad::createWithTotalParticles(200);
700 _emitter->setTexture(Director::getInstance()->getTextureCache()->addImage(
"Images/stars-grayscale.png"));
703 _emitter->setDuration(ParticleSystem::DURATION_INFINITY);
706 _emitter->setEmitterMode(ParticleSystem::Mode::RADIUS);
724 auto size = Director::getInstance()->getWinSize();
725 _emitter->setPosition(Vec2(size.width/2, size.height/2));
739 Color4F startColor(0.5f, 0.5f, 0.5f, 1.0f);
740 _emitter->setStartColor(startColor);
742 Color4F startColorVar(0.5f, 0.5f, 0.5f, 1.0f);
743 _emitter->setStartColorVar(startColorVar);
745 Color4F endColor(0.1f, 0.1f, 0.1f, 0.2f);
748 Color4F endColorVar(0.1f, 0.1f, 0.1f, 0.2f);
749 _emitter->setEndColorVar(endColorVar);
754 _emitter->setEndSize(ParticleSystem::START_SIZE_EQUAL_TO_END_SIZE);
765 return "Radius Mode: Spiral";
777 _color->setColor(Color3B::BLACK);
781 _emitter = ParticleSystemQuad::createWithTotalParticles(200);
784 _emitter->setTexture(Director::getInstance()->getTextureCache()->addImage(
"Images/stars-grayscale.png"));
787 _emitter->setDuration(ParticleSystem::DURATION_INFINITY);
790 _emitter->setEmitterMode(ParticleSystem::Mode::RADIUS);
795 _emitter->setEndRadius(ParticleSystem::START_RADIUS_EQUAL_TO_END_RADIUS);
808 auto size = Director::getInstance()->getWinSize();
809 _emitter->setPosition(Vec2(size.width/2, size.height/2));
823 Color4F startColor(0.5f, 0.5f, 0.5f, 1.0f);
824 _emitter->setStartColor(startColor);
826 Color4F startColorVar(0.5f, 0.5f, 0.5f, 1.0f);
827 _emitter->setStartColorVar(startColorVar);
829 Color4F endColor(0.1f, 0.1f, 0.1f, 0.2f);
832 Color4F endColorVar(0.1f, 0.1f, 0.1f, 0.2f);
833 _emitter->setEndColorVar(endColorVar);
838 _emitter->setEndSize(ParticleSystem::START_SIZE_EQUAL_TO_END_SIZE);
849 return "Radius Mode: Semi Circle";
861 _color->setColor(Color3B::BLACK);
865 _emitter = ParticleSystemQuad::createWithTotalParticles(100);
868 _emitter->setTexture(Director::getInstance()->getTextureCache()->addImage(
"Images/fire.png"));
871 _emitter->setDuration(ParticleSystem::DURATION_INFINITY);
874 _emitter->setEmitterMode(ParticleSystem::Mode::RADIUS);
879 _emitter->setEndRadius(ParticleSystem::START_RADIUS_EQUAL_TO_END_RADIUS);
892 auto size = Director::getInstance()->getWinSize();
893 _emitter->setPosition(Vec2(size.width/2, size.height/2));
907 Color4F startColor(0.5f, 0.5f, 0.5f, 1.0f);
908 _emitter->setStartColor(startColor);
910 Color4F startColorVar(0.5f, 0.5f, 0.5f, 1.0f);
911 _emitter->setStartColorVar(startColorVar);
913 Color4F endColor(0.1f, 0.1f, 0.1f, 0.2f);
916 Color4F endColorVar(0.1f, 0.1f, 0.1f, 0.2f);
917 _emitter->setEndColorVar(endColorVar);
922 _emitter->setEndSize(ParticleSystem::START_SIZE_EQUAL_TO_END_SIZE);
930 auto rot = RotateBy::create(16, 360);
931 _emitter->runAction(RepeatForever::create(rot));
936 return "Issue 704. Free + Rot";
941 return "Emitted particles should not rotate";
953 _color->setColor(Color3B::BLACK);
957 _emitter = ParticleSystemQuad::create(
"Particles/SpinningPeas.plist");
958 _emitter->setTextureWithRect(Director::getInstance()->getTextureCache()->addImage(
"Images/particles.png"), Rect(0,0,32,32));
969 auto rect = Rect(
_index * 32, 0, 32, 32);
970 auto system = (ParticleSystemQuad*)
_emitter;
971 system->setTextureWithRect(
_emitter->getTexture(), rect);
976 return "Issue 870. SubRect";
981 return "Every 2 seconds the particle should change";
993 _color->setColor(Color3B::BLACK);
997 std::string filename =
"Particles/" +
_title +
".plist";
998 _emitter = ParticleSystemQuad::create(filename);
1019ParticleTests::ParticleTests()
1087 MenuItemFont::setFontSize(32);
1089 _color = LayerColor::create( Color4B(127,127,127,255) );
1094 auto listener = EventListenerTouchAllAtOnce::create();
1098 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
this);
1100 auto s = Director::getInstance()->getWinSize();
1103 MenuItemFont::create(
"Free Movement" ),
1104 MenuItemFont::create(
"Relative Movement" ),
1105 MenuItemFont::create(
"Grouped Movement" ),
1108 auto menu = Menu::create(item4,
nullptr);
1110 menu->setPosition( Vec2::ZERO );
1112 item4->setAnchorPoint( Vec2(0,0) );
1114 addChild( menu, 100 );
1116 auto labelAtlas = LabelAtlas::create(
"0000",
"fps_images.png", 12, 32,
'.');
1118 labelAtlas->setPosition(Vec2(s.width-66,50.0f));
1123 _background->setPosition( Vec2(s.width/2, s.height-180) );
1125 auto move = MoveBy::create(4, Vec2(300,0) );
1126 auto move_back = move->reverse();
1127 auto seq = Sequence::create( move, move_back,
nullptr);
1128 _background->runAction( RepeatForever::create(seq) );
1136 return "Particle Demo";
1156 auto touch = touches[0];
1158 auto location = touch->getLocation();
1160 auto pos = Vec2::ZERO;
1163 pos =
_background->convertToWorldSpace(Vec2::ZERO);
1168 _emitter->setPosition(location -pos);
1178 sprintf(str,
"%04d",
_emitter->getParticleCount());
1179 atlas->setString(str);
1187 if (
_emitter->getPositionType() == ParticleSystem::PositionType::GROUPED)
1188 _emitter->setPositionType(ParticleSystem::PositionType::FREE);
1189 else if (
_emitter->getPositionType() == ParticleSystem::PositionType::FREE)
1190 _emitter->setPositionType(ParticleSystem::PositionType::RELATIVE);
1191 else if (
_emitter->getPositionType() == ParticleSystem::PositionType::RELATIVE)
1192 _emitter->setPositionType(ParticleSystem::PositionType::GROUPED );
1198 auto s = Director::getInstance()->getWinSize();
1201 _emitter->setPosition( Vec2(s.width / 2, s.height / 2) );
1211 _color->setColor(Color3B::BLACK);
1215 _emitter = ParticleSystemQuad::create(
"Particles/LavaFlow.plist");
1217 auto batch = ParticleBatchNode::createWithTexture(
_emitter->getTexture());
1221 addChild(batch, 10);
1225 auto node = Node::create();
1234 bool usingBatch = (
_emitter->getBatchNode() != nullptr );
1235 _emitter->removeFromParentAndCleanup(
false);
1240 log(
"Particle: Using new parent: %s", usingBatch ?
"CCNode" :
"CCParticleBatchNode");
1245 return "Particle Batch";
1250 return "Hybrid: batched and non batched every 2 seconds";
1259 _color->setColor(Color3B::BLACK);
1263 auto emitter1 = ParticleSystemQuad::create(
"Particles/LavaFlow.plist");
1264 emitter1->setStartColor(Color4F(1,0,0,1));
1265 auto emitter2 = ParticleSystemQuad::create(
"Particles/LavaFlow.plist");
1266 emitter2->setStartColor(Color4F(0,1,0,1));
1267 auto emitter3 = ParticleSystemQuad::create(
"Particles/LavaFlow.plist");
1268 emitter3->setStartColor(Color4F(0,0,1,1));
1270 auto s = Director::getInstance()->getWinSize();
1272 emitter1->setPosition(Vec2( s.width/1.25f, s.height/1.25f));
1273 emitter2->setPosition(Vec2( s.width/2, s.height/2));
1274 emitter3->setPosition(Vec2( s.width/4, s.height/4));
1276 auto batch = ParticleBatchNode::createWithTexture(emitter1->getTexture());
1278 batch->addChild(emitter1, 0);
1279 batch->addChild(emitter2, 0);
1280 batch->addChild(emitter3, 0);
1282 addChild(batch, 10);
1287 return "Particle Batch";
1292 return "Multiple emitters. One Batch";
1302 _color->setColor(Color3B::BLACK);
1306 auto ignore = ParticleSystemQuad::create(
"Particles/SmallSun.plist");
1307 auto parent1 = Node::create();
1308 auto parent2 = ParticleBatchNode::createWithTexture(ignore->getTexture());
1309 ignore->unscheduleUpdate();
1311 for(
unsigned int i=0; i<2;i++)
1313 auto parent = ( i==0 ? parent1 : parent2 );
1315 auto emitter1 = ParticleSystemQuad::create(
"Particles/SmallSun.plist");
1316 emitter1->setStartColor(Color4F(1,0,0,1));
1317 emitter1->setBlendAdditive(
false);
1318 auto emitter2 = ParticleSystemQuad::create(
"Particles/SmallSun.plist");
1319 emitter2->setStartColor(Color4F(0,1,0,1));
1320 emitter2->setBlendAdditive(
false);
1321 auto emitter3 = ParticleSystemQuad::create(
"Particles/SmallSun.plist");
1322 emitter3->setStartColor(Color4F(0,0,1,1));
1323 emitter3->setBlendAdditive(
false);
1325 auto s = Director::getInstance()->getWinSize();
1327 int neg = (i==0 ? 1 : -1 );
1329 emitter1->setPosition(Vec2( s.width/2-30, s.height/2+60*neg));
1330 emitter2->setPosition(Vec2( s.width/2, s.height/2+60*neg));
1331 emitter3->setPosition(Vec2( s.width/2+30, s.height/2+60*neg));
1333 parent->addChild(emitter1, 0, 1);
1334 parent->addChild(emitter2, 0, 2);
1335 parent->addChild(emitter3, 0, 3);
1337 addChild(parent, 10, 1000+i);
1345 return "Reordering particles";
1350 return "Reordering particles with and without batches batches";
1355 for(
int i=0; i<2;i++) {
1356 auto parent = getChildByTag(1000+i);
1358 auto child1 = parent->getChildByTag(1);
1359 auto child2 = parent->getChildByTag(2);
1360 auto child3 = parent->getChildByTag(3);
1363 parent->reorderChild(child1, 1);
1364 parent->reorderChild(child2, 2);
1365 parent->reorderChild(child3, 3);
1367 }
else if (
_order % 3 == 1 ) {
1368 parent->reorderChild(child1, 3);
1369 parent->reorderChild(child2, 1);
1370 parent->reorderChild(child3, 2);
1372 }
else if (
_order % 3 == 2 ) {
1373 parent->reorderChild(child1, 2);
1374 parent->reorderChild(child2, 3);
1375 parent->reorderChild(child3, 1);
1385 bool init()
override;
1387 virtual void update(
float dt)
override;
1397 if( ParticleSystemQuad::initWithTotalParticles(numberOfParticles) )
1400 setBlendAdditive(
false);
1403 setDuration(ParticleSystem::DURATION_INFINITY);
1406 setEmitterMode(ParticleSystem::Mode::GRAVITY);
1409 setGravity(Vec2(0.0f,0.0f));
1413 setRadialAccelVar(0);
1425 auto winSize = Director::getInstance()->getWinSize();
1426 setPosition(Vec2(winSize.width/2, winSize.height/2));
1427 setPosVar(Vec2::ZERO);
1434 setStartSize(25.0f);
1436 setEndSize(ParticleSystem::START_SIZE_EQUAL_TO_END_SIZE);
1439 setEmissionRate(getTotalParticles()/getLife());
1442 setStartColor(Color4F(Color4B(50, 50, 50, 50)));
1443 setEndColor(Color4F(Color4B(0, 0, 0, 0)));
1445 _startColorVar.r = 0.0f;
1446 _startColorVar.g = 0.0f;
1447 _startColorVar.b = 0.0f;
1448 _startColorVar.a = 0.0f;
1449 _endColorVar.r = 0.0f;
1450 _endColorVar.g = 0.0f;
1451 _endColorVar.b = 0.0f;
1452 _endColorVar.a = 0.0f;
1454 setTexture(Director::getInstance()->getTextureCache()->addImage(
"Images/particles.png"));
1464 ParticleSystemQuad::update(dt);
1472 _color->setColor(Color3B::BLACK);
1481 auto s = Director::getInstance()->getWinSize();
1483 particle->setPosition(Vec2(s.width/2, s.height/2));
1490 return "Issue 1201. Unfinished";
1495 return "Unfinished test. Ignore it";
1502 _color->setColor(Color3B::BLACK);
1506 Director::getInstance()->getTextureCache()->addImage(
"Images/particles.png");
1508 for (
int i = 0; i<5; i++) {
1509 auto particleSystem = ParticleSystemQuad::create(
"Particles/SpinningPeas.plist");
1511 particleSystem->setPosition(Vec2(i*50.0f,i*50.0f));
1513 particleSystem->setPositionType(ParticleSystem::PositionType::GROUPED);
1514 addChild(particleSystem);
1523 return "Multiple particle systems";
1528 return "v1.1 test: FPS should be lower than next test";
1535 unsigned int count = 0;
1537 for(
const auto &child : _children) {
1538 auto item =
dynamic_cast<ParticleSystem*
>(child);
1539 if (item !=
nullptr)
1541 count += item->getParticleCount();
1545 char str[100] = {0};
1546 sprintf(str,
"%4d", count);
1547 atlas->setString(str);
1556 _color->setColor(Color3B::BLACK);
1560 ParticleBatchNode *batchNode = ParticleBatchNode::createWithTexture(
nullptr, 3000);
1562 addChild(batchNode, 1, 2);
1564 for (
int i = 0; i<5; i++) {
1566 auto particleSystem = ParticleSystemQuad::create(
"Particles/SpinningPeas.plist");
1568 particleSystem->setPositionType(ParticleSystem::PositionType::GROUPED);
1569 particleSystem->setPosition(Vec2(i*50.0f,i*50.0f));
1571 batchNode->setTexture(particleSystem->getTexture());
1572 batchNode->addChild(particleSystem);
1584 auto batchNode = getChildByTag(2);
1585 for(
const auto &child : batchNode->getChildren()) {
1586 auto item =
dynamic_cast<ParticleSystem*
>(child);
1587 if (item !=
nullptr)
1589 count += item->getParticleCount();
1594 sprintf(str,
"%4d", count);
1595 atlas->setString(str);
1600 return "Multiple particle systems batched";
1605 return "v1.1 test: should perform better than previous test";
1614 _color->setColor(Color3B::BLACK);
1619 _batchNode = ParticleBatchNode::createWithTexture((Texture2D*)
nullptr, 16000);
1623 for (
int i = 0; i<6; i++) {
1625 auto particleSystem = ParticleSystemQuad::create(
"Particles/Spiral.plist");
1626 _batchNode->setTexture(particleSystem->getTexture());
1628 particleSystem->setPositionType(ParticleSystem::PositionType::GROUPED);
1629 particleSystem->setTotalParticles(200);
1631 particleSystem->setPosition(Vec2(i*15 +100.0f,i*15+100.0f));
1633 unsigned int randZ = rand() % 100;
1634 _batchNode->addChild(particleSystem, randZ, -1);
1645 ssize_t nChildrenCount =
_batchNode->getChildren().size();
1646 if (nChildrenCount > 0)
1648 CCLOG(
"remove random system");
1649 unsigned int uRand = rand() % (nChildrenCount - 1);
1652 auto particleSystem = ParticleSystemQuad::create(
"Particles/Spiral.plist");
1655 particleSystem->setPositionType(ParticleSystem::PositionType::GROUPED);
1656 particleSystem->setTotalParticles(200);
1658 particleSystem->setPosition(Vec2(rand() % 300 ,rand() % 400));
1660 CCLOG(
"add a new system");
1661 unsigned int randZ = rand() % 100;
1662 _batchNode->addChild(particleSystem, randZ, -1);
1672 auto batchNode = getChildByTag(2);
1673 for(
const auto &child : batchNode->getChildren()) {
1674 auto item =
dynamic_cast<ParticleSystem*
>(child);
1675 if (item !=
nullptr)
1677 count += item->getParticleCount();
1681 char str[100] = {0};
1682 sprintf(str,
"%4d", count);
1683 atlas->setString(str);
1688 return "Add and remove Particle System";
1693 return "v1.1 test: every 2 sec 1 system disappear, 1 appears";
1702 _color->setColor(Color3B::BLACK);
1706 _batchNode = ParticleBatchNode::create(
"Images/stars-grayscale.png" ,3000);
1711 for (
int i = 0; i<3; i++) {
1713 auto particleSystem = ParticleSystemQuad::createWithTotalParticles(200);
1714 particleSystem->retain();
1715 particleSystem->setTexture(
_batchNode->getTexture());
1718 particleSystem->setDuration(ParticleSystem::DURATION_INFINITY);
1721 particleSystem->setEmitterMode(ParticleSystem::Mode::RADIUS);
1724 particleSystem->setStartRadius(100);
1725 particleSystem->setStartRadiusVar(0);
1726 particleSystem->setEndRadius(ParticleSystem::START_RADIUS_EQUAL_TO_END_RADIUS);
1727 particleSystem->setEndRadiusVar(0);
1731 particleSystem->setRotatePerSecond(45);
1732 particleSystem->setRotatePerSecondVar(0);
1736 particleSystem->setAngle(90);
1737 particleSystem->setAngleVar(0);
1740 particleSystem->setPosVar(Vec2::ZERO);
1743 particleSystem->setLife(4);
1744 particleSystem->setLifeVar(0);
1747 particleSystem->setStartSpin(0);
1748 particleSystem->setStartSpinVar(0);
1749 particleSystem->setEndSpin(0);
1750 particleSystem->setEndSpinVar(0);
1753 float color[3] = {0,0,0};
1755 Color4F startColor(color[0], color[1], color[2], 1.0f);
1756 particleSystem->setStartColor(startColor);
1758 Color4F startColorVar(0, 0, 0, 0);
1759 particleSystem->setStartColorVar(startColorVar);
1761 Color4F endColor = startColor;
1762 particleSystem->setEndColor(endColor);
1764 Color4F endColorVar = startColorVar;
1765 particleSystem->setEndColorVar(endColorVar);
1768 particleSystem->setStartSize(32);
1769 particleSystem->setStartSizeVar(0);
1770 particleSystem->setEndSize(ParticleSystem::START_SIZE_EQUAL_TO_END_SIZE);
1773 particleSystem->setEmissionRate(particleSystem->getTotalParticles()/particleSystem->getLife());
1777 particleSystem->setPosition(Vec2(i*10+120.0f,200.0f));
1781 particleSystem->setPositionType(ParticleSystem::PositionType::FREE);
1783 particleSystem->release();
1796 auto system =
static_cast<ParticleSystem*
>(
_batchNode->getChildren().at(1));
1797 _batchNode->reorderChild(system, system->getLocalZOrder() - 1);
1807 auto batchNode = getChildByTag(2);
1808 for(
const auto &child : batchNode->getChildren()) {
1809 auto item =
dynamic_cast<ParticleSystem*
>(child);
1810 if (item !=
nullptr)
1812 count += item->getParticleCount();
1815 char str[100] = {0};
1816 sprintf(str,
"%4d", count);
1817 atlas->setString(str);
1822 return "reorder systems";
1827 return "changes every 2 seconds";
1834 return "premultiplied alpha and readd child test";
1839 return "no black halo, particles should fade out\n animation should be normal";
1860 _color->setColor(Color3B::BLUE);
1864 _emitter = ParticleSystemQuad::create(
"Particles/BoilingFoam.plist");
1870 _emitter->setBlendFunc( BlendFunc::ALPHA_PREMULTIPLIED );
1872 CCASSERT(
_emitter->isOpacityModifyRGB(),
"Particle texture does not have premultiplied alpha, test is useless");
1877 _emitter->setStartColor(Color4F(1.0f, 1.0f, 1.0f, 1.0f));
1878 _emitter->setEndColor(Color4F(1.0f, 1.0f, 1.0f, 0.0f));
1879 _emitter->setStartColorVar(Color4F(0.0f, 0.0f, 0.0f, 0.0f));
1880 _emitter->setEndColorVar(Color4F(0.0f, 0.0f, 0.0f, 0.0f));
1894 _color->setColor(Color3B::BLACK);
1898 _emitter = ParticleSystemQuad::create(
"Particles/TestPremultipliedAlpha.plist");
1905 return "premultiplied alpha 2";
1910 return "Arrows should be faded";
1920 _color->setColor(Color3B::BLACK);
1924 _emitter = ParticleSystemQuad::create(
"Particles/Spiral.plist");
1926 _emitter->setPositionType(ParticleSystem::PositionType::GROUPED);
1937 return "Issue3990, setTotalParticle should work";
1942 return "Show '998' or '999' at bottom right side";
1951 _emitter = ParticleFireworks::create();
1955 _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(
s_stars1) );
1969 return "Visible enable/disable";
1984 _color->setColor(Color3B::BLACK);
1988 Size s = Director::getInstance()->getWinSize();
1990 for(
int i=0; i<10; i++) {
1991 auto particle = ParticleSystemQuad::create(
"Particles/SmallSun.plist");
1992 particle->setTotalParticles(100);
1993 particle->setPosition(Vec2(i*s.width/11, s.height/2));
1994 this->addChild(particle ,10);
2000 return "AutoBatching";
2005 return "All 10 particles should be drawin in one batch";
2016 _color->setColor(Color3B::BLACK);
2020 auto p = ParticleFire::createWithTotalParticles(10);
2023 auto add = MenuItemFont::create(
"add 10 particles",
2026 p->setTotalParticles(p->getTotalParticles() + 10 );
2028 add->setFontSizeObj(20);
2029 add->setPosition(Vec2(0, 25));
2031 auto remove = MenuItemFont::create(
"remove 10 particles",
2034 int count = p->getTotalParticles() - 10;
2035 if (count < 0) { count = 0; }
2036 p->setTotalParticles(count);
2038 remove->setPosition(Vec2(0, -25));
2039 remove->setFontSizeObj(20);
2041 auto menu = Menu::create(add, remove,
nullptr);
2043 this->addChild(menu);
2049 return "reset total particles";
2054 return "it should work as well";
2061 _color->setColor(Color3B::BLACK);
2065 auto winSize = Director::getInstance()->getWinSize();
2067 auto particle = ParticleSystemQuad::create(
"Particles/BoilingFoam.plist");
2068 particle->setPosition(Vec2(winSize.width * 0.35f, winSize.height * 0.5f));
2074 auto particle2 = ParticleSystemQuad::create(
"Particles/BoilingFoamStar.plist");
2075 particle2->setPosition(Vec2(winSize.width * 0.65f, winSize.height * 0.5f));
2076 addChild(particle2);
2081 return "You should see two Particle Emitters using different texture.";
2093 _emitter = ParticleSmoke::create();
2097 SpriteFrameCache::getInstance()->addSpriteFramesWithFile(
"Particles/SpriteFrame.plist");
2099 _emitter->setDisplayFrame( SpriteFrameCache::getInstance()->getSpriteFrameByName(
"dot.png") );
2106 return "Particle from SpriteFrame";
2111 return "Should not use entire texture atlas";
#define ADD_TEST_CASE(__className__)
cocos2d::ParticleBatchNode * _batchNode
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void update(float dt) override
void removeSystem(float dt)
virtual std::string title() const override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
static DemoParticleFromFile * create(const std::string &file)
virtual std::string subtitle() const override
void pauseEmitter(float time)
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string title() const override
virtual std::string title() const override
virtual std::string subtitle() const override
void updateQuads(float dt)
virtual void onEnter() override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void update(float dt) override
virtual std::string title() const override
virtual std::string title() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void update(float dt) override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string title() const override
virtual std::string subtitle() const override
void switchRender(float dt)
virtual void onEnter() override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual std::string title() const override
void onTouchesMoved(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
virtual void update(float dt) override
cocos2d::Sprite * _background
virtual void onEnter() override
void onTouchesEnded(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
void toggleCallback(cocos2d::Ref *sender)
virtual std::string subtitle() const override
cocos2d::ParticleSystemQuad * _emitter
cocos2d::LayerColor * _color
virtual std::string title() const override
void onTouchesBegan(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
void setEmitterPosition()
virtual std::string subtitle() const override
virtual void onEnter() override
virtual void onEnter() override
virtual std::string title() const override
void reorderParticles(float dt)
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onEnter() override
virtual std::string subtitle() const override
void callback(float delta)
virtual void onEnter() override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onEnter() override
void readdParticle(float delta)
virtual void onEnter() override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void update(float dt) override
virtual bool initWithTotalParticles(int numberOfParticles) override
virtual void onEnter() override
virtual void update(float dt) override
virtual std::string subtitle() const override
void reorderSystem(float time)
cocos2d::ParticleBatchNode * _batchNode
virtual std::string title() const override
virtual void onEnter() override
static cocos2d::Vec2 center()
static cocos2d::Vec2 bottom()
static cocos2d::Vec2 left()
static const char s_fire[]
static const char s_back3[]
static const char s_stars1[]
static const char s_stars2[]
static const char s_snow[]