PuzzleSDK
SchedulerTest.cpp
浏览该文件的文档.
1/****************************************************************************
2 Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
3
4 http://www.cocos2d-x.org
5
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 THE SOFTWARE.
23 ****************************************************************************/
24
25#include "SchedulerTest.h"
26#include "../testResource.h"
27#include "ui/UIText.h"
28#include "controller.h"
29
32using namespace cocos2d::ui;
33
34enum {
36};
37
38SchedulerTests::SchedulerTests()
39{
64};
65
66//------------------------------------------------------------------
67//
68// SchedulerAutoremove
69//
70//------------------------------------------------------------------
72{
74
75 schedule(CC_SCHEDULE_SELECTOR(SchedulerAutoremove::autoremove), 0.5f);
76 schedule(CC_SCHEDULE_SELECTOR(SchedulerAutoremove::tick), 0.5f);
77 accum = 0;
78}
79
81{
82 accum += dt;
83 CCLOG("autoremove scheduler: Time: %f", accum);
84
85 if( accum > 3 )
86 {
87 unschedule(CC_SCHEDULE_SELECTOR(SchedulerAutoremove::autoremove));
88 CCLOG("autoremove scheduler: scheduler removed");
89 }
90}
91
92void SchedulerAutoremove::tick(float /*dt*/)
93{
94 CCLOG("tick scheduler: This scheduler should not be removed");
95}
96
97std::string SchedulerAutoremove::title() const
98{
99 return "Self-remove an scheduler";
100}
101
103{
104 return "1 scheduler will be autoremoved in 3 seconds. See console";
105}
106
107//------------------------------------------------------------------
108//
109// SchedulerPauseResume
110//
111//------------------------------------------------------------------
113{
115 schedule(CC_SCHEDULE_SELECTOR(SchedulerPauseResume::tick1), 0.5f);
116 schedule(CC_SCHEDULE_SELECTOR(SchedulerPauseResume::tick2), 0.5f);
117 schedule(CC_SCHEDULE_SELECTOR(SchedulerPauseResume::pause), 3.0f);
118}
119
121{
122 CCLOG("tick1");
123}
124
126{
127 CCLOG("tick2");
128}
129
131{
132 CCLOG("paused, tick1 and tick2 should called six times");
133 Director::getInstance()->getScheduler()->pauseTarget(this);
134}
135
137{
138 return "Pause / Resume";
139}
140
142{
143 return "Scheduler should be paused after 3 seconds. See console";
144}
145
146//------------------------------------------------------------------
147//
148// SchedulerPauseResumeAll
149//
150//------------------------------------------------------------------
151
153{
154
155}
156
158{
159
160}
161
163{
165
166 auto sprite = Sprite::create("Images/grossinis_sister1.png");
167 sprite->setPosition(VisibleRect::center());
168 this->addChild(sprite);
169 sprite->runAction(RepeatForever::create(RotateBy::create(3.0f, 360.0f)));
170 sprite->setTag(123);
171 scheduleUpdate();
172 schedule(CC_SCHEDULE_SELECTOR(SchedulerPauseResumeAll::tick1), 0.5f);
173 schedule(CC_SCHEDULE_SELECTOR(SchedulerPauseResumeAll::tick2), 1.0f);
174 scheduleOnce(CC_SCHEDULE_SELECTOR(SchedulerPauseResumeAll::pause), 3.0f);
175}
176
178{
179 // do nothing
180}
181
183{
184 if (!_pausedTargets.empty())
185 {
186 Director::getInstance()->getScheduler()->resumeTargets(_pausedTargets);
187 }
188 SchedulerTestLayer::onExit();
189}
190
192{
193 log("tick1");
194}
195
197{
198 log("tick2");
199}
200
202{
203 log("Pausing, tick1 should be called six times and tick2 three times");
204 auto scheduler = Director::getInstance()->getScheduler();
205 _pausedTargets = scheduler->pauseAllTargets();
206
207 // should have only 2 items: ActionManager, self
208 CCASSERT(_pausedTargets.size() == 2, "Error: pausedTargets should have only 2 items");
209
210 // because target 'this' has been paused above, so use another node(tag:123) as target
211 getChildByTag(123)->scheduleOnce([this](float dt)
212 {
213 this->resume(dt);
214 }, 2.0f, "test resume");
215}
216
218{
219 log("Resuming");
220 auto director = Director::getInstance();
221 director->getScheduler()->resumeTargets(_pausedTargets);
222 _pausedTargets.clear();
223}
224
226{
227 return "Pause / Resume All";
228}
229
231{
232 return "Everything will pause after 3s, then resume at 5s. See console";
233}
234
235//------------------------------------------------------------------
236//
237// SchedulerPauseResumeAllUser
238//
239//------------------------------------------------------------------
240
242{
243
244}
245
247{
248
249}
250
252{
254
255 auto s = Director::getInstance()->getWinSize();
256
257 auto sprite = Sprite::create("Images/grossinis_sister1.png");
258 sprite->setPosition(Vec2(s.width/2, s.height/2));
259 sprite->setTag(123);
260 this->addChild(sprite);
261 sprite->runAction(RepeatForever::create(RotateBy::create(3.0f, 360.0f)));
262
263 schedule(CC_SCHEDULE_SELECTOR(SchedulerPauseResumeAllUser::tick1), 1.0f);
264 schedule(CC_SCHEDULE_SELECTOR(SchedulerPauseResumeAllUser::tick2), 1.0f);
265 schedule(CC_SCHEDULE_SELECTOR(SchedulerPauseResumeAllUser::pause), 3.0f, false, 0);
266}
267
269{
270 if (!_pausedTargets.empty())
271 {
272 Director::getInstance()->getScheduler()->resumeTargets(_pausedTargets);
273 }
274 SchedulerTestLayer::onExit();
275}
276
278{
279 log("tick1");
280}
281
283{
284 log("tick2");
285}
286
288{
289 log("Pausing, tick1 and tick2 should be called three times");
290 auto director = Director::getInstance();
291 _pausedTargets = director->getScheduler()->pauseAllTargetsWithMinPriority(Scheduler::PRIORITY_NON_SYSTEM_MIN);
292 // because target 'this' has been paused above, so use another node(tag:123) as target
293 getChildByTag(123)->scheduleOnce([this](float dt)
294 {
295 this->resume(dt);
296 }, 2.0f, "test resume");
297}
298
300{
301 log("Resuming");
302 getScheduler()->resumeTargets(_pausedTargets);
303 _pausedTargets.clear();
304}
305
307{
308 return "Pause / Resume All User scheduler";
309}
310
312{
313 return "ticks will pause after 3s, then resume at 5s. See console";
314}
315
316
317//------------------------------------------------------------------
318//
319// SchedulerUnscheduleAll
320//
321//------------------------------------------------------------------
323{
325
326 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAll::tick1), 0.5f);
327 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAll::tick2), 1.0f);
328 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAll::tick3), 1.5f);
329 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAll::tick4), 1.5f);
330 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAll::unscheduleAll), 4);
331}
332
334{
335 CCLOG("tick1");
336}
337
339{
340 CCLOG("tick2");
341}
342
344{
345 CCLOG("tick3");
346}
347
349{
350 CCLOG("tick4");
351}
352
354{
355 unscheduleAllCallbacks();
356}
357
359{
360 return "Unschedule All selectors";
361}
362
364{
365 return "All scheduled selectors will be unscheduled in 4 seconds. See console";
366}
367
368//------------------------------------------------------------------
369//
370// SchedulerUnscheduleAllHard
371//
372//------------------------------------------------------------------
374{
376
377 auto s = Director::getInstance()->getWinSize();
378
379 auto sprite = Sprite::create("Images/grossinis_sister1.png");
380 sprite->setPosition(Vec2(s.width/2, s.height/2));
381 this->addChild(sprite);
382 sprite->runAction(RepeatForever::create(RotateBy::create(3.0f, 360.0f)));
383
385
386 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAllHard::tick1), 0.5f);
387 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAllHard::tick2), 1.0f);
388 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAllHard::tick3), 1.5f);
389 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAllHard::tick4), 1.5f);
390 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAllHard::unscheduleAll), 4);
391}
392
394{
396 // Restore the director's action manager.
397 auto director = Director::getInstance();
398 director->getScheduler()->scheduleUpdate(director->getActionManager(), Scheduler::PRIORITY_SYSTEM, false);
399 }
400
401 SchedulerTestLayer::onExit();
402}
403
405{
406 CCLOG("tick1");
407}
408
410{
411 CCLOG("tick2");
412}
413
415{
416 CCLOG("tick3");
417}
418
420{
421 CCLOG("tick4");
422}
423
425{
426 Director::getInstance()->getScheduler()->unscheduleAll();
427 _actionManagerActive = false;
428}
429
431{
432 return "Unschedule All selectors (HARD)";
433}
434
436{
437 return "Unschedules all user selectors after 4s. Action will stop. See console";
438}
439
440//------------------------------------------------------------------
441//
442// SchedulerUnscheduleAllUserLevel
443//
444//------------------------------------------------------------------
446{
448
449 auto s = Director::getInstance()->getWinSize();
450
451 auto sprite = Sprite::create("Images/grossinis_sister1.png");
452 sprite->setPosition(Vec2(s.width/2, s.height/2));
453 this->addChild(sprite);
454 sprite->runAction(RepeatForever::create(RotateBy::create(3.0f, 360.0f)));
455
456 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAllUserLevel::tick1), 0.5f);
457 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAllUserLevel::tick2), 1.0f);
458 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAllUserLevel::tick3), 1.5f);
459 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAllUserLevel::tick4), 1.5f);
460 schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAllUserLevel::unscheduleAll), 4);
461}
462
464{
465 CCLOG("tick1");
466}
467
469{
470 CCLOG("tick2");
471}
472
474{
475 CCLOG("tick3");
476}
477
479{
480 CCLOG("tick4");
481}
482
484{
485 Director::getInstance()->getScheduler()->unscheduleAllWithMinPriority(Scheduler::PRIORITY_NON_SYSTEM_MIN);
486}
487
489{
490 return "Unschedule All user selectors";
491}
492
494{
495 return "Unschedules all user selectors after 4s. Action should not stop. See console";
496}
497
498//------------------------------------------------------------------
499//
500// SchedulerSchedulesAndRemove
501//
502//------------------------------------------------------------------
504{
506
507 schedule(CC_SCHEDULE_SELECTOR(SchedulerSchedulesAndRemove::tick1), 0.5f);
508 schedule(CC_SCHEDULE_SELECTOR(SchedulerSchedulesAndRemove::tick2), 1.0f);
509 schedule(CC_SCHEDULE_SELECTOR(SchedulerSchedulesAndRemove::scheduleAndUnschedule), 4.0f);
510}
511
513{
514 CCLOG("tick1");
515}
516
518{
519 CCLOG("tick2");
520}
521
523{
524 CCLOG("tick3");
525}
526
528{
529 CCLOG("tick4");
530}
531
533{
534 return "Schedule from Schedule";
535}
536
538{
539 return "Will unschedule and schedule selectors in 4s. See console";
540}
541
543{
544 unschedule(CC_SCHEDULE_SELECTOR(SchedulerSchedulesAndRemove::tick1));
545 unschedule(CC_SCHEDULE_SELECTOR(SchedulerSchedulesAndRemove::tick2));
546 unschedule(CC_SCHEDULE_SELECTOR(SchedulerSchedulesAndRemove::scheduleAndUnschedule));
547
548 schedule(CC_SCHEDULE_SELECTOR(SchedulerSchedulesAndRemove::tick3), 1.0f);
549 schedule(CC_SCHEDULE_SELECTOR(SchedulerSchedulesAndRemove::tick4), 1.0f);
550}
551
552//------------------------------------------------------------------
553//
554// TestNode
555//
556//------------------------------------------------------------------
557void TestNode::initWithString(const std::string& str, int priority)
558{
559 _string = str;
560 scheduleUpdateWithPriority(priority);
561}
562
564{
565}
566
567void TestNode::update(float /*dt*/)
568{
569 log("%s", _string.c_str());
570}
571
572//------------------------------------------------------------------
573//
574// SchedulerUpdate
575//
576//------------------------------------------------------------------
578{
580
581 auto d = new (std::nothrow) TestNode();
582 d->initWithString("---", 50);
583 addChild(d);
584 d->release();
585
586 auto b = new (std::nothrow) TestNode();
587 b->initWithString("3rd", 0);
588 addChild(b);
589 b->release();
590
591 auto a = new (std::nothrow) TestNode();
592 a->initWithString("1st", -10);
593 addChild(a);
594 a->release();
595
596 auto c = new (std::nothrow) TestNode();
597 c->initWithString("4th", 10);
598 addChild(c);
599 c->release();
600
601 auto e = new (std::nothrow) TestNode();
602 e->initWithString("5th", 20);
603 addChild(e);
604 e->release();
605
606 auto f = new (std::nothrow) TestNode();
607 f->initWithString("2nd", -5);
608 addChild(f);
609 f->release();
610
611 schedule(CC_SCHEDULE_SELECTOR(SchedulerUpdate::removeUpdates), 4.0f);
612}
613
615{
616 auto& children = getChildren();
617
618 for (auto& c : children)
619 {
620 auto obj = static_cast<Ref*>(c);
621 auto node = static_cast<Node*>(obj);
622
623 if (! node)
624 {
625 break;
626 }
627 node->unscheduleAllCallbacks();
628 }
629}
630
631std::string SchedulerUpdate::title() const
632{
633 return "Schedule update with priority";
634}
635
636std::string SchedulerUpdate::subtitle() const
637{
638 return "3 scheduled updates. Priority should work. Stops in 4s. See console";
639}
640
641//------------------------------------------------------------------
642//
643// SchedulerUpdateAndCustom
644//
645//------------------------------------------------------------------
647{
649
650 scheduleUpdate();
651 schedule(CC_SCHEDULE_SELECTOR(SchedulerUpdateAndCustom::tick));
652 schedule(CC_SCHEDULE_SELECTOR(SchedulerUpdateAndCustom::stopSelectors), 0.4f);
653}
654
656{
657 CCLOG("update called:%f", dt);
658}
659
661{
662 CCLOG("custom selector called:%f",dt);
663}
664
666{
667 log("SchedulerUpdateAndCustom::stopSelectors");
668 unscheduleAllCallbacks();
669}
670
672{
673 return "Schedule Update + custom selector";
674}
675
677{
678 return "Update + custom selector at the same time. Stops in 4s. See console";
679}
680
681//------------------------------------------------------------------
682//
683// SchedulerUpdateFromCustom
684//
685//------------------------------------------------------------------
687{
689
690 schedule(CC_SCHEDULE_SELECTOR(SchedulerUpdateFromCustom::schedUpdate), 2.0f);
691}
692
694{
695 CCLOG("update called:%f", dt);
696}
697
699{
700 unschedule(CC_SCHEDULE_SELECTOR(SchedulerUpdateFromCustom::schedUpdate));
701 scheduleUpdate();
702 schedule(CC_SCHEDULE_SELECTOR(SchedulerUpdateFromCustom::stopUpdate), 2.0f);
703}
704
706{
707 unscheduleUpdate();
708 unschedule(CC_SCHEDULE_SELECTOR(SchedulerUpdateFromCustom::stopUpdate));
709}
710
712{
713 return "Schedule Update in 2 sec";
714}
715
717{
718 return "Update schedules in 2 secs. Stops 2 sec later. See console";
719}
720
721//------------------------------------------------------------------
722//
723// RescheduleSelector
724//
725//------------------------------------------------------------------
727{
729
730 _interval = 1.0f;
731 _ticks = 0;
732 schedule(CC_SCHEDULE_SELECTOR(RescheduleSelector::schedUpdate), _interval);
733}
734
735std::string RescheduleSelector::title() const
736{
737 return "Reschedule Selector";
738}
739
741{
742 return "Interval is 1 second, then 2, then 3...";
743}
744
746{
747 _ticks++;
748
749 CCLOG("schedUpdate: %.4f", dt);
750 if ( _ticks > 3 )
751 {
752 _interval += 1.0f;
753 schedule(CC_SCHEDULE_SELECTOR(RescheduleSelector::schedUpdate), _interval);
754 _ticks = 0;
755 }
756}
757
758// SchedulerDelayAndRepeat
759
761{
763 schedule(CC_SCHEDULE_SELECTOR(SchedulerDelayAndRepeat::update), 0, 4 , 3.f);
764 CCLOG("update is scheduled should begin after 3 seconds");
765}
766
768{
769 return "Schedule with delay of 3 sec, repeat 4 times";
770}
771
773{
774 return "After 5 x executed, method unscheduled. See console";
775}
776
778{
779 log("update called:%f", dt);
780}
781
782// SchedulerTimeScale
783
785{
786 ControlSlider * slider = ControlSlider::create("extensions/sliderTrack2.png","extensions/sliderProgress2.png" ,"extensions/sliderThumb.png");
787
788 slider->addTargetWithActionForControlEvents(this, cccontrol_selector(SchedulerTimeScale::sliderAction), Control::EventType::VALUE_CHANGED);
789
790 slider->setMinimumValue(-3.0f);
791 slider->setMaximumValue(3.0f);
792 slider->setValue(1.0f);
793
794 return slider;
795}
796
797void SchedulerTimeScale::sliderAction(Ref* sender, Control::EventType /*controlEvent*/)
798{
799 ControlSlider* pSliderCtl = static_cast<ControlSlider*>(sender);
800 float scale;
801 scale = pSliderCtl->getValue();
802
803 Director::getInstance()->getScheduler()->setTimeScale(scale);
804}
805
807{
809
810 auto s = Director::getInstance()->getWinSize();
811
812 // rotate and jump
813 auto jump1 = JumpBy::create(4, Vec2(-s.width+80,0.0f), 100, 4);
814 auto jump2 = jump1->reverse();
815 auto rot1 = RotateBy::create(4, 360*2);
816 auto rot2 = rot1->reverse();
817
818 auto seq3_1 = Sequence::create(jump2, jump1, nullptr);
819 auto seq3_2 = Sequence::create(rot1, rot2, nullptr);
820 auto spawn = Spawn::create(seq3_1, seq3_2, nullptr);
821 auto action = Repeat::create(spawn, 50);
822
823 auto action2 = action->clone();
824 auto action3 = action->clone();
825
826 auto grossini = Sprite::create("Images/grossini.png");
827 auto tamara = Sprite::create("Images/grossinis_sister1.png");
828 auto kathia = Sprite::create("Images/grossinis_sister2.png");
829
830 grossini->setPosition(Vec2(40.0f,80.0f));
831 tamara->setPosition(Vec2(40.0f,80.0f));
832 kathia->setPosition(Vec2(40.0f,80.0f));
833
834 addChild(grossini);
835 addChild(tamara);
836 addChild(kathia);
837
838 grossini->runAction(Speed::create(action, 0.5f));
839 tamara->runAction(Speed::create(action2, 1.5f));
840 kathia->runAction(Speed::create(action3, 1.0f));
841
842 auto emitter = ParticleFireworks::create();
843 emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(s_stars1) );
844 addChild(emitter);
845
847 _sliderCtl->setPosition(Vec2(s.width / 2.0f, s.height / 3.0f));
848
849 addChild(_sliderCtl);
850}
851
853{
854 // restore scale
855 Director::getInstance()->getScheduler()->setTimeScale(1);
856 SchedulerTestLayer::onExit();
857}
858
859std::string SchedulerTimeScale::title() const
860{
861 return "Scheduler timeScale Test";
862}
863
865{
866 return "Fast-forward and rewind using scheduler.timeScale";
867}
868
869//TwoSchedulers
870
872{
873 // auto frame = CGRectMake(12.0f, 12.0f, 120.0f, 7.0f);
874 ControlSlider *slider = ControlSlider::create("extensions/sliderTrack2.png","extensions/sliderProgress2.png" ,"extensions/sliderThumb.png");
875 //[[UISlider alloc] initWithFrame:frame];
876 slider->addTargetWithActionForControlEvents(this, cccontrol_selector(TwoSchedulers::sliderAction), Control::EventType::VALUE_CHANGED);
877
878 // in case the parent view draws with a custom color or gradient, use a transparent color
879 //slider.backgroundColor = [UIColor clearColor];
880
881 slider->setMinimumValue(0.0f);
882 slider->setMaximumValue(2.0f);
883 //slider.continuous = YES;
884 slider->setValue(1.0f);
885
886 return slider;
887}
888
889void TwoSchedulers::sliderAction(Ref* sender, Control::EventType /*controlEvent*/)
890{
891 float scale;
892
893 ControlSlider *slider = static_cast<ControlSlider*>(sender);
894 scale = slider->getValue();
895
896 if( sender == sliderCtl1 )
897 sched1->setTimeScale(scale);
898 else
899 sched2->setTimeScale(scale);
900}
901
903{
905
906 auto s = Director::getInstance()->getWinSize();
907
908 // rotate and jump
909 auto jump1 = JumpBy::create(4, Vec2(0,0), 100, 4);
910 auto jump2 = jump1->reverse();
911
912 auto seq = Sequence::create(jump2, jump1, nullptr);
913 auto action = RepeatForever::create(seq);
914
915 //
916 // Center
917 //
918 auto grossini = Sprite::create("Images/grossini.png");
919 addChild(grossini);
920 grossini->setPosition(Vec2(s.width/2,100.0f));
921 grossini->runAction(action->clone());
922
923 auto defaultScheduler = Director::getInstance()->getScheduler();
924
925 //
926 // Left:
927 //
928
929 // Create a new scheduler, and link it to the main scheduler
930 sched1 = new (std::nothrow) Scheduler();
931
932 defaultScheduler->scheduleUpdate(sched1, 0, false);
933
934 // Create a new ActionManager, and link it to the new scheduler
935 actionManager1 = new (std::nothrow) ActionManager();
936 sched1->scheduleUpdate(actionManager1, 0, false);
937
938 for( unsigned int i=0; i < 10; i++ )
939 {
940 auto sprite = Sprite::create("Images/grossinis_sister1.png");
941
942 // IMPORTANT: Set the actionManager running any action
943 sprite->setActionManager(actionManager1);
944
945 addChild(sprite);
946 sprite->setPosition(Vec2(30+15*i,100.0f));
947
948 sprite->runAction(action->clone());
949 }
950
951
952 //
953 // Right:
954 //
955
956 // Create a new scheduler, and link it to the main scheduler
957 sched2 = new (std::nothrow) Scheduler();
958 defaultScheduler->scheduleUpdate(sched2, 0, false);
959
960 // Create a new ActionManager, and link it to the new scheduler
961 actionManager2 = new (std::nothrow) ActionManager();
962 sched2->scheduleUpdate(actionManager2, 0, false);
963
964 for( unsigned int i=0; i < 10; i++ ) {
965 auto sprite = Sprite::create("Images/grossinis_sister2.png");
966
967 // IMPORTANT: Set the actionManager running any action
968 sprite->setActionManager(actionManager2);
969
970 addChild(sprite);
971 sprite->setPosition(Vec2(s.width-30-15*i,100.0f));
972
973 sprite->runAction(action->clone());
974 }
975
977 addChild(sliderCtl1);
978 sliderCtl1->retain();
979 sliderCtl1->setPosition(Vec2(s.width / 4.0f, VisibleRect::top().y - 20));
980
982 addChild(sliderCtl2);
983 sliderCtl2->retain();
984 sliderCtl2->setPosition(Vec2(s.width / 4.0f*3.0f, VisibleRect::top().y-20));
985}
986
987
989{
990 auto defaultScheduler = Director::getInstance()->getScheduler();
991 defaultScheduler->unscheduleAllForTarget(sched1);
992 defaultScheduler->unscheduleAllForTarget(sched2);
993
994 sliderCtl1->release();
995 sliderCtl2->release();
996
997 sched1->release();
998 sched2->release();
999
1000 actionManager1->release();
1001 actionManager2->release();
1002}
1003
1004std::string TwoSchedulers::title() const
1005{
1006 return "Two custom schedulers";
1007}
1008
1009std::string TwoSchedulers::subtitle() const
1010{
1011 return "Three schedulers. 2 custom + 1 default. Two different time scales";
1012}
1013
1014// SchedulerIssue2268
1015
1016class TestNode2 : public Node
1017{
1018public:
1020
1022 cocos2d::log("Delete TestNode (should not crash)");
1023 this->unscheduleAllCallbacks();
1024 }
1025
1026 void update(float /*dt*/) {
1027 }
1028};
1029
1031{
1033
1034 testNode = TestNode2::create();
1035 testNode->retain();
1036 testNode->schedule(SEL_SCHEDULE(&TestNode::update));
1037 this->addChild(testNode);
1038
1039
1040 this->scheduleOnce(SEL_SCHEDULE(&SchedulerIssue2268::update), 0.25f);
1041}
1042
1044{
1045 if ( testNode != nullptr ) {
1046 // do something with testNode
1047
1048 // at some point we are done, pause the nodes actions and schedulers
1049 testNode->removeFromParentAndCleanup(false);
1050
1051 // at some other point we are completely done with the node and want to clear it
1052 testNode->unscheduleAllCallbacks();
1053 testNode->release();
1054 testNode = nullptr;
1055
1056 }
1057}
1059{
1060 CC_SAFE_RELEASE(testNode);
1061}
1062
1063std::string SchedulerIssue2268::title() const
1064{
1065 return "Issue #2268";
1066}
1067
1069{
1070 return "Should not crash";
1071}
1072
1073// SchedulerIssueWithReschedule
1074// https://github.com/cocos2d/cocos2d-x/pull/17706
1075
1077{
1079
1080 Size widgetSize = getContentSize();
1081
1082 auto status_text = Text::create("Checking..", "fonts/Marker Felt.ttf", 18);
1083 status_text->setColor(Color3B(255, 255, 255));
1084 status_text->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f));
1085 addChild(status_text);
1086
1087 // schedule(callback, target, interval, repeat, delay, paused, key);
1088 auto verified = std::make_shared<bool>();
1089 *verified = false;
1090
1091 _scheduler->schedule([this, verified](float dt){
1092 log("SchedulerIssueWithReschedule - first timer");
1093
1094 _scheduler->schedule([verified](float dt){
1095 log("SchedulerIssueWithReschedule - second timer. OK");
1096 *verified = true;
1097 }, this, 0.1f, 0, 0, false, "test_timer");
1098
1099 }, this, 0.1f, 0, 0, false, "test_timer");
1100
1101 _scheduler->schedule([verified, status_text](float dt){
1102 if (*verified)
1103 {
1104 log("SchedulerIssueWithReschedule - test OK");
1105 status_text->setString("OK");
1106 status_text->setColor(Color3B(0, 255, 0));
1107 }
1108 else
1109 {
1110 log("SchedulerIssueWithReschedule - test failed!");
1111 status_text->setString("Failed");
1112 status_text->setColor(Color3B(255, 0, 0));
1113 }
1114
1115 }, this, 0.5f, 0, 0, false, "test_verify_timer");
1116}
1117
1119{
1120 return "Issue with reschedule";
1121}
1122
1124{
1125 return "reschedule issue with same key";
1126}
1127
1128// ScheduleCallbackTest
1129
1131{
1132
1133}
1134
1136{
1137 return "ScheduleCallbackTest";
1138}
1139
1141{
1142 return "\n\n\n\nPlease see console.\n\
1143schedule(lambda, ...)\n\
1144schedule(CC_CALLBACK_1(XXX::member_function), this), this, ...)\n\
1145schedule(global_function, ...)\n\
1146";
1147}
1148
1150{
1151 log("In the callback of schedule(global_function, ...), dt = %f", dt);
1152}
1153
1155{
1157
1158 _scheduler->schedule([](float dt){
1159 log("In the callback of schedule(lambda, ...), dt = %f", dt);
1160 }, this, 1.0f, false, "lambda");
1161
1162 _scheduler->schedule(CC_CALLBACK_1(ScheduleCallbackTest::callback, this), this, 1.0f, false, "member_function");
1163
1164 _scheduler->schedule(ScheduleCallbackTest_global_callback, this, 1.0f, false, "global_function");
1165}
1166
1168{
1169 log("In the callback of schedule(CC_CALLBACK_1(XXX::member_function), this), this, ...), dt = %f", dt);
1170}
1171
1172
1173// ScheduleUpdatePriority
1174
1176{
1177 return "ScheduleUpdatePriorityTest";
1178}
1179
1181{
1182 return "click to change update priority with random value";
1183}
1184
1185bool ScheduleUpdatePriority::onTouchBegan(Touch* /*touch*/, Event* /*event*/)
1186{
1187 int priority = static_cast<int>(CCRANDOM_0_1() * 11) - 5; // -5 ~ 5
1188 CCLOG("change update priority to %d", priority);
1189 scheduleUpdateWithPriority(priority);
1190 return true;
1191}
1192
1194{
1196
1197 scheduleUpdate();
1198
1199 auto listener = EventListenerTouchOneByOne::create();
1200 listener->onTouchBegan = CC_CALLBACK_2(ScheduleUpdatePriority::onTouchBegan, this);
1201 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
1202}
1203
1205{
1206 Node::onExit();
1207 unscheduleUpdate();
1208}
1209
1211{
1212}
1213
1215{
1217
1218 this->scheduleOnce(SEL_SCHEDULE(&SchedulerIssue2268::update), 0.25f);
1219
1220 this->scheduleOnce([](float /*dt*/){
1221 log("SchedulerIssue10232:Schedules a lambda function");
1222 }, 0.25f,"SchedulerIssue10232");
1223}
1224
1226{
1227 log("SchedulerIssue10232:Schedules a selector");
1228}
1229
1231{
1232 return "Issue #10232";
1233}
1234
1236{
1237 return "Should not crash";
1238}
1239
1241{
1243
1244 _sprite = Sprite::create("Images/grossinis_sister1.png");
1245 _sprite->setPosition(VisibleRect::center());
1246 this->addChild(_sprite);
1247 this->scheduleUpdate();
1248}
1249
1251{
1252 SchedulerTestLayer::onExit();
1253 this->unscheduleUpdate();
1254}
1255
1257 Director::getInstance()->getScheduler()->performFunctionInCocosThread([this] () {
1258 _sprite->setVisible(false);
1259 });
1260 Director::getInstance()->getScheduler()->performFunctionInCocosThread([this] () {
1261 _sprite->setVisible(false);
1262 });
1263 Director::getInstance()->getScheduler()->performFunctionInCocosThread([this] () {
1264 _sprite->setVisible(false);
1265 });
1266 Director::getInstance()->getScheduler()->performFunctionInCocosThread([this] () {
1267 _sprite->setVisible(false);
1268 });
1269 Director::getInstance()->getScheduler()->performFunctionInCocosThread([this] () {
1270 _sprite->setVisible(false);
1271 });
1272 if(!TestController::getInstance()->isAutoTestRunning())
1273 Director::getInstance()->getScheduler()->removeAllFunctionsToBePerformedInCocosThread();
1274}
1275
1277{
1278 return "Removing pending main thread tasks";
1279}
1280
1282{
1283 return "Sprite should be visible";
1284}
1285
1286//class SchedulerIssue17149: public SchedulerTestLayer
1287//{
1288//public:
1289// CREATE_FUNC(SchedulerIssue17149);
1290//
1291// virtual std::string title() const override;
1292// void onEnter() override;
1293// void update(float dt) override;
1294//
1295//private:
1296// class ClassA
1297// {
1298// public:
1299// void update(float dt);
1300//
1301// int _member1;
1302// int _member2;
1303// int _member3;
1304// };
1305//
1306// class ClassB
1307// {
1308// void update(float dt);
1309// int _member1;
1310// int _member2;
1311// int _member3;
1312// };
1313//};
1314
1315// SchedulerIssue17149: https://github.com/cocos2d/cocos2d-x/issues/17149
1316
1318{
1319 _memoryPool = malloc(2018);
1320}
1321
1323{
1324 free(_memoryPool);
1325}
1326
1328{
1329 return "Issue #17149";
1330}
1331
1333{
1334 return "see console, result should be 'i'm ClassB: 456'";
1335}
1336
1338{
1340 scheduleUpdate();
1341}
1342
1344{
1345 auto classa = new (_memoryPool) ClassA();
1346 CCLOG("Address one: %p", classa);
1347 Director::getInstance()->getScheduler()->scheduleUpdate(classa, 1, false);
1348 Director::getInstance()->getScheduler()->unscheduleUpdate(classa);
1349
1350 auto classb = new (_memoryPool) ClassB();
1351 CCLOG("Address one: %p", classb);
1352 Director::getInstance()->getScheduler()->scheduleUpdate(classb, 1, false);
1353
1354 unscheduleUpdate();
1355}
1356
1358: _member1(1)
1359, _member2(2)
1360, _member3(3)
1361{}
1362
1364{
1365 CCLOG("i'm ClassA: %d%d%d", _member1, _member2, _member3);
1366}
1367
1369: _member1(4)
1370, _member2(5)
1371, _member3(6)
1372{}
1373
1375{
1376 CCLOG("i'm ClassB: %d%d%d", _member1, _member2, _member3);
1377
1378 Director::getInstance()->getScheduler()->unscheduleUpdate(this);
1379}
1380
1381//------------------------------------------------------------------
1382//
1383// SchedulerRemoveEntryWhileUpdate
1384//
1385//------------------------------------------------------------------
1386
1388{
1389 return "RemoveEntryWhileUpdate";
1390}
1391
1393{
1394 return "see console, error message must not be shown.";
1395}
1396
1398{
1400 for (auto i = 0; i < 500; ++i)
1401 {
1402 TestClass *nextObj = nullptr;
1403 if (i != 0)
1404 {
1405 nextObj = _testvector[i - 1];
1406 }
1407 auto obj = new TestClass(i, nextObj, getScheduler());
1408 _testvector.push_back(obj);
1409 getScheduler()->scheduleUpdate(obj, 500 - i, false);
1410 }
1411}
1412
1414{
1415 for (auto obj: _testvector)
1416 {
1417 getScheduler()->unscheduleUpdate(obj);
1418 delete obj;
1419 }
1420 _testvector.clear();
1421 SchedulerTestLayer::onExit();
1422}
1423
1424SchedulerRemoveEntryWhileUpdate::TestClass::TestClass(int index, TestClass *nextObj, cocos2d::Scheduler* scheduler)
1425: _nextObj(nextObj)
1426, _index(index)
1427, _scheduler(scheduler)
1428{
1429}
1430
1432{
1433 if (_cleanedUp)
1434 {
1435 CCLOG("Error: cleaned object must not be called.");
1436 return;
1437 }
1438
1439 if (_index % 50 == 1 && _nextObj != nullptr)
1440 {
1441 _scheduler->unscheduleUpdate(_nextObj);
1442 _nextObj->_cleanedUp = true;
1443 }
1444}
1445
1446//------------------------------------------------------------------
1447//
1448// SchedulerRemoveSelectorDuringCall
1449//
1450//------------------------------------------------------------------
1451
1453{
1454 return "RemoveSelectorDuringCall";
1455}
1456
1458{
1459 return "see console, error message must not be shown.";
1460}
1461
1463{
1465
1466 Scheduler* const scheduler( Director::getInstance()->getScheduler() );
1467
1468 scheduler->setTimeScale( 10 );
1469 scheduler->schedule
1470 (SEL_SCHEDULE(&SchedulerRemoveSelectorDuringCall::callback), this,
1471 0.01f, CC_REPEAT_FOREVER, 0.0f, !isRunning());
1472
1473 _scheduled = true;
1474}
1475
1477{
1478 Scheduler* const scheduler( Director::getInstance()->getScheduler() );
1479
1480 scheduler->setTimeScale( 1 );
1481 scheduler->unschedule
1482 (SEL_SCHEDULE(&SchedulerRemoveSelectorDuringCall::callback), this);
1483
1484 _scheduled = false;
1485 SchedulerTestLayer::onExit();
1486}
1487
1489{
1490 if ( !_scheduled )
1491 {
1492 cocos2d::log("Error: unscheduled callback must not be called.");
1493 return;
1494 }
1495
1496 _scheduled = false;
1497
1498 Scheduler* const scheduler( Director::getInstance()->getScheduler() );
1499 scheduler->unschedule
1500 (SEL_SCHEDULE(&SchedulerRemoveSelectorDuringCall::callback), this);
1501}
#define ADD_TEST_CASE(__className__)
Definition: BaseTest.h:211
static void ScheduleCallbackTest_global_callback(float dt)
USING_NS_CC_EXT
@ kTagAnimationDance
USING_NS_CC
virtual std::string title() const override
virtual void onEnter() override
virtual std::string subtitle() const override
void schedUpdate(float dt)
virtual std::string subtitle() const override
void onEnter() override
virtual std::string title() const override
void callback(float dt)
bool onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event)
virtual std::string subtitle() const override
virtual void update(float dt) override
virtual std::string title() const override
void tick(float dt)
virtual std::string title() const override
virtual void onEnter() override
void autoremove(float dt)
virtual std::string subtitle() const override
virtual std::string title() const override
void update(float dt) override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual std::string title() const override
void update(float dt) override
void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual void update(float dt) override
virtual std::string subtitle() const override
virtual std::string title() const override
void onEnter() override
void update(float dt) override
virtual std::string subtitle() const override
virtual std::string title() const override
cocos2d::Node * testNode
virtual std::string title() const override
virtual std::string subtitle() const override
virtual void update(float delta) override
virtual void onEnter() override
std::set< void * > _pausedTargets
Definition: SchedulerTest.h:90
virtual std::string title() const override
virtual std::string subtitle() const override
virtual void onExit() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual void onExit() override
std::set< void * > _pausedTargets
virtual std::string title() const override
void pause(float dt)
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onEnter() override
void tick2(float dt)
void tick1(float dt)
virtual std::string subtitle() const override
void update(float dt)
TestClass(int index, TestClass *nextObj, cocos2d::Scheduler *scheduler)
virtual std::string title() const override
virtual std::string subtitle() const override
virtual void onExit() override
virtual void onEnter() override
virtual std::string title() const override
virtual void onEnter() override
virtual void onExit() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string title() const override
virtual std::string subtitle() const override
void scheduleAndUnschedule(float dt)
cocos2d::extension::ControlSlider * _sliderCtl
void sliderAction(cocos2d::Ref *sender, cocos2d::extension::Control::EventType controlEvent)
virtual std::string title() const override
void onExit() override
cocos2d::extension::ControlSlider * sliderCtl()
void onEnter() override
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual void onExit() override
virtual std::string title() const override
virtual void onEnter() override
virtual std::string title() const override
virtual std::string subtitle() const override
void unscheduleAll(float dt)
virtual void onEnter() override
virtual std::string title() const override
virtual void onEnter() override
virtual std::string subtitle() const override
void stopSelectors(float dt)
void update(float dt) override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onEnter() override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual void onEnter() override
void update(float dt) override
virtual std::string subtitle() const override
virtual void onEnter() override
void removeUpdates(float dt)
virtual std::string title() const override
virtual void onEnter() override
Definition: BaseTest.cpp:430
static TestController * getInstance()
Definition: controller.cpp:458
CREATE_FUNC(TestNode2)
void update(float)
std::string _string
virtual void update(float dt) override
void initWithString(const std::string &str, int priority)
cocos2d::Scheduler * sched2
cocos2d::Scheduler * sched1
cocos2d::ActionManager * actionManager2
cocos2d::extension::ControlSlider * sliderCtl()
void onEnter() override
cocos2d::ActionManager * actionManager1
cocos2d::extension::ControlSlider * sliderCtl2
virtual ~TwoSchedulers()
cocos2d::extension::ControlSlider * sliderCtl1
virtual std::string subtitle() const override
virtual std::string title() const override
void sliderAction(cocos2d::Ref *sender, cocos2d::extension::Control::EventType controlEvent)
static cocos2d::Vec2 top()
Definition: VisibleRect.cpp:57
static cocos2d::Vec2 center()
Definition: VisibleRect.cpp:69
static const char s_stars1[]
Definition: testResource.h:42