38EventDispatcherTests::EventDispatcherTests()
73 Vec2 origin = Director::getInstance()->getVisibleOrigin();
74 Size size = Director::getInstance()->getVisibleSize();
76 auto containerForSprite1 = Node::create();
77 auto sprite1 = Sprite::create(
"Images/CyanSquare.png");
78 sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 80.0f));
79 containerForSprite1->addChild(sprite1);
80 addChild(containerForSprite1, 10);
82 auto sprite2 = Sprite::create(
"Images/MagentaSquare.png");
83 sprite2->setPosition(origin+Vec2(size.width/2, size.height/2));
84 addChild(sprite2, 20);
86 auto sprite3 = Sprite::create(
"Images/YellowSquare.png");
87 sprite3->setPosition(Vec2(0, 0));
88 sprite2->addChild(sprite3, 1);
91 auto listener1 = EventListenerTouchOneByOne::create();
92 listener1->setSwallowTouches(
true);
94 listener1->onTouchBegan = [](Touch* touch, Event* event){
95 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
97 Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
98 Size s = target->getContentSize();
99 Rect rect = Rect(0, 0, s.width, s.height);
101 if (rect.containsPoint(locationInNode))
103 log(
"sprite began... x = %f, y = %f", locationInNode.x, locationInNode.y);
104 target->setOpacity(180);
110 listener1->onTouchMoved = [](Touch* touch, Event* event){
111 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
112 target->setPosition(target->getPosition() + touch->getDelta());
115 listener1->onTouchEnded = [=](Touch* touch, Event* event){
116 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
117 log(
"sprite onTouchesEnded.. ");
118 target->setOpacity(255);
119 if (target == sprite2)
121 containerForSprite1->setLocalZOrder(100);
123 else if(target == sprite1)
125 containerForSprite1->setLocalZOrder(0);
129 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1);
130 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite2);
131 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite3);
134 auto removeAllTouchItem = MenuItemFont::create(
"Remove All Touch Listeners", [
this](Ref* sender){
135 auto senderItem =
static_cast<MenuItemFont*
>(sender);
136 senderItem->setString(
"Only Next item could be clicked");
138 _eventDispatcher->removeEventListenersForType(EventListener::Type::TOUCH_ONE_BY_ONE);
140 auto nextItem = MenuItemFont::create(
"Next", [=](Ref* sender){
144 nextItem->setFontSizeObj(16);
147 auto menu2 = Menu::create(nextItem,
nullptr);
148 menu2->setPosition(Vec2(0, 0));
149 menu2->setAnchorPoint(Vec2(0, 0));
150 this->addChild(menu2);
153 removeAllTouchItem->setFontSizeObj(16);
156 auto menu = Menu::create(removeAllTouchItem,
nullptr);
157 menu->setPosition(Vec2(0, 0));
158 menu->setAnchorPoint(Vec2(0, 0));
164 return "Touchable Sprite Test";
169 return "Please drag the blocks";
180 if (ret && ret->init())
204 auto listener = EventListenerTouchOneByOne::create();
205 listener->setSwallowTouches(
true);
207 listener->onTouchBegan = [
this](Touch* touch, Event* event){
208 Vec2 locationInNode = this->convertToNodeSpace(touch->getLocation());
209 Size s = this->getContentSize();
210 Rect rect = Rect(0, 0, s.width, s.height);
212 if (rect.containsPoint(locationInNode))
214 log(
"TouchableSprite: onTouchBegan ...");
215 this->setColor(Color3B::RED);
221 listener->onTouchEnded = [
this](Touch* touch, Event* event){
222 log(
"TouchableSprite: onTouchEnded ...");
223 this->setColor(Color3B::WHITE);
227 _eventDispatcher->removeEventListener(
_listener);
234 _eventDispatcher->addEventListenerWithFixedPriority(listener,
_fixedPriority);
238 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
this);
249 _eventDispatcher->removeEventListener(
_listener);
269 Vec2 origin = Director::getInstance()->getVisibleOrigin();
270 Size size = Director::getInstance()->getVisibleSize();
273 sprite1->setTexture(
"Images/CyanSquare.png");
274 sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 40.0f));
275 addChild(sprite1, 10);
278 sprite2->setTexture(
"Images/MagentaSquare.png");
279 sprite2->setPosition(origin+Vec2(size.width/2, size.height/2));
280 addChild(sprite2, 20);
283 sprite3->setTexture(
"Images/YellowSquare.png");
284 sprite3->setPosition(Vec2(0, 0));
285 sprite2->addChild(sprite3, 1);
291 return "Fixed priority test";
296 return "Fixed Priority, Blue: 30, Red: 20, Yellow: 10\n The lower value the higher priority will be.";
304 Vec2 origin = Director::getInstance()->getVisibleOrigin();
305 Size size = Director::getInstance()->getVisibleSize();
307 auto sprite1 = Sprite::create(
"Images/CyanSquare.png");
308 sprite1->setPosition(origin+Vec2(size.width/2, size.height/2));
309 addChild(sprite1, 10);
312 auto listener1 = EventListenerTouchOneByOne::create();
313 listener1->setSwallowTouches(
true);
314 setUserObject(listener1);
316 std::shared_ptr<bool> firstClick(
new bool(
true));
318 listener1->onTouchBegan = [=](Touch* touch, Event* event){
319 Vec2 locationInNode = sprite1->convertToNodeSpace(touch->getLocation());
320 Size s = sprite1->getContentSize();
321 Rect rect = Rect(0, 0, s.width, s.height);
323 if (rect.containsPoint(locationInNode))
325 sprite1->setColor(Color3B::RED);
331 listener1->onTouchEnded = [=](Touch* touch, Event* event){
332 sprite1->setColor(Color3B::WHITE);
335 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1);
337 auto statusLabel = Label::createWithSystemFont(
"The sprite could be touched!",
"", 20);
338 statusLabel->setPosition(origin + Vec2(size.width/2, size.height-90));
339 addChild(statusLabel);
340 std::shared_ptr<bool> enable(
new bool(
true));
342 auto toggleItem = MenuItemToggle::createWithCallback([=](Ref* sender){
345 _eventDispatcher->removeEventListener(listener1);
346 statusLabel->setString(
"The sprite could not be touched!");
352 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1);
353 statusLabel->setString(
"The sprite could be touched!");
357 }, MenuItemFont::create(
"Enabled"), MenuItemFont::create(
"Disabled"),
nullptr);
359 toggleItem->setPosition(origin + Vec2(size.width/2, 80.0f));
360 auto menu = Menu::create(toggleItem,
nullptr);
361 menu->setPosition(Vec2(0.0f, 0.0f));
362 menu->setAnchorPoint(Vec2(0.0f, 0.0f));
368 return "Add and remove listener\n when dispatching event";
381 Vec2 origin = Director::getInstance()->getVisibleOrigin();
382 Size size = Director::getInstance()->getVisibleSize();
384 MenuItemFont::setFontSize(20);
386 auto statusLabel = Label::createWithSystemFont(
"No custom event 1 received!",
"", 20);
387 statusLabel->setPosition(origin + Vec2(size.width/2, size.height-90));
388 addChild(statusLabel);
390 _listener = EventListenerCustom::create(
"game_custom_event1", [=](EventCustom* event){
391 std::string str(
"Custom event 1 received, ");
392 char* buf =
static_cast<char*
>(
event->getUserData());
395 statusLabel->setString(str.c_str());
398 _eventDispatcher->addEventListenerWithFixedPriority(
_listener, 1);
400 auto sendItem = MenuItemFont::create(
"Send Custom Event 1", [=](Ref* sender){
401 static int count = 0;
403 char* buf =
new char[10];
404 sprintf(buf,
"%d", count);
405 EventCustom event(
"game_custom_event1");
406 event.setUserData(buf);
407 _eventDispatcher->dispatchEvent(&event);
408 CC_SAFE_DELETE_ARRAY(buf);
410 sendItem->setPosition(origin + Vec2(size.width/2, size.height/2));
412 auto statusLabel2 = Label::createWithSystemFont(
"No custom event 2 received!",
"", 20);
413 statusLabel2->setPosition(origin + Vec2(size.width/2, size.height-120));
414 addChild(statusLabel2);
416 _listener2 = EventListenerCustom::create(
"game_custom_event2", [=](EventCustom* event){
417 std::string str(
"Custom event 2 received, ");
418 char* buf =
static_cast<char*
>(
event->getUserData());
421 statusLabel2->setString(str.c_str());
424 _eventDispatcher->addEventListenerWithFixedPriority(
_listener2, 1);
426 auto sendItem2 = MenuItemFont::create(
"Send Custom Event 2", [=](Ref* sender){
427 static int count = 0;
429 char* buf =
new char[10];
430 sprintf(buf,
"%d", count);
431 EventCustom event(
"game_custom_event2");
432 event.setUserData(buf);
433 _eventDispatcher->dispatchEvent(&event);
434 CC_SAFE_DELETE_ARRAY(buf);
436 sendItem2->setPosition(origin + Vec2(size.width/2, size.height/2 - 40));
438 auto menu = Menu::create(sendItem, sendItem2,
nullptr);
439 menu->setPosition(Vec2(0, 0));
440 menu->setAnchorPoint(Vec2(0, 0));
446 _eventDispatcher->removeEventListener(
_listener);
447 _eventDispatcher->removeEventListener(
_listener2);
448 EventDispatcherTestDemo::onExit();
453 return "Send custom event";
466 Vec2 origin = Director::getInstance()->getVisibleOrigin();
467 Size size = Director::getInstance()->getVisibleSize();
469 auto statusLabel = Label::createWithSystemFont(
"No keyboard event received!",
"", 20);
470 statusLabel->setPosition(origin + Vec2(size.width/2, size.height/2));
471 addChild(statusLabel);
473 auto listener = EventListenerKeyboard::create();
474 listener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event* event){
476 sprintf(buf,
"Key %d was pressed!", (
int)keyCode);
477 auto label =
static_cast<Label*
>(
event->getCurrentTarget());
478 label->setString(buf);
481 listener->onKeyReleased = [](EventKeyboard::KeyCode keyCode, Event* event){
483 sprintf(buf,
"Key %d was released!", (
int)keyCode);
484 auto label =
static_cast<Label*
>(
event->getCurrentTarget());
485 label->setString(buf);
488 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, statusLabel);
493 return "Label Receives Keyboard Event";
498 return "Please click keyboard\n(Only available on Desktop, Android\nand Windows Universal Apps)";
504#define FIX_POS(_pos, _min, _max) \
507else if (_pos > _max) \
512 Vec2 origin = Director::getInstance()->getVisibleOrigin();
513 Size size = Director::getInstance()->getVisibleSize();
515 Device::setAccelerometerEnabled(
true);
517 auto sprite = Sprite::create(
s_Ball);
518 sprite->setPosition(origin + Vec2(size.width/2, size.height/2));
521 auto listener = EventListenerAcceleration::create([=](Acceleration* acc, Event* event){
522 auto ballSize = sprite->getContentSize();
524 auto ptNow = sprite->getPosition();
526 log(
"acc: x = %lf, y = %lf", acc->x, acc->y);
528 ptNow.x += acc->x * 9.81f;
529 ptNow.y += acc->y * 9.81f;
533 sprite->setPosition(ptNow);
536 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, sprite);
541 Device::setAccelerometerEnabled(
false);
542 EventDispatcherTestDemo::onExit();
547 return "Sprite Receives Acceleration Event";
552 return "Please move your device\n(Only available on mobile)";
562 Vec2 origin = Director::getInstance()->getVisibleOrigin();
563 Size size = Director::getInstance()->getVisibleSize();
565 _sprite = Sprite::create(
"Images/CyanSquare.png");
566 _sprite->setPosition(origin+Vec2(size.width/2, size.height/2));
570 auto listener1 = EventListenerTouchOneByOne::create();
571 listener1->setSwallowTouches(
true);
573 listener1->onTouchBegan = [](Touch* touch, Event* event){
574 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
576 Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
577 Size s = target->getContentSize();
578 Rect rect = Rect(0, 0, s.width, s.height);
580 if (rect.containsPoint(locationInNode))
582 log(
"sprite began... x = %f, y = %f", locationInNode.x, locationInNode.y);
583 target->setOpacity(180);
589 listener1->onTouchMoved = [](Touch* touch, Event* event){
590 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
591 target->setPosition(target->getPosition() + touch->getDelta());
594 listener1->onTouchEnded = [=](Touch* touch, Event* event){
595 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
596 log(
"sprite onTouchesEnded.. ");
597 target->setOpacity(255);
600 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1,
_sprite);
602 this->runAction(Sequence::create(DelayTime::create(5.0f),
603 CallFunc::create([
this](){
606 _sprite->removeFromParentAndCleanup(
false);
608 DelayTime::create(5.0f),
609 CallFunc::create([
this](){
620 EventDispatcherTestDemo::onExit();
629 return "RemoveAndRetainNodeTest";
634 return "Sprite should be removed after 5s, add to scene again after 5s";
642 auto item1 = MenuItemFont::create(
"Click Me 1", [
this](Ref* sender){
643 auto listener = EventListenerTouchOneByOne::create();
644 listener->onTouchBegan = [](Touch* touch, Event* event) ->
bool{
645 CCASSERT(
false,
"Should not come here!");
649 _eventDispatcher->addEventListenerWithFixedPriority(listener, -1);
650 _eventDispatcher->removeEventListener(listener);
655 auto addNextButton = [
this](){
656 auto next = MenuItemFont::create(
"Please Click Me To Reset!", [
this](Ref* sender){
661 auto menu = Menu::create(next,
nullptr);
663 menu->setAnchorPoint(Vec2::ZERO);
664 this->addChild(menu);
667 auto item2 = MenuItemFont::create(
"Click Me 2", [=](Ref* sender){
668 auto listener = EventListenerTouchOneByOne::create();
669 listener->onTouchBegan = [](Touch* touch, Event* event) ->
bool{
670 CCASSERT(
false,
"Should not come here!");
674 _eventDispatcher->addEventListenerWithFixedPriority(listener, -1);
675 _eventDispatcher->removeEventListenersForType(EventListener::Type::TOUCH_ONE_BY_ONE);
682 auto item3 = MenuItemFont::create(
"Click Me 3", [=](Ref* sender){
683 auto listener = EventListenerTouchOneByOne::create();
684 listener->onTouchBegan = [](Touch* touch, Event* event) ->
bool{
685 CCASSERT(
false,
"Should not come here!");
689 _eventDispatcher->addEventListenerWithFixedPriority(listener, -1);
690 _eventDispatcher->removeAllEventListeners();
697 auto menu = Menu::create(item1, item2, item3,
nullptr);
699 menu->setAnchorPoint(Vec2::ZERO);
706 EventDispatcherTestDemo::onExit();
711 return "RemoveListenerAfterAddingTest";
716 return "Should not crash!";
736 Size s = Director::getInstance()->getWinSize();
738 TTFConfig ttfConfig(
"fonts/arial.ttf", 20);
740 _label1 = Label::createWithTTF(ttfConfig,
"Update: 0");
741 _label1->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
742 _label1->setPosition(30,s.height/2 + 60);
745 _label2 = Label::createWithTTF(ttfConfig,
"Visit: 0");
746 _label2->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
747 _label2->setPosition(30,s.height/2 + 20);
750 _label3 = Label::createWithTTF(ttfConfig,
"Draw: 0");
751 _label3->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
753 _label3->setPosition(30,s.height/2 - 20);
756 _label4 = Label::createWithTTF(ttfConfig,
"Projection: 0");
757 _label4->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
759 _label4->setPosition(30,s.height/2 - 60);
762 auto dispatcher = Director::getInstance()->getEventDispatcher();
766 _event3 = dispatcher->addCustomEventListener(Director::EVENT_AFTER_DRAW, [&](EventCustom *event) {
768 snprintf(buf,
sizeof(buf)-1,
"Draw: %d",
_count3++);
771 _event4 = dispatcher->addCustomEventListener(Director::EVENT_PROJECTION_CHANGED, [&](EventCustom *event) {
773 snprintf(buf,
sizeof(buf)-1,
"Projection: %d",
_count4++);
787 static float time = 0;
791 Director::getInstance()->setProjection(Director::Projection::_2D);
798 EventDispatcherTestDemo::onExit();
800 Director::getInstance()->setProjection(Director::Projection::DEFAULT);
802 auto dispatcher = Director::getInstance()->getEventDispatcher();
803 dispatcher->removeEventListener(
_event1);
804 dispatcher->removeEventListener(
_event2);
805 dispatcher->removeEventListener(
_event3);
806 dispatcher->removeEventListener(
_event4);
817 snprintf(buf,
sizeof(buf)-1,
"Update: %d",
_count1++);
824 snprintf(buf,
sizeof(buf)-1,
"Visit: %d",
_count2++);
831 return "Testing Director Events";
836 return "after visit, after draw, after update, projection changed";
845 auto listener = EventListenerTouchOneByOne::create();
846 listener->setSwallowTouches(
true);
848 listener->onTouchBegan = [](Touch* touch, Event* event){
849 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
851 Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
852 Size s = target->getContentSize();
853 Rect rect = Rect(0, 0, s.width, s.height);
855 if (rect.containsPoint(locationInNode))
857 log(
"sprite began... x = %f, y = %f", locationInNode.x, locationInNode.y);
858 target->setOpacity(180);
864 listener->onTouchMoved = [](Touch* touch, Event* event){
865 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
866 target->setPosition(target->getPosition() + touch->getDelta());
869 listener->onTouchEnded = [=](Touch* touch, Event* event){
870 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
871 log(
"sprite onTouchesEnded.. ");
872 target->setOpacity(255);
875 const int SPRITE_COUNT = 8;
877 for (
int i = 0; i < SPRITE_COUNT; i++)
882 sprite = Sprite::create(
"Images/CyanSquare.png");
888 sprite = Sprite::create(
"Images/YellowSquare.png");
891 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), sprite);
893 this->addChild(sprite);
895 Size visibleSize = Director::getInstance()->getVisibleSize();
899 this->scheduleUpdate();
906 float z =
_sprite->getGlobalZOrder();
914 return "Global Z Value, Try touch blue sprite";
919 return "Blue Sprite should change go from foreground to background";
924 static const int TAG_BLUE_SPRITE = 101;
925 static const int TAG_BLUE_SPRITE2 = 102;
927 auto touchOneByOneListener = EventListenerTouchOneByOne::create();
928 touchOneByOneListener->setSwallowTouches(
true);
930 touchOneByOneListener->onTouchBegan = [=](Touch* touch, Event* event){
935 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
936 CCASSERT(target->getTag() == TAG_BLUE_SPRITE,
"Yellow blocks shouldn't response event.");
940 target->setOpacity(180);
945 event->stopPropagation();
949 touchOneByOneListener->onTouchEnded = [=](Touch* touch, Event* event){
950 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
951 target->setOpacity(255);
954 auto touchAllAtOnceListener = EventListenerTouchAllAtOnce::create();
955 touchAllAtOnceListener->onTouchesBegan = [=](
const std::vector<Touch*>& touches, Event* event){
960 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
961 CCASSERT(target->getTag() == TAG_BLUE_SPRITE2,
"Yellow blocks shouldn't response event.");
965 target->setOpacity(180);
968 event->stopPropagation();
971 touchAllAtOnceListener->onTouchesEnded = [=](
const std::vector<Touch*>& touches, Event* event){
976 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
977 CCASSERT(target->getTag() == TAG_BLUE_SPRITE2,
"Yellow blocks shouldn't response event.");
981 target->setOpacity(255);
984 event->stopPropagation();
987 auto keyboardEventListener = EventListenerKeyboard::create();
988 keyboardEventListener->onKeyPressed = [](EventKeyboard::KeyCode , Event* event){
989 auto target =
static_cast<Sprite*
>(
event->getCurrentTarget());
990 CC_UNUSED_PARAM(target);
991 CCASSERT(target->getTag() == TAG_BLUE_SPRITE || target->getTag() == TAG_BLUE_SPRITE2,
"Yellow blocks shouldn't response event.");
993 event->stopPropagation();
996 const int SPRITE_COUNT = 8;
998 for (
int i = 0; i < SPRITE_COUNT; i++)
1005 sprite = Sprite::create(
"Images/CyanSquare.png");
1006 sprite->setTag(TAG_BLUE_SPRITE);
1007 addChild(sprite, 100);
1009 sprite2 = Sprite::create(
"Images/CyanSquare.png");
1010 sprite2->setTag(TAG_BLUE_SPRITE2);
1011 addChild(sprite2, 100);
1015 sprite = Sprite::create(
"Images/YellowSquare.png");
1016 addChild(sprite, 0);
1017 sprite2 = Sprite::create(
"Images/YellowSquare.png");
1018 addChild(sprite2, 0);
1021 _eventDispatcher->addEventListenerWithSceneGraphPriority(touchOneByOneListener->clone(), sprite);
1022 _eventDispatcher->addEventListenerWithSceneGraphPriority(keyboardEventListener->clone(), sprite);
1024 _eventDispatcher->addEventListenerWithSceneGraphPriority(touchAllAtOnceListener->clone(), sprite2);
1025 _eventDispatcher->addEventListenerWithSceneGraphPriority(keyboardEventListener->clone(), sprite2);
1028 Size visibleSize = Director::getInstance()->getVisibleSize();
1036 Vec2 locationInNode = node->convertToNodeSpace(pt);
1037 Size s = node->getContentSize();
1038 Rect rect = Rect(0, 0, s.width, s.height);
1040 if (rect.containsPoint(locationInNode))
1049 Size winSize = Director::getInstance()->getWinSize();
1051 if (pt.y >= winSize.height/2) {
1060 return "Stop Propagation Test";
1065 return "Shouldn't crash and only blue block could be clicked";
1071 Vec2 origin = Director::getInstance()->getVisibleOrigin();
1072 Size size = Director::getInstance()->getVisibleSize();
1075 sprite1->setTexture(
"Images/CyanSquare.png");
1076 sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 40.0f));
1077 addChild(sprite1, -10);
1080 sprite2->setTexture(
"Images/MagentaSquare.png");
1081 sprite2->setPosition(origin+Vec2(size.width/2, size.height/2));
1082 addChild(sprite2, -20);
1085 sprite3->setTexture(
"Images/YellowSquare.png");
1086 sprite3->setPosition(Vec2(0, 0));
1087 sprite2->addChild(sprite3, -1);
1089 auto popup = MenuItemFont::create(
"Popup", [=](Ref* sender){
1091 sprite3->getListener()->setEnabled(
false);
1092 _eventDispatcher->pauseEventListenersForTarget(
this,
true);
1094 auto colorLayer = LayerColor::create(Color4B(0, 0, 255, 100));
1095 this->addChild(colorLayer, 99999);
1097 auto closeItem = MenuItemFont::create(
"close", [=](Ref* sender){
1098 colorLayer->removeFromParent();
1099 _eventDispatcher->resumeEventListenersForTarget(
this,
true);
1100 sprite3->getListener()->setEnabled(
true);
1105 auto closeMenu = Menu::create(closeItem,
nullptr);
1106 closeMenu->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
1107 closeMenu->setPosition(Vec2::ZERO);
1109 colorLayer->addChild(closeMenu);
1112 popup->setAnchorPoint(Vec2::ANCHOR_MIDDLE_RIGHT);
1115 auto menu = Menu::create(popup,
nullptr);
1116 menu->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
1117 menu->setPosition(Vec2::ZERO);
1128 return "PauseResumeTargetTest";
1133 return "Yellow block uses fixed priority";
1139 MenuItemFont::getFontSize();
1140 Vec2 origin = Director::getInstance()->getVisibleOrigin();
1141 Size size = Director::getInstance()->getVisibleSize();
1146 _touchableSprite->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 40.0f));
1149 _itemPauseTouch = MenuItemFont::create(
"pauseTouch", [=](Ref* sender){
1169 _itemAddToScene = MenuItemFont::create(
"addToScene", [=](Ref* sender){
1197 menu->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
1198 menu->setPosition(Vec2::ZERO);
1210 return "PauseResumeTargetTest2";
1221 MenuItemFont::getFontSize();
1222 Vec2 origin = Director::getInstance()->getVisibleOrigin();
1223 Size size = Director::getInstance()->getVisibleSize();
1226 _touchableSprite->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 40.0f));
1229 auto item = MenuItemFont::create(
"addListener", [=](Ref* sender){
1231 MenuItemFont* senderItem =
static_cast<MenuItemFont*
>(sender);
1232 senderItem->setEnabled(
false);
1234 auto listener = EventListenerTouchOneByOne::create();
1235 listener->setSwallowTouches(
true);
1237 listener->onTouchBegan = [=](Touch* touch, Event* event){
1238 Vec2 locationInNode =
_touchableSprite->convertToNodeSpace(touch->getLocation());
1240 Rect rect = Rect(0, 0, s.width, s.height);
1242 if (rect.containsPoint(locationInNode))
1244 log(
"TouchableSprite: onTouchBegan ...");
1251 listener->onTouchEnded = [
this](Touch* touch, Event* event){
1252 log(
"TouchableSprite: onTouchEnded ...");
1256 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
_touchableSprite);
1260 item->setAnchorPoint(Vec2::ANCHOR_MIDDLE_RIGHT);
1263 auto menu = Menu::create(item,
nullptr);
1264 menu->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
1265 menu->setPosition(Vec2::ZERO);
1277 return "PauseResumeTargetTest3";
1282 return "Sprite should not be touchable";
1289 _customlistener = _eventDispatcher->addCustomEventListener(EVENT_COME_TO_BACKGROUND, [
this](EventCustom* event){
1291 auto label = Label::createWithSystemFont(
"Yeah, this issue was fixed.",
"", 20);
1292 label->setAnchorPoint(Vec2(0.0f, 0.5f));
1294 this->addChild(label);
1303 auto removeAllTouchItem = MenuItemFont::create(
"Remove All Listeners", [
this](Ref* sender){
1304 auto senderItem =
static_cast<MenuItemFont*
>(sender);
1305 senderItem->setString(
"Only 'Reset' item could be clicked");
1307 _eventDispatcher->removeAllEventListeners();
1309 auto nextItem = MenuItemFont::create(
"Reset", [=](Ref* sender){
1310 CCASSERT(
_bugFixed,
"This issue was not fixed!");
1314 nextItem->setFontSizeObj(16);
1317 auto menu2 = Menu::create(nextItem,
nullptr);
1318 menu2->setPosition(Vec2(0, 0));
1319 menu2->setAnchorPoint(Vec2(0, 0));
1320 this->addChild(menu2);
1323 _eventDispatcher->dispatchCustomEvent(EVENT_COME_TO_BACKGROUND);
1326 removeAllTouchItem->setFontSizeObj(16);
1329 auto menu = Menu::create(removeAllTouchItem,
nullptr);
1330 menu->setPosition(Vec2(0, 0));
1331 menu->setAnchorPoint(Vec2(0, 0));
1345 return "Issue 4129: Remove All Listeners";
1350 return "Should see 'Yeah, this issue was fixed.'";
1356 Vec2 origin = Director::getInstance()->getVisibleOrigin();
1357 Size size = Director::getInstance()->getVisibleSize();
1360 sprite1->setTexture(
"Images/CyanSquare.png");
1361 sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 40.0f));
1362 addChild(sprite1, -10);
1365 sprite2->setTexture(
"Images/MagentaSquare.png");
1366 sprite2->removeListenerOnTouchEnded(
true);
1367 sprite2->setPosition(origin+Vec2(size.width/2, size.height/2));
1368 addChild(sprite2, -20);
1371 sprite3->setTexture(
"Images/YellowSquare.png");
1372 sprite3->setPosition(Vec2(0, 0));
1373 sprite2->addChild(sprite3, -1);
1382 return "Issue 4160: Out of range exception";
1387 return "Touch the red block twice \n should not crash and the red one couldn't be touched";
1401 if (ret && ret->init())
1407 CC_SAFE_DELETE(ret);
1430 _eventListener->onTouchBegan = [
this](Touch* touch, Event* event) ->
bool
1441 _eventDispatcher->addEventListenerWithSceneGraphPriority(
_eventListener,
this);
1446 _eventDispatcher->removeEventListenersForTarget(
this);
1458#if CC_NODE_DEBUG_VERIFY_EVENT_LISTENERS == 1 && COCOS2D_DEBUG > 0
1459 Vec2 origin = Director::getInstance()->getVisibleOrigin();
1460 Size size = Director::getInstance()->getVisibleSize();
1464 CCASSERT(
false,
"This should never be called because the sprite gets removed from it's parent and destroyed!");
1471 CCASSERT(sprite2,
"The first child of sprite 1 should be sprite 2!");
1472 CCASSERT(sprite2->getReferenceCount() == 1,
"There should only be 1 reference to sprite 1, from it's parent node. Hence removing it will destroy it!");
1473 sprite1->removeAllChildren();
1477 sprite2->setTexture(
"Images/MagentaSquare.png");
1478 sprite2->setPosition(origin+Vec2(size.width/2, size.height/2));
1479 sprite1->addChild(sprite2, -20);
1483 sprite1->setTexture(
"Images/CyanSquare.png");
1484 sprite1->setPosition(origin+Vec2(size.width/2, size.height/2));
1485 addChild(sprite1, -10);
1488 sprite2->setTexture(
"Images/MagentaSquare.png");
1489 sprite2->setPosition(origin+Vec2(size.width/2, size.height/2));
1490 sprite1->addChild(sprite2, -20);
1502 return "DanglingNodePointersTest";
1507#if CC_NODE_DEBUG_VERIFY_EVENT_LISTENERS == 1 && COCOS2D_DEBUG > 0
1508 return "Tap the square - should not crash!";
1510 return "For test to work, must be compiled with:\n"
1511 "CC_NODE_DEBUG_VERIFY_EVENT_LISTENERS == 1\n&& COCOS2D_DEBUG > 0";
1518 Vec2 origin = Director::getInstance()->getVisibleOrigin();
1519 Size size = Director::getInstance()->getVisibleSize();
1525 CCASSERT(
false,
"This should never get called!");
1529 AutoreleasePool pool;
1532 sprite2->setTexture(
"Images/CyanSquare.png");
1533 sprite2->setPosition(origin+Vec2(size.width/2, size.height/2));
1535 addChild(sprite2, 0);
1536 removeChild(sprite2);
1541 sprite1->setTexture(
"Images/CyanSquare.png");
1542 sprite1->setPosition(origin+Vec2(size.width/2, size.height/2));
1543 addChild(sprite1, -10);
1548 return "RegisterAndUnregisterWhileEventHanldingTest";
1553 return "Tap the square multiple times - should not crash!";
1559#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC)
1560 auto dispatcher = Director::getInstance()->getEventDispatcher();
1561 dispatcher->addCustomEventListener(GLViewImpl::EVENT_WINDOW_RESIZED, [](EventCustom* event) {
1563 log(
"<<< WINDOW RESIZED! >>> ");
1565 dispatcher->addCustomEventListener(GLViewImpl::EVENT_WINDOW_FOCUSED, [](EventCustom* event) {
1566 log(
"<<< WINDOW FOCUSED! >>> ");
1568 dispatcher->addCustomEventListener(GLViewImpl::EVENT_WINDOW_UNFOCUSED, [](EventCustom* event) {
1569 log(
"<<< WINDOW BLURRED! >>> ");
1576 return "WindowEventsTest";
1581#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC)
1582 return "Resize and Switch to another window and back. Read Logs.";
1584 return "Unsupported platform.";
1592 auto origin = Director::getInstance()->getVisibleOrigin();
1593 auto size = Director::getInstance()->getVisibleSize();
1594 static bool nodesAdded =
false;
1598 _listener = getEventDispatcher()->addCustomEventListener(Director::EVENT_AFTER_UPDATE, [
this](cocos2d::EventCustom *event){
1602 getEventDispatcher()->dispatchCustomEvent(
"Issue8194");
1605 getEventDispatcher()->removeCustomEventListeners(
"Issue8194");
1606 removeChildByTag(
tagA);
1607 removeChildByTag(
tagB);
1614 auto menuItem = MenuItemFont::create(
"Dispatch Custom Event", [
this](Ref *sender) {
1616 auto nodeA = Node::create();
1617 addChild(nodeA, 1,
tagA);
1619 cocos2d::EventListenerCustom* listenerA = cocos2d::EventListenerCustom::create(
"Issue8194", [&](cocos2d::EventCustom *event){
1621 event->stopPropagation();
1623 getEventDispatcher()->addEventListenerWithSceneGraphPriority(listenerA, nodeA);
1626 auto nodeB = Node::create();
1627 addChild(nodeB, -1,
tagB);
1629 cocos2d::EventListenerCustom* listenerB = cocos2d::EventListenerCustom::create(
"Issue8194", [&](cocos2d::EventCustom *event){
1631 event->stopPropagation();
1633 getEventDispatcher()->addEventListenerWithSceneGraphPriority(listenerB, nodeB);
1638 menuItem->setPosition(origin.x + size.width/2, origin.y + size.height/2);
1639 auto menu = Menu::create(menuItem,
nullptr);
1640 menu->setPosition(Vec2::ZERO);
1646 getEventDispatcher()->removeEventListener(
_listener);
1651 return "Issue 8194";
1656 return "After click button, should show 'Bug has been fixed.'";
1661 auto origin = Director::getInstance()->getVisibleOrigin();
1662 auto size = Director::getInstance()->getVisibleSize();
1664 auto nodeA = Node::create();
1667 _listener = cocos2d::EventListenerCustom::create(
"Issue9898", [&](cocos2d::EventCustom *event){
1668 _eventDispatcher->removeEventListener(
_listener);
1669 _eventDispatcher->dispatchCustomEvent(
"Issue9898");
1671 _eventDispatcher->addEventListenerWithSceneGraphPriority(
_listener, nodeA);
1673 auto menuItem = MenuItemFont::create(
"Dispatch Custom Event", [&](Ref *sender) {
1674 _eventDispatcher->dispatchCustomEvent(
"Issue9898");
1676 menuItem->setPosition(origin.x + size.width/2, origin.y + size.height/2);
1677 auto menu = Menu::create(menuItem,
nullptr);
1678 menu->setPosition(Vec2::ZERO);
1684 return "Issue 9898";
1689 return "Should not crash if dispatch event after remove\n event listener in callback";
#define ADD_TEST_CASE(__className__)
#define FIX_POS(_pos, _min, _max)
virtual void onEnter() override
cocos2d::EventListenerCustom * _listener
virtual std::string title() const override
cocos2d::EventListenerCustom * _listener2
virtual std::string subtitle() const override
virtual void onExit() override
DanglingNodePointersTest()
virtual std::string subtitle() const override
virtual ~DanglingNodePointersTest()
virtual std::string title() const override
EventListenerTouchOneByOne * _eventListener
TappedCallback _tappedCallback
static DanglingNodePointersTestSprite * create(const TappedCallback &tappedCallback)
std::function< void(DanglingNodePointersTestSprite *sprite)> TappedCallback
DanglingNodePointersTestSprite(const TappedCallback &tappedCallback)
virtual std::string title() const override
void onEvent2(cocos2d::EventCustom *event)
void onEvent1(cocos2d::EventCustom *event)
cocos2d::EventListenerCustom * _event1
virtual void onExit() override
cocos2d::EventListenerCustom * _event4
virtual std::string subtitle() const override
virtual void onEnter() override
virtual void update(float dt) override
cocos2d::EventListenerCustom * _event3
cocos2d::EventListenerCustom * _event2
virtual std::string title() const override
virtual std::string title() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual std::string title() const override
cocos2d::Sprite * _sprite
virtual void update(float dt) override
virtual std::string subtitle() const override
virtual std::string title() const override
cocos2d::EventListenerCustom * _customlistener
virtual std::string subtitle() const override
virtual std::string title() const override
cocos2d::EventListenerCustom * _listener
virtual std::string title() const override
virtual std::string subtitle() const override
cocos2d::EventListenerCustom * _listener
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual ~PauseResumeTargetTest2()
cocos2d::MenuItemFont * _itemAddToScene
virtual std::string title() const override
cocos2d::MenuItemFont * _itemResumeTouch
virtual std::string subtitle() const override
cocos2d::Sprite * _touchableSprite
cocos2d::MenuItemFont * _itemPauseTouch
cocos2d::MenuItemFont * _itemRemoveFromScene
virtual ~PauseResumeTargetTest3()
cocos2d::Sprite * _touchableSprite
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string title() const override
virtual ~PauseResumeTargetTest()
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual std::string title() const override
RegisterAndUnregisterWhileEventHanldingTest()
cocos2d::Sprite * _sprite
virtual void onEnter() override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual void onExit() override
virtual void onEnter() override
virtual std::string title() const override
virtual void onExit() override
virtual std::string subtitle() const override
virtual std::string subtitle() const 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 std::string title() const override
virtual std::string title() const override
bool isPointInTopHalfAreaOfScreen(cocos2d::Vec2 pt)
virtual std::string subtitle() const override
bool isPointInNode(cocos2d::Vec2 pt, cocos2d::Node *node)
TestSuite * getTestSuite() const
virtual void onEnter() override
cocos2d::Label * _subtitleLabel
virtual void restartCurrTest()
virtual void enterNextTest()
void removeListenerOnTouchEnded(bool toRemove)
static TouchableSprite * create(int priority=0)
EventListener * getListener()
EventListener * _listener
bool _removeListenerOnTouchEnded
TouchableSprite(int priority)
virtual void onExit() override
virtual bool init() override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual std::string title() const override
static cocos2d::Vec2 top()
static cocos2d::Vec2 center()
static cocos2d::Vec2 bottom()
static cocos2d::Vec2 left()
static cocos2d::Vec2 leftBottom()
static cocos2d::Vec2 right()
virtual std::string title() const override
virtual std::string subtitle() const override
static const char s_Ball[]