CCTransition.cpp 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758
  1. /****************************************************************************
  2. Copyright (c) 2009-2010 Ricardo Quesada
  3. Copyright (c) 2010-2012 cocos2d-x.org
  4. Copyright (c) 2011 Zynga Inc.
  5. Copyright (c) 2013-2017 Chukong Technologies Inc.
  6. http://www.cocos2d-x.org
  7. Permission is hereby granted, free of charge, to any person obtaining a copy
  8. of this software and associated documentation files (the "Software"), to deal
  9. in the Software without restriction, including without limitation the rights
  10. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. copies of the Software, and to permit persons to whom the Software is
  12. furnished to do so, subject to the following conditions:
  13. The above copyright notice and this permission notice shall be included in
  14. all copies or substantial portions of the Software.
  15. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. THE SOFTWARE.
  22. ****************************************************************************/
  23. #include "2d/CCTransition.h"
  24. #include "2d/CCActionInterval.h"
  25. #include "2d/CCActionInstant.h"
  26. #include "2d/CCActionEase.h"
  27. #include "2d/CCActionCamera.h"
  28. #include "2d/CCActionTiledGrid.h"
  29. #include "2d/CCActionGrid.h"
  30. #include "2d/CCLayer.h"
  31. #include "2d/CCRenderTexture.h"
  32. #include "2d/CCNodeGrid.h"
  33. #include "base/CCDirector.h"
  34. #include "base/CCEventDispatcher.h"
  35. NS_CC_BEGIN
  36. const unsigned int kSceneFade = 0xFADEFADE;
  37. TransitionScene::TransitionScene()
  38. : _inScene(nullptr)
  39. , _outScene(nullptr)
  40. , _duration(0.0f)
  41. , _isInSceneOnTop(false)
  42. , _isSendCleanupToScene(false)
  43. {
  44. }
  45. TransitionScene::~TransitionScene()
  46. {
  47. CC_SAFE_RELEASE(_inScene);
  48. CC_SAFE_RELEASE(_outScene);
  49. }
  50. TransitionScene * TransitionScene::create(float t, Scene *scene)
  51. {
  52. TransitionScene * pScene = new (std::nothrow) TransitionScene();
  53. if(pScene && pScene->initWithDuration(t,scene))
  54. {
  55. pScene->autorelease();
  56. return pScene;
  57. }
  58. CC_SAFE_DELETE(pScene);
  59. return nullptr;
  60. }
  61. bool TransitionScene::initWithDuration(float t, Scene *scene)
  62. {
  63. CCASSERT(scene != nullptr, "Argument scene must be non-nil");
  64. if (Scene::init())
  65. {
  66. _duration = t;
  67. // retain
  68. #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  69. auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
  70. if (sEngine)
  71. {
  72. sEngine->retainScriptObject(this, scene);
  73. }
  74. #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  75. _inScene = scene;
  76. _inScene->retain();
  77. _outScene = Director::getInstance()->getRunningScene();
  78. if (_outScene == nullptr)
  79. {
  80. _outScene = Scene::create();
  81. // just change its state is running that can run actoins later
  82. // issue: https://github.com/cocos2d/cocos2d-x/issues/17442
  83. _outScene->onEnter();
  84. }
  85. _outScene->retain();
  86. CCASSERT( _inScene != _outScene, "Incoming scene must be different from the outgoing scene" );
  87. sceneOrder();
  88. return true;
  89. }
  90. else
  91. {
  92. return false;
  93. }
  94. }
  95. void TransitionScene::sceneOrder()
  96. {
  97. _isInSceneOnTop = true;
  98. }
  99. void TransitionScene::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
  100. {
  101. Scene::draw(renderer, transform, flags);
  102. if( _isInSceneOnTop ) {
  103. _outScene->visit(renderer, transform, flags);
  104. _inScene->visit(renderer, transform, flags);
  105. } else {
  106. _inScene->visit(renderer, transform, flags);
  107. _outScene->visit(renderer, transform, flags);
  108. }
  109. }
  110. void TransitionScene::finish()
  111. {
  112. // clean up
  113. _inScene->setVisible(true);
  114. _inScene->setPosition(0,0);
  115. _inScene->setScale(1.0f);
  116. _inScene->setRotation(0.0f);
  117. _inScene->setAdditionalTransform(nullptr);
  118. _outScene->setVisible(false);
  119. _outScene->setPosition(0,0);
  120. _outScene->setScale(1.0f);
  121. _outScene->setRotation(0.0f);
  122. _outScene->setAdditionalTransform(nullptr);
  123. //[self schedule:@selector(setNewScene:) interval:0];
  124. this->schedule(CC_SCHEDULE_SELECTOR(TransitionScene::setNewScene), 0);
  125. }
  126. void TransitionScene::setNewScene(float /*dt*/)
  127. {
  128. this->unschedule(CC_SCHEDULE_SELECTOR(TransitionScene::setNewScene));
  129. // Before replacing, save the "send cleanup to scene"
  130. Director *director = Director::getInstance();
  131. _isSendCleanupToScene = director->isSendCleanupToScene();
  132. director->replaceScene(_inScene);
  133. #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  134. auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
  135. if (sEngine)
  136. {
  137. sEngine->releaseScriptObject(this, _inScene);
  138. }
  139. #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  140. // issue #267
  141. _outScene->setVisible(true);
  142. }
  143. void TransitionScene::hideOutShowIn()
  144. {
  145. _inScene->setVisible(true);
  146. _outScene->setVisible(false);
  147. }
  148. // custom onEnter
  149. void TransitionScene::onEnter()
  150. {
  151. #if CC_ENABLE_SCRIPT_BINDING
  152. if (_scriptType == kScriptTypeJavascript)
  153. {
  154. if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnEnter))
  155. return;
  156. }
  157. #endif // #if CC_ENABLE_SCRIPT_BINDING
  158. Scene::onEnter();
  159. // disable events while transitions
  160. _eventDispatcher->setEnabled(false);
  161. // outScene should not receive the onEnter callback
  162. // only the onExitTransitionDidStart
  163. _outScene->onExitTransitionDidStart();
  164. _inScene->onEnter();
  165. }
  166. // custom onExit
  167. void TransitionScene::onExit()
  168. {
  169. #if CC_ENABLE_SCRIPT_BINDING
  170. if (_scriptType == kScriptTypeJavascript)
  171. {
  172. if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnExit))
  173. return;
  174. }
  175. #endif // #if CC_ENABLE_SCRIPT_BINDING
  176. Scene::onExit();
  177. // enable events while transitions
  178. _eventDispatcher->setEnabled(true);
  179. _outScene->onExit();
  180. // _inScene should not receive the onEnter callback
  181. // only the onEnterTransitionDidFinish
  182. _inScene->onEnterTransitionDidFinish();
  183. #if CC_ENABLE_SCRIPT_BINDING
  184. if (ScriptEngineManager::getInstance()->getScriptEngine())
  185. ScriptEngineManager::getInstance()->getScriptEngine()->garbageCollect();
  186. #endif // CC_ENABLE_SCRIPT_BINDING
  187. }
  188. // custom cleanup
  189. void TransitionScene::cleanup()
  190. {
  191. #if CC_ENABLE_SCRIPT_BINDING
  192. if (_scriptType == kScriptTypeJavascript)
  193. {
  194. if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnCleanup))
  195. return;
  196. }
  197. #endif // #if CC_ENABLE_SCRIPT_BINDING
  198. Scene::cleanup();
  199. if( _isSendCleanupToScene )
  200. _outScene->cleanup();
  201. }
  202. //
  203. // Oriented Transition
  204. //
  205. TransitionSceneOriented::TransitionSceneOriented()
  206. {
  207. }
  208. TransitionSceneOriented::~TransitionSceneOriented()
  209. {
  210. }
  211. TransitionSceneOriented * TransitionSceneOriented::create(float t, Scene *scene, Orientation orientation)
  212. {
  213. TransitionSceneOriented * newScene = new (std::nothrow) TransitionSceneOriented();
  214. newScene->initWithDuration(t,scene,orientation);
  215. newScene->autorelease();
  216. return newScene;
  217. }
  218. bool TransitionSceneOriented::initWithDuration(float t, Scene *scene, Orientation orientation)
  219. {
  220. if ( TransitionScene::initWithDuration(t, scene) )
  221. {
  222. _orientation = orientation;
  223. }
  224. return true;
  225. }
  226. //
  227. // RotoZoom
  228. //
  229. TransitionRotoZoom::TransitionRotoZoom()
  230. {
  231. }
  232. TransitionRotoZoom* TransitionRotoZoom::create(float t, Scene* scene)
  233. {
  234. TransitionRotoZoom* newScene = new (std::nothrow) TransitionRotoZoom();
  235. if(newScene && newScene->initWithDuration(t, scene))
  236. {
  237. newScene->autorelease();
  238. return newScene;
  239. }
  240. CC_SAFE_DELETE(newScene);
  241. return nullptr;
  242. }
  243. TransitionRotoZoom::~TransitionRotoZoom()
  244. {
  245. }
  246. void TransitionRotoZoom:: onEnter()
  247. {
  248. TransitionScene::onEnter();
  249. _inScene->setScale(0.001f);
  250. _outScene->setScale(1.0f);
  251. _inScene->setAnchorPoint(Vec2(0.5f, 0.5f));
  252. _outScene->setAnchorPoint(Vec2(0.5f, 0.5f));
  253. auto rotozoom = Sequence::create
  254. (
  255. Spawn::create
  256. (
  257. ScaleBy::create(_duration/2, 0.001f),
  258. RotateBy::create(_duration/2, 360 * 2),
  259. nullptr
  260. ),
  261. DelayTime::create(_duration/2),
  262. nullptr
  263. );
  264. _outScene->runAction(rotozoom);
  265. _inScene->runAction
  266. (
  267. Sequence::create
  268. (
  269. rotozoom->reverse(),
  270. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  271. nullptr
  272. )
  273. );
  274. }
  275. //
  276. // JumpZoom
  277. //
  278. TransitionJumpZoom::TransitionJumpZoom()
  279. {
  280. }
  281. TransitionJumpZoom::~TransitionJumpZoom()
  282. {
  283. }
  284. TransitionJumpZoom* TransitionJumpZoom::create(float t, Scene* scene)
  285. {
  286. TransitionJumpZoom* newScene = new (std::nothrow) TransitionJumpZoom();
  287. if(newScene && newScene->initWithDuration(t, scene))
  288. {
  289. newScene->autorelease();
  290. return newScene;
  291. }
  292. CC_SAFE_DELETE(newScene);
  293. return nullptr;
  294. }
  295. void TransitionJumpZoom::onEnter()
  296. {
  297. TransitionScene::onEnter();
  298. Size s = Director::getInstance()->getWinSize();
  299. _inScene->setScale(0.5f);
  300. _inScene->setPosition(s.width, 0);
  301. _inScene->setAnchorPoint(Vec2(0.5f, 0.5f));
  302. _outScene->setAnchorPoint(Vec2(0.5f, 0.5f));
  303. ActionInterval *jump = JumpBy::create(_duration/4, Vec2(-s.width,0), s.width/4, 2);
  304. ActionInterval *scaleIn = ScaleTo::create(_duration/4, 1.0f);
  305. ActionInterval *scaleOut = ScaleTo::create(_duration/4, 0.5f);
  306. auto jumpZoomOut = Sequence::create(scaleOut, jump, nullptr);
  307. auto jumpZoomIn = Sequence::create(jump, scaleIn, nullptr);
  308. ActionInterval *delay = DelayTime::create(_duration/2);
  309. _outScene->runAction(jumpZoomOut);
  310. _inScene->runAction
  311. (
  312. Sequence::create
  313. (
  314. delay,
  315. jumpZoomIn,
  316. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  317. nullptr
  318. )
  319. );
  320. }
  321. //
  322. // MoveInL
  323. //
  324. TransitionMoveInL::TransitionMoveInL()
  325. {
  326. }
  327. TransitionMoveInL::~TransitionMoveInL()
  328. {
  329. }
  330. TransitionMoveInL* TransitionMoveInL::create(float t, Scene* scene)
  331. {
  332. TransitionMoveInL* newScene = new (std::nothrow) TransitionMoveInL();
  333. if(newScene && newScene->initWithDuration(t, scene))
  334. {
  335. newScene->autorelease();
  336. return newScene;
  337. }
  338. CC_SAFE_DELETE(newScene);
  339. return nullptr;
  340. }
  341. void TransitionMoveInL::onEnter()
  342. {
  343. TransitionScene::onEnter();
  344. this->initScenes();
  345. ActionInterval *a = this->action();
  346. _inScene->runAction
  347. (
  348. Sequence::create
  349. (
  350. this->easeActionWithAction(a),
  351. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  352. nullptr
  353. )
  354. );
  355. }
  356. ActionInterval* TransitionMoveInL::action()
  357. {
  358. return MoveTo::create(_duration, Vec2(0,0));
  359. }
  360. ActionInterval* TransitionMoveInL::easeActionWithAction(ActionInterval* action)
  361. {
  362. return EaseOut::create(action, 2.0f);
  363. // return [EaseElasticOut actionWithAction:action period:0.4f];
  364. }
  365. void TransitionMoveInL::initScenes()
  366. {
  367. Size s = Director::getInstance()->getWinSize();
  368. _inScene->setPosition(-s.width,0);
  369. }
  370. //
  371. // MoveInR
  372. //
  373. TransitionMoveInR::TransitionMoveInR()
  374. {
  375. }
  376. TransitionMoveInR::~TransitionMoveInR()
  377. {
  378. }
  379. TransitionMoveInR* TransitionMoveInR::create(float t, Scene* scene)
  380. {
  381. TransitionMoveInR* newScene = new (std::nothrow) TransitionMoveInR();
  382. if(newScene && newScene->initWithDuration(t, scene))
  383. {
  384. newScene->autorelease();
  385. return newScene;
  386. }
  387. CC_SAFE_DELETE(newScene);
  388. return nullptr;
  389. }
  390. void TransitionMoveInR::initScenes()
  391. {
  392. Size s = Director::getInstance()->getWinSize();
  393. _inScene->setPosition(s.width,0);
  394. }
  395. //
  396. // MoveInT
  397. //
  398. TransitionMoveInT::TransitionMoveInT()
  399. {
  400. }
  401. TransitionMoveInT::~TransitionMoveInT()
  402. {
  403. }
  404. TransitionMoveInT* TransitionMoveInT::create(float t, Scene* scene)
  405. {
  406. TransitionMoveInT* newScene = new (std::nothrow) TransitionMoveInT();
  407. if(newScene && newScene->initWithDuration(t, scene))
  408. {
  409. newScene->autorelease();
  410. return newScene;
  411. }
  412. CC_SAFE_DELETE(newScene);
  413. return nullptr;
  414. }
  415. void TransitionMoveInT::initScenes()
  416. {
  417. Size s = Director::getInstance()->getWinSize();
  418. _inScene->setPosition(0,s.height);
  419. }
  420. //
  421. // MoveInB
  422. //
  423. TransitionMoveInB::TransitionMoveInB()
  424. {
  425. }
  426. TransitionMoveInB::~TransitionMoveInB()
  427. {
  428. }
  429. TransitionMoveInB* TransitionMoveInB::create(float t, Scene* scene)
  430. {
  431. TransitionMoveInB* newScene = new (std::nothrow) TransitionMoveInB();
  432. if(newScene && newScene->initWithDuration(t, scene))
  433. {
  434. newScene->autorelease();
  435. return newScene;
  436. }
  437. CC_SAFE_DELETE(newScene);
  438. return nullptr;
  439. }
  440. void TransitionMoveInB::initScenes()
  441. {
  442. Size s = Director::getInstance()->getWinSize();
  443. _inScene->setPosition(0,-s.height);
  444. }
  445. //
  446. // SlideInL
  447. //
  448. // The adjust factor is needed to prevent issue #442
  449. // One solution is to use DONT_RENDER_IN_SUBPIXELS images, but NO
  450. // The other issue is that in some transitions (and I don't know why)
  451. // the order should be reversed (In in top of Out or vice-versa).
  452. #define ADJUST_FACTOR 0.5f
  453. TransitionSlideInL::TransitionSlideInL()
  454. {
  455. }
  456. TransitionSlideInL::~TransitionSlideInL()
  457. {
  458. }
  459. void TransitionSlideInL::onEnter()
  460. {
  461. TransitionScene::onEnter();
  462. this->initScenes();
  463. ActionInterval *in = this->action();
  464. ActionInterval *out = this->action();
  465. ActionInterval* inAction = easeActionWithAction(in);
  466. ActionInterval* outAction = Sequence::create
  467. (
  468. easeActionWithAction(out),
  469. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  470. nullptr
  471. );
  472. _inScene->runAction(inAction);
  473. _outScene->runAction(outAction);
  474. }
  475. void TransitionSlideInL::sceneOrder()
  476. {
  477. _isInSceneOnTop = false;
  478. }
  479. void TransitionSlideInL:: initScenes()
  480. {
  481. Size s = Director::getInstance()->getWinSize();
  482. _inScene->setPosition(-(s.width-ADJUST_FACTOR),0);
  483. }
  484. ActionInterval* TransitionSlideInL::action()
  485. {
  486. Size s = Director::getInstance()->getWinSize();
  487. return MoveBy::create(_duration, Vec2(s.width-ADJUST_FACTOR,0));
  488. }
  489. ActionInterval* TransitionSlideInL::easeActionWithAction(ActionInterval* action)
  490. {
  491. return EaseOut::create(action, 2.0f);
  492. }
  493. TransitionSlideInL* TransitionSlideInL::create(float t, Scene* scene)
  494. {
  495. TransitionSlideInL* newScene = new (std::nothrow) TransitionSlideInL();
  496. if(newScene && newScene->initWithDuration(t, scene))
  497. {
  498. newScene->autorelease();
  499. return newScene;
  500. }
  501. CC_SAFE_DELETE(newScene);
  502. return nullptr;
  503. }
  504. //
  505. // SlideInR
  506. //
  507. TransitionSlideInR::TransitionSlideInR()
  508. {
  509. }
  510. TransitionSlideInR::~TransitionSlideInR()
  511. {
  512. }
  513. TransitionSlideInR* TransitionSlideInR::create(float t, Scene* scene)
  514. {
  515. TransitionSlideInR* newScene = new (std::nothrow) TransitionSlideInR();
  516. if(newScene && newScene->initWithDuration(t, scene))
  517. {
  518. newScene->autorelease();
  519. return newScene;
  520. }
  521. CC_SAFE_DELETE(newScene);
  522. return nullptr;
  523. }
  524. void TransitionSlideInR::sceneOrder()
  525. {
  526. _isInSceneOnTop = true;
  527. }
  528. void TransitionSlideInR::initScenes()
  529. {
  530. Size s = Director::getInstance()->getWinSize();
  531. _inScene->setPosition(s.width-ADJUST_FACTOR,0);
  532. }
  533. ActionInterval* TransitionSlideInR:: action()
  534. {
  535. Size s = Director::getInstance()->getWinSize();
  536. return MoveBy::create(_duration, Vec2(-(s.width-ADJUST_FACTOR),0));
  537. }
  538. //
  539. // SlideInT
  540. //
  541. TransitionSlideInT::TransitionSlideInT()
  542. {
  543. }
  544. TransitionSlideInT::~TransitionSlideInT()
  545. {
  546. }
  547. TransitionSlideInT* TransitionSlideInT::create(float t, Scene* scene)
  548. {
  549. TransitionSlideInT* newScene = new (std::nothrow) TransitionSlideInT();
  550. if(newScene && newScene->initWithDuration(t, scene))
  551. {
  552. newScene->autorelease();
  553. return newScene;
  554. }
  555. CC_SAFE_DELETE(newScene);
  556. return nullptr;
  557. }
  558. void TransitionSlideInT::sceneOrder()
  559. {
  560. _isInSceneOnTop = false;
  561. }
  562. void TransitionSlideInT::initScenes()
  563. {
  564. Size s = Director::getInstance()->getWinSize();
  565. _inScene->setPosition(0,s.height-ADJUST_FACTOR);
  566. }
  567. ActionInterval* TransitionSlideInT::action()
  568. {
  569. Size s = Director::getInstance()->getWinSize();
  570. return MoveBy::create(_duration, Vec2(0,-(s.height-ADJUST_FACTOR)));
  571. }
  572. //
  573. // SlideInB
  574. //
  575. TransitionSlideInB::TransitionSlideInB()
  576. {
  577. }
  578. TransitionSlideInB::~TransitionSlideInB()
  579. {
  580. }
  581. TransitionSlideInB* TransitionSlideInB::create(float t, Scene* scene)
  582. {
  583. TransitionSlideInB* newScene = new (std::nothrow) TransitionSlideInB();
  584. if(newScene && newScene->initWithDuration(t, scene))
  585. {
  586. newScene->autorelease();
  587. return newScene;
  588. }
  589. CC_SAFE_DELETE(newScene);
  590. return nullptr;
  591. }
  592. void TransitionSlideInB::sceneOrder()
  593. {
  594. _isInSceneOnTop = true;
  595. }
  596. void TransitionSlideInB:: initScenes()
  597. {
  598. Size s = Director::getInstance()->getWinSize();
  599. _inScene->setPosition(0,-(s.height-ADJUST_FACTOR));
  600. }
  601. ActionInterval* TransitionSlideInB:: action()
  602. {
  603. Size s = Director::getInstance()->getWinSize();
  604. return MoveBy::create(_duration, Vec2(0,s.height-ADJUST_FACTOR));
  605. }
  606. //
  607. // ShrinkGrow Transition
  608. //
  609. TransitionShrinkGrow::TransitionShrinkGrow()
  610. {
  611. }
  612. TransitionShrinkGrow::~TransitionShrinkGrow()
  613. {
  614. }
  615. TransitionShrinkGrow* TransitionShrinkGrow::create(float t, Scene* scene)
  616. {
  617. TransitionShrinkGrow* newScene = new (std::nothrow) TransitionShrinkGrow();
  618. if(newScene && newScene->initWithDuration(t, scene))
  619. {
  620. newScene->autorelease();
  621. return newScene;
  622. }
  623. CC_SAFE_DELETE(newScene);
  624. return nullptr;
  625. }
  626. void TransitionShrinkGrow::onEnter()
  627. {
  628. TransitionScene::onEnter();
  629. _inScene->setScale(0.001f);
  630. _outScene->setScale(1.0f);
  631. _inScene->setAnchorPoint(Vec2(2/3.0f,0.5f));
  632. _outScene->setAnchorPoint(Vec2(1/3.0f,0.5f));
  633. ActionInterval* scaleOut = ScaleTo::create(_duration, 0.01f);
  634. ActionInterval* scaleIn = ScaleTo::create(_duration, 1.0f);
  635. _inScene->runAction(this->easeActionWithAction(scaleIn));
  636. _outScene->runAction
  637. (
  638. Sequence::create
  639. (
  640. this->easeActionWithAction(scaleOut),
  641. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  642. nullptr
  643. )
  644. );
  645. }
  646. ActionInterval* TransitionShrinkGrow:: easeActionWithAction(ActionInterval* action)
  647. {
  648. return EaseOut::create(action, 2.0f);
  649. // return [EaseElasticOut actionWithAction:action period:0.3f];
  650. }
  651. //
  652. // FlipX Transition
  653. //
  654. TransitionFlipX::TransitionFlipX()
  655. {
  656. }
  657. TransitionFlipX::~TransitionFlipX()
  658. {
  659. }
  660. void TransitionFlipX::onEnter()
  661. {
  662. TransitionSceneOriented::onEnter();
  663. _inScene->setVisible(false);
  664. float inDeltaZ, inAngleZ;
  665. float outDeltaZ, outAngleZ;
  666. if( _orientation == TransitionScene::Orientation::RIGHT_OVER )
  667. {
  668. inDeltaZ = 90;
  669. inAngleZ = 270;
  670. outDeltaZ = 90;
  671. outAngleZ = 0;
  672. }
  673. else
  674. {
  675. inDeltaZ = -90;
  676. inAngleZ = 90;
  677. outDeltaZ = -90;
  678. outAngleZ = 0;
  679. }
  680. auto inA = Sequence::create
  681. (
  682. DelayTime::create(_duration/2),
  683. Show::create(),
  684. OrbitCamera::create(_duration/2, 1, 0, inAngleZ, inDeltaZ, 0, 0),
  685. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  686. nullptr
  687. );
  688. auto outA = Sequence::create
  689. (
  690. OrbitCamera::create(_duration/2, 1, 0, outAngleZ, outDeltaZ, 0, 0),
  691. Hide::create(),
  692. DelayTime::create(_duration/2),
  693. nullptr
  694. );
  695. _inScene->runAction(inA);
  696. _outScene->runAction(outA);
  697. }
  698. TransitionFlipX* TransitionFlipX::create(float t, Scene* s, Orientation o)
  699. {
  700. TransitionFlipX* newScene = new (std::nothrow) TransitionFlipX();
  701. newScene->initWithDuration(t, s, o);
  702. newScene->autorelease();
  703. return newScene;
  704. }
  705. TransitionFlipX* TransitionFlipX::create(float t, Scene* s)
  706. {
  707. return TransitionFlipX::create(t, s, TransitionScene::Orientation::RIGHT_OVER);
  708. }
  709. //
  710. // FlipY Transition
  711. //
  712. TransitionFlipY::TransitionFlipY()
  713. {
  714. }
  715. TransitionFlipY::~TransitionFlipY()
  716. {
  717. }
  718. void TransitionFlipY::onEnter()
  719. {
  720. TransitionSceneOriented::onEnter();
  721. _inScene->setVisible(false);
  722. float inDeltaZ, inAngleZ;
  723. float outDeltaZ, outAngleZ;
  724. if( _orientation == TransitionScene::Orientation::UP_OVER )
  725. {
  726. inDeltaZ = 90;
  727. inAngleZ = 270;
  728. outDeltaZ = 90;
  729. outAngleZ = 0;
  730. }
  731. else
  732. {
  733. inDeltaZ = -90;
  734. inAngleZ = 90;
  735. outDeltaZ = -90;
  736. outAngleZ = 0;
  737. }
  738. auto inA = Sequence::create
  739. (
  740. DelayTime::create(_duration/2),
  741. Show::create(),
  742. OrbitCamera::create(_duration/2, 1, 0, inAngleZ, inDeltaZ, 90, 0),
  743. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  744. nullptr
  745. );
  746. auto outA = Sequence::create
  747. (
  748. OrbitCamera::create(_duration/2, 1, 0, outAngleZ, outDeltaZ, 90, 0),
  749. Hide::create(),
  750. DelayTime::create(_duration/2),
  751. nullptr
  752. );
  753. _inScene->runAction(inA);
  754. _outScene->runAction(outA);
  755. }
  756. TransitionFlipY* TransitionFlipY::create(float t, Scene* s, Orientation o)
  757. {
  758. TransitionFlipY* newScene = new (std::nothrow) TransitionFlipY();
  759. newScene->initWithDuration(t, s, o);
  760. newScene->autorelease();
  761. return newScene;
  762. }
  763. TransitionFlipY* TransitionFlipY::create(float t, Scene* s)
  764. {
  765. return TransitionFlipY::create(t, s, TransitionScene::Orientation::UP_OVER);
  766. }
  767. //
  768. // FlipAngular Transition
  769. //
  770. TransitionFlipAngular::TransitionFlipAngular()
  771. {
  772. }
  773. TransitionFlipAngular::~TransitionFlipAngular()
  774. {
  775. }
  776. void TransitionFlipAngular::onEnter()
  777. {
  778. TransitionSceneOriented::onEnter();
  779. _inScene->setVisible(false);
  780. float inDeltaZ, inAngleZ;
  781. float outDeltaZ, outAngleZ;
  782. if( _orientation == TransitionScene::Orientation::RIGHT_OVER )
  783. {
  784. inDeltaZ = 90;
  785. inAngleZ = 270;
  786. outDeltaZ = 90;
  787. outAngleZ = 0;
  788. }
  789. else
  790. {
  791. inDeltaZ = -90;
  792. inAngleZ = 90;
  793. outDeltaZ = -90;
  794. outAngleZ = 0;
  795. }
  796. auto inA = Sequence::create
  797. (
  798. DelayTime::create(_duration/2),
  799. Show::create(),
  800. OrbitCamera::create(_duration/2, 1, 0, inAngleZ, inDeltaZ, -45, 0),
  801. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  802. nullptr
  803. );
  804. auto outA = Sequence::create
  805. (
  806. OrbitCamera::create(_duration/2, 1, 0, outAngleZ, outDeltaZ, 45, 0),
  807. Hide::create(),
  808. DelayTime::create(_duration/2),
  809. nullptr
  810. );
  811. _inScene->runAction(inA);
  812. _outScene->runAction(outA);
  813. }
  814. TransitionFlipAngular* TransitionFlipAngular::create(float t, Scene* s, Orientation o)
  815. {
  816. TransitionFlipAngular* newScene = new (std::nothrow) TransitionFlipAngular();
  817. newScene->initWithDuration(t, s, o);
  818. newScene->autorelease();
  819. return newScene;
  820. }
  821. TransitionFlipAngular* TransitionFlipAngular::create(float t, Scene* s)
  822. {
  823. return TransitionFlipAngular::create(t, s, TransitionScene::Orientation::RIGHT_OVER);
  824. }
  825. //
  826. // ZoomFlipX Transition
  827. //
  828. TransitionZoomFlipX::TransitionZoomFlipX()
  829. {
  830. }
  831. TransitionZoomFlipX::~TransitionZoomFlipX()
  832. {
  833. }
  834. void TransitionZoomFlipX::onEnter()
  835. {
  836. TransitionSceneOriented::onEnter();
  837. _inScene->setVisible(false);
  838. float inDeltaZ, inAngleZ;
  839. float outDeltaZ, outAngleZ;
  840. if( _orientation == TransitionScene::Orientation::RIGHT_OVER ) {
  841. inDeltaZ = 90;
  842. inAngleZ = 270;
  843. outDeltaZ = 90;
  844. outAngleZ = 0;
  845. }
  846. else
  847. {
  848. inDeltaZ = -90;
  849. inAngleZ = 90;
  850. outDeltaZ = -90;
  851. outAngleZ = 0;
  852. }
  853. auto inA = Sequence::create
  854. (
  855. DelayTime::create(_duration/2),
  856. Spawn::create
  857. (
  858. OrbitCamera::create(_duration/2, 1, 0, inAngleZ, inDeltaZ, 0, 0),
  859. ScaleTo::create(_duration/2, 1),
  860. Show::create(),
  861. nullptr
  862. ),
  863. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  864. nullptr
  865. );
  866. auto outA = Sequence::create
  867. (
  868. Spawn::create
  869. (
  870. OrbitCamera::create(_duration/2, 1, 0, outAngleZ, outDeltaZ, 0, 0),
  871. ScaleTo::create(_duration/2, 0.5f),
  872. nullptr
  873. ),
  874. Hide::create(),
  875. DelayTime::create(_duration/2),
  876. nullptr
  877. );
  878. _inScene->setScale(0.5f);
  879. _inScene->runAction(inA);
  880. _outScene->runAction(outA);
  881. }
  882. TransitionZoomFlipX* TransitionZoomFlipX::create(float t, Scene* s, Orientation o)
  883. {
  884. TransitionZoomFlipX* newScene = new (std::nothrow) TransitionZoomFlipX();
  885. newScene->initWithDuration(t, s, o);
  886. newScene->autorelease();
  887. return newScene;
  888. }
  889. TransitionZoomFlipX* TransitionZoomFlipX::create(float t, Scene* s)
  890. {
  891. return TransitionZoomFlipX::create(t, s, TransitionScene::Orientation::RIGHT_OVER);
  892. }
  893. //
  894. // ZoomFlipY Transition
  895. //
  896. TransitionZoomFlipY::TransitionZoomFlipY()
  897. {
  898. }
  899. TransitionZoomFlipY::~TransitionZoomFlipY()
  900. {
  901. }
  902. void TransitionZoomFlipY::onEnter()
  903. {
  904. TransitionSceneOriented::onEnter();
  905. _inScene->setVisible(false);
  906. float inDeltaZ, inAngleZ;
  907. float outDeltaZ, outAngleZ;
  908. if( _orientation== TransitionScene::Orientation::UP_OVER ) {
  909. inDeltaZ = 90;
  910. inAngleZ = 270;
  911. outDeltaZ = 90;
  912. outAngleZ = 0;
  913. } else {
  914. inDeltaZ = -90;
  915. inAngleZ = 90;
  916. outDeltaZ = -90;
  917. outAngleZ = 0;
  918. }
  919. auto inA = Sequence::create
  920. (
  921. DelayTime::create(_duration/2),
  922. Spawn::create
  923. (
  924. OrbitCamera::create(_duration/2, 1, 0, inAngleZ, inDeltaZ, 90, 0),
  925. ScaleTo::create(_duration/2, 1),
  926. Show::create(),
  927. nullptr
  928. ),
  929. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  930. nullptr
  931. );
  932. auto outA = Sequence::create
  933. (
  934. Spawn::create
  935. (
  936. OrbitCamera::create(_duration/2, 1, 0, outAngleZ, outDeltaZ, 90, 0),
  937. ScaleTo::create(_duration/2, 0.5f),
  938. nullptr
  939. ),
  940. Hide::create(),
  941. DelayTime::create(_duration/2),
  942. nullptr
  943. );
  944. _inScene->setScale(0.5f);
  945. _inScene->runAction(inA);
  946. _outScene->runAction(outA);
  947. }
  948. TransitionZoomFlipY* TransitionZoomFlipY::create(float t, Scene* s, Orientation o)
  949. {
  950. TransitionZoomFlipY* newScene = new (std::nothrow) TransitionZoomFlipY();
  951. newScene->initWithDuration(t, s, o);
  952. newScene->autorelease();
  953. return newScene;
  954. }
  955. TransitionZoomFlipY* TransitionZoomFlipY::create(float t, Scene* s)
  956. {
  957. return TransitionZoomFlipY::create(t, s, TransitionScene::Orientation::UP_OVER);
  958. }
  959. //
  960. // ZoomFlipAngular Transition
  961. //
  962. TransitionZoomFlipAngular::TransitionZoomFlipAngular()
  963. {
  964. }
  965. TransitionZoomFlipAngular::~TransitionZoomFlipAngular()
  966. {
  967. }
  968. void TransitionZoomFlipAngular::onEnter()
  969. {
  970. TransitionSceneOriented::onEnter();
  971. _inScene->setVisible(false);
  972. float inDeltaZ, inAngleZ;
  973. float outDeltaZ, outAngleZ;
  974. if( _orientation == TransitionScene::Orientation::RIGHT_OVER ) {
  975. inDeltaZ = 90;
  976. inAngleZ = 270;
  977. outDeltaZ = 90;
  978. outAngleZ = 0;
  979. }
  980. else
  981. {
  982. inDeltaZ = -90;
  983. inAngleZ = 90;
  984. outDeltaZ = -90;
  985. outAngleZ = 0;
  986. }
  987. auto inA = Sequence::create
  988. (
  989. DelayTime::create(_duration/2),
  990. Spawn::create
  991. (
  992. OrbitCamera::create(_duration/2, 1, 0, inAngleZ, inDeltaZ, -45, 0),
  993. ScaleTo::create(_duration/2, 1),
  994. Show::create(),
  995. nullptr
  996. ),
  997. Show::create(),
  998. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  999. nullptr
  1000. );
  1001. auto outA = Sequence::create
  1002. (
  1003. Spawn::create
  1004. (
  1005. OrbitCamera::create(_duration/2, 1, 0 , outAngleZ, outDeltaZ, 45, 0),
  1006. ScaleTo::create(_duration/2, 0.5f),
  1007. nullptr
  1008. ),
  1009. Hide::create(),
  1010. DelayTime::create(_duration/2),
  1011. nullptr
  1012. );
  1013. _inScene->setScale(0.5f);
  1014. _inScene->runAction(inA);
  1015. _outScene->runAction(outA);
  1016. }
  1017. TransitionZoomFlipAngular* TransitionZoomFlipAngular::create(float t, Scene* s, Orientation o)
  1018. {
  1019. TransitionZoomFlipAngular* newScene = new (std::nothrow) TransitionZoomFlipAngular();
  1020. newScene->initWithDuration(t, s, o);
  1021. newScene->autorelease();
  1022. return newScene;
  1023. }
  1024. TransitionZoomFlipAngular* TransitionZoomFlipAngular::create(float t, Scene* s)
  1025. {
  1026. return TransitionZoomFlipAngular::create(t, s, TransitionScene::Orientation::RIGHT_OVER);
  1027. }
  1028. //
  1029. // Fade Transition
  1030. //
  1031. TransitionFade::TransitionFade()
  1032. {
  1033. }
  1034. TransitionFade::~TransitionFade()
  1035. {
  1036. }
  1037. TransitionFade * TransitionFade::create(float duration, Scene *scene, const Color3B& color)
  1038. {
  1039. TransitionFade * transition = new (std::nothrow) TransitionFade();
  1040. transition->initWithDuration(duration, scene, color);
  1041. transition->autorelease();
  1042. return transition;
  1043. }
  1044. TransitionFade* TransitionFade::create(float duration,Scene* scene)
  1045. {
  1046. return TransitionFade::create(duration, scene, Color3B::BLACK);
  1047. }
  1048. bool TransitionFade::initWithDuration(float duration, Scene *scene, const Color3B& color)
  1049. {
  1050. if (TransitionScene::initWithDuration(duration, scene))
  1051. {
  1052. _color.r = color.r;
  1053. _color.g = color.g;
  1054. _color.b = color.b;
  1055. _color.a = 0;
  1056. }
  1057. return true;
  1058. }
  1059. bool TransitionFade::initWithDuration(float t, Scene *scene)
  1060. {
  1061. this->initWithDuration(t, scene, Color3B::BLACK);
  1062. return true;
  1063. }
  1064. void TransitionFade :: onEnter()
  1065. {
  1066. TransitionScene::onEnter();
  1067. LayerColor* l = LayerColor::create(_color);
  1068. _inScene->setVisible(false);
  1069. addChild(l, 2, kSceneFade);
  1070. Node* f = getChildByTag(kSceneFade);
  1071. auto a = Sequence::create
  1072. (
  1073. FadeIn::create(_duration/2),
  1074. CallFunc::create(CC_CALLBACK_0(TransitionScene::hideOutShowIn,this)),
  1075. FadeOut::create(_duration/2),
  1076. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  1077. nullptr
  1078. );
  1079. f->runAction(a);
  1080. }
  1081. void TransitionFade::onExit()
  1082. {
  1083. TransitionScene::onExit();
  1084. this->removeChildByTag(kSceneFade, false);
  1085. }
  1086. //
  1087. // Cross Fade Transition
  1088. //
  1089. TransitionCrossFade::TransitionCrossFade()
  1090. {
  1091. }
  1092. TransitionCrossFade::~TransitionCrossFade()
  1093. {
  1094. }
  1095. TransitionCrossFade* TransitionCrossFade::create(float t, Scene* scene)
  1096. {
  1097. TransitionCrossFade* newScene = new (std::nothrow) TransitionCrossFade();
  1098. if(newScene && newScene->initWithDuration(t, scene))
  1099. {
  1100. newScene->autorelease();
  1101. return newScene;
  1102. }
  1103. CC_SAFE_DELETE(newScene);
  1104. return nullptr;
  1105. }
  1106. void TransitionCrossFade::draw(Renderer* /*renderer*/, const Mat4 &/*transform*/, uint32_t /*flags*/)
  1107. {
  1108. // override draw since both scenes (textures) are rendered in 1 scene
  1109. }
  1110. void TransitionCrossFade::onEnter()
  1111. {
  1112. TransitionScene::onEnter();
  1113. // create a transparent color layer
  1114. // in which we are going to add our rendertextures
  1115. Color4B color(0,0,0,0);
  1116. Size size = Director::getInstance()->getWinSize();
  1117. LayerColor* layer = LayerColor::create(color);
  1118. // create the first render texture for inScene
  1119. RenderTexture* inTexture = RenderTexture::create((int)size.width, (int)size.height,Texture2D::PixelFormat::RGBA8888,GL_DEPTH24_STENCIL8);
  1120. if (nullptr == inTexture)
  1121. {
  1122. return;
  1123. }
  1124. inTexture->getSprite()->setAnchorPoint( Vec2(0.5f,0.5f) );
  1125. inTexture->setPosition(size.width/2, size.height/2);
  1126. inTexture->setAnchorPoint( Vec2(0.5f,0.5f) );
  1127. // render inScene to its texturebuffer
  1128. inTexture->begin();
  1129. _inScene->visit();
  1130. inTexture->end();
  1131. // create the second render texture for outScene
  1132. RenderTexture* outTexture = RenderTexture::create((int)size.width, (int)size.height,Texture2D::PixelFormat::RGBA8888,GL_DEPTH24_STENCIL8);
  1133. outTexture->getSprite()->setAnchorPoint( Vec2(0.5f,0.5f) );
  1134. outTexture->setPosition(size.width/2, size.height/2);
  1135. outTexture->setAnchorPoint( Vec2(0.5f,0.5f) );
  1136. // render outScene to its texturebuffer
  1137. outTexture->begin();
  1138. _outScene->visit();
  1139. outTexture->end();
  1140. // create blend functions
  1141. BlendFunc blend1 = {GL_ONE, GL_ONE}; // inScene will lay on background and will not be used with alpha
  1142. BlendFunc blend2 = {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA}; // we are going to blend outScene via alpha
  1143. // set blendfunctions
  1144. inTexture->getSprite()->setBlendFunc(blend1);
  1145. outTexture->getSprite()->setBlendFunc(blend2);
  1146. // add render textures to the layer
  1147. layer->addChild(inTexture);
  1148. layer->addChild(outTexture);
  1149. // initial opacity:
  1150. inTexture->getSprite()->setOpacity(255);
  1151. outTexture->getSprite()->setOpacity(255);
  1152. // create the blend action
  1153. Action* layerAction = Sequence::create
  1154. (
  1155. FadeTo::create(_duration, 0),
  1156. CallFunc::create(CC_CALLBACK_0(TransitionScene::hideOutShowIn,this)),
  1157. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  1158. nullptr
  1159. );
  1160. // run the blend action
  1161. outTexture->getSprite()->runAction( layerAction );
  1162. // add the layer (which contains our two rendertextures) to the scene
  1163. addChild(layer, 2, kSceneFade);
  1164. }
  1165. // clean up on exit
  1166. void TransitionCrossFade::onExit()
  1167. {
  1168. // remove our layer and release all containing objects
  1169. this->removeChildByTag(kSceneFade, false);
  1170. TransitionScene::onExit();
  1171. }
  1172. //
  1173. // TurnOffTilesTransition
  1174. //
  1175. TransitionTurnOffTiles::TransitionTurnOffTiles()
  1176. {
  1177. _outSceneProxy = NodeGrid::create();
  1178. _outSceneProxy->retain();
  1179. }
  1180. TransitionTurnOffTiles::~TransitionTurnOffTiles()
  1181. {
  1182. CC_SAFE_RELEASE(_outSceneProxy);
  1183. }
  1184. TransitionTurnOffTiles* TransitionTurnOffTiles::create(float t, Scene* scene)
  1185. {
  1186. TransitionTurnOffTiles* newScene = new (std::nothrow) TransitionTurnOffTiles();
  1187. if(newScene && newScene->initWithDuration(t, scene))
  1188. {
  1189. newScene->autorelease();
  1190. return newScene;
  1191. }
  1192. CC_SAFE_DELETE(newScene);
  1193. return nullptr;
  1194. }
  1195. // override addScenes, and change the order
  1196. void TransitionTurnOffTiles::sceneOrder()
  1197. {
  1198. _isInSceneOnTop = false;
  1199. }
  1200. void TransitionTurnOffTiles::onEnter()
  1201. {
  1202. TransitionScene::onEnter();
  1203. _outSceneProxy->setTarget(_outScene);
  1204. _outSceneProxy->onEnter();
  1205. Size s = Director::getInstance()->getWinSize();
  1206. float aspect = s.width / s.height;
  1207. int x = (int)(12 * aspect);
  1208. int y = 12;
  1209. TurnOffTiles* toff = TurnOffTiles::create(_duration, Size(x,y));
  1210. ActionInterval* action = easeActionWithAction(toff);
  1211. _outSceneProxy->runAction
  1212. (
  1213. Sequence::create
  1214. (
  1215. action,
  1216. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  1217. StopGrid::create(),
  1218. nullptr
  1219. )
  1220. );
  1221. }
  1222. void TransitionTurnOffTiles::onExit()
  1223. {
  1224. _outSceneProxy->setTarget(nullptr);
  1225. _outSceneProxy->onExit();
  1226. TransitionScene::onExit();
  1227. }
  1228. void TransitionTurnOffTiles::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
  1229. {
  1230. Scene::draw(renderer, transform, flags);
  1231. if( _isInSceneOnTop )
  1232. {
  1233. _outSceneProxy->visit(renderer, transform, flags);
  1234. _inScene->visit(renderer, transform, flags);
  1235. }
  1236. else
  1237. {
  1238. _inScene->visit(renderer, transform, flags);
  1239. _outSceneProxy->visit(renderer, transform, flags);
  1240. }
  1241. }
  1242. ActionInterval* TransitionTurnOffTiles:: easeActionWithAction(ActionInterval* action)
  1243. {
  1244. return action;
  1245. }
  1246. //
  1247. // SplitCols Transition
  1248. //
  1249. TransitionSplitCols::TransitionSplitCols()
  1250. {
  1251. _gridProxy = NodeGrid::create();
  1252. _gridProxy->retain();
  1253. }
  1254. TransitionSplitCols::~TransitionSplitCols()
  1255. {
  1256. CC_SAFE_RELEASE(_gridProxy);
  1257. }
  1258. TransitionSplitCols* TransitionSplitCols::create(float t, Scene* scene)
  1259. {
  1260. TransitionSplitCols* newScene = new (std::nothrow) TransitionSplitCols();
  1261. if(newScene && newScene->initWithDuration(t, scene))
  1262. {
  1263. newScene->autorelease();
  1264. return newScene;
  1265. }
  1266. CC_SAFE_DELETE(newScene);
  1267. return nullptr;
  1268. }
  1269. void TransitionSplitCols::onEnter()
  1270. {
  1271. TransitionScene::onEnter();
  1272. _gridProxy->setTarget(_outScene);
  1273. _gridProxy->onEnter();
  1274. ActionInterval* split = action();
  1275. auto seq = Sequence::create
  1276. (
  1277. split,
  1278. CallFunc::create(CC_CALLBACK_0(TransitionSplitCols::switchTargetToInscene,this)),
  1279. split->reverse(),
  1280. nullptr
  1281. );
  1282. _gridProxy->runAction
  1283. (
  1284. Sequence::create
  1285. (
  1286. easeActionWithAction(seq),
  1287. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  1288. StopGrid::create(),
  1289. nullptr
  1290. )
  1291. );
  1292. }
  1293. void TransitionSplitCols::switchTargetToInscene()
  1294. {
  1295. _gridProxy->setTarget(_inScene);
  1296. }
  1297. void TransitionSplitCols::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
  1298. {
  1299. Scene::draw(renderer, transform, flags);
  1300. _gridProxy->visit(renderer, transform, flags);
  1301. }
  1302. void TransitionSplitCols::onExit()
  1303. {
  1304. _gridProxy->setTarget(nullptr);
  1305. _gridProxy->onExit();
  1306. TransitionScene::onExit();
  1307. }
  1308. ActionInterval* TransitionSplitCols:: action()
  1309. {
  1310. return SplitCols::create(_duration/2.0f, 3);
  1311. }
  1312. ActionInterval* TransitionSplitCols::easeActionWithAction(ActionInterval * action)
  1313. {
  1314. return EaseInOut::create(action, 3.0f);
  1315. }
  1316. //
  1317. // SplitRows Transition
  1318. //
  1319. TransitionSplitRows::TransitionSplitRows()
  1320. {
  1321. }
  1322. TransitionSplitRows::~TransitionSplitRows()
  1323. {
  1324. }
  1325. ActionInterval* TransitionSplitRows::action()
  1326. {
  1327. return SplitRows::create(_duration/2.0f, 3);
  1328. }
  1329. TransitionSplitRows* TransitionSplitRows::create(float t, Scene* scene)
  1330. {
  1331. TransitionSplitRows* newScene = new (std::nothrow) TransitionSplitRows();
  1332. if(newScene && newScene->initWithDuration(t, scene))
  1333. {
  1334. newScene->autorelease();
  1335. return newScene;
  1336. }
  1337. CC_SAFE_DELETE(newScene);
  1338. return nullptr;
  1339. }
  1340. //
  1341. // FadeTR Transition
  1342. //
  1343. TransitionFadeTR::TransitionFadeTR()
  1344. {
  1345. _outSceneProxy = NodeGrid::create();
  1346. _outSceneProxy->retain();
  1347. }
  1348. TransitionFadeTR::~TransitionFadeTR()
  1349. {
  1350. CC_SAFE_RELEASE(_outSceneProxy);
  1351. }
  1352. TransitionFadeTR* TransitionFadeTR::create(float t, Scene* scene)
  1353. {
  1354. TransitionFadeTR* newScene = new (std::nothrow) TransitionFadeTR();
  1355. if(newScene && newScene->initWithDuration(t, scene))
  1356. {
  1357. newScene->autorelease();
  1358. return newScene;
  1359. }
  1360. CC_SAFE_DELETE(newScene);
  1361. return nullptr;
  1362. }
  1363. void TransitionFadeTR::sceneOrder()
  1364. {
  1365. _isInSceneOnTop = false;
  1366. }
  1367. void TransitionFadeTR::onEnter()
  1368. {
  1369. TransitionScene::onEnter();
  1370. _outSceneProxy->setTarget(_outScene);
  1371. _outSceneProxy->onEnter();
  1372. Size s = Director::getInstance()->getWinSize();
  1373. float aspect = s.width / s.height;
  1374. int x = (int)(12 * aspect);
  1375. int y = 12;
  1376. ActionInterval* action = actionWithSize(Size(x,y));
  1377. _outSceneProxy->runAction
  1378. (
  1379. Sequence::create
  1380. (
  1381. easeActionWithAction(action),
  1382. CallFunc::create(CC_CALLBACK_0(TransitionScene::finish,this)),
  1383. StopGrid::create(),
  1384. nullptr
  1385. )
  1386. );
  1387. }
  1388. void TransitionFadeTR::onExit()
  1389. {
  1390. _outSceneProxy->setTarget(nullptr);
  1391. _outSceneProxy->onExit();
  1392. TransitionScene::onExit();
  1393. }
  1394. void TransitionFadeTR::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
  1395. {
  1396. Scene::draw(renderer, transform, flags);
  1397. if( _isInSceneOnTop )
  1398. {
  1399. _outSceneProxy->visit(renderer, transform, flags);
  1400. _inScene->visit(renderer, transform, flags);
  1401. }
  1402. else
  1403. {
  1404. _inScene->visit(renderer, transform, flags);
  1405. _outSceneProxy->visit(renderer, transform, flags);
  1406. }
  1407. }
  1408. ActionInterval* TransitionFadeTR::actionWithSize(const Size& size)
  1409. {
  1410. return FadeOutTRTiles::create(_duration, size);
  1411. }
  1412. ActionInterval* TransitionFadeTR:: easeActionWithAction(ActionInterval* action)
  1413. {
  1414. return action;
  1415. }
  1416. //
  1417. // FadeBL Transition
  1418. //
  1419. TransitionFadeBL::TransitionFadeBL()
  1420. {
  1421. }
  1422. TransitionFadeBL::~TransitionFadeBL()
  1423. {
  1424. }
  1425. TransitionFadeBL* TransitionFadeBL::create(float t, Scene* scene)
  1426. {
  1427. TransitionFadeBL* newScene = new (std::nothrow) TransitionFadeBL();
  1428. if(newScene && newScene->initWithDuration(t, scene))
  1429. {
  1430. newScene->autorelease();
  1431. return newScene;
  1432. }
  1433. CC_SAFE_DELETE(newScene);
  1434. return nullptr;
  1435. }
  1436. ActionInterval* TransitionFadeBL::actionWithSize(const Size& size)
  1437. {
  1438. return FadeOutBLTiles::create(_duration, size);
  1439. }
  1440. //
  1441. // FadeUp Transition
  1442. //
  1443. TransitionFadeUp::TransitionFadeUp()
  1444. {
  1445. }
  1446. TransitionFadeUp::~TransitionFadeUp()
  1447. {
  1448. }
  1449. TransitionFadeUp* TransitionFadeUp::create(float t, Scene* scene)
  1450. {
  1451. TransitionFadeUp* newScene = new (std::nothrow) TransitionFadeUp();
  1452. if(newScene && newScene->initWithDuration(t, scene))
  1453. {
  1454. newScene->autorelease();
  1455. return newScene;
  1456. }
  1457. CC_SAFE_DELETE(newScene);
  1458. return nullptr;
  1459. }
  1460. ActionInterval* TransitionFadeUp::actionWithSize(const Size& size)
  1461. {
  1462. return FadeOutUpTiles::create(_duration, size);
  1463. }
  1464. //
  1465. // FadeDown Transition
  1466. //
  1467. TransitionFadeDown::TransitionFadeDown()
  1468. {
  1469. }
  1470. TransitionFadeDown::~TransitionFadeDown()
  1471. {
  1472. }
  1473. TransitionFadeDown* TransitionFadeDown::create(float t, Scene* scene)
  1474. {
  1475. TransitionFadeDown* newScene = new (std::nothrow) TransitionFadeDown();
  1476. if(newScene && newScene->initWithDuration(t, scene))
  1477. {
  1478. newScene->autorelease();
  1479. return newScene;
  1480. }
  1481. CC_SAFE_DELETE(newScene);
  1482. return nullptr;
  1483. }
  1484. ActionInterval* TransitionFadeDown::actionWithSize(const Size& size)
  1485. {
  1486. return FadeOutDownTiles::create(_duration, size);
  1487. }
  1488. NS_CC_END