@@ -32,6 +32,44 @@ class MyObjWrapper : public CCObject {
3232 }
3333};
3434
35+ class AwaitButtonPress : public CCObject {
36+ Task<void > m_task;
37+ std::function<void (bool )> m_finish;
38+ std::function<bool ()> m_isCancelled;
39+ SEL_MenuHandler m_oldSelector;
40+ CCObject* m_oldTarget;
41+
42+ AwaitButtonPress () {
43+ this ->autorelease ();
44+ auto [task, finish, _, isCancelled] = Task<void >::spawn ();
45+ m_task = std::move (task);
46+ m_finish = std::move (finish);
47+ m_isCancelled = std::move (isCancelled);
48+ }
49+
50+ public:
51+ static Task<void > create (CCMenuItem* item) {
52+ auto * obj = new AwaitButtonPress ();
53+ obj->m_oldSelector = item->m_pfnSelector ;
54+ obj->m_oldTarget = item->m_pListener ;
55+ item->m_pfnSelector = menu_selector (AwaitButtonPress::onPress);
56+ item->m_pListener = obj;
57+ item->setUserObject (" await-button-press" _spr, obj);
58+ return obj->m_task ;
59+ }
60+
61+ void onPress (CCObject* obj) {
62+ auto * item = static_cast <CCMenuItem*>(obj);
63+ item->m_pfnSelector = m_oldSelector;
64+ item->m_pListener = m_oldTarget;
65+ (m_oldTarget->*m_oldSelector)(obj);
66+ if (!m_isCancelled ()) {
67+ m_finish (true );
68+ }
69+ item->setUserObject (" await-button-press" _spr, nullptr );
70+ }
71+ };
72+
3573void playNewLocationTutorial () {
3674 auto * layer = MenuLayer::get ();
3775 if (!layer) return ;
@@ -48,40 +86,31 @@ void playNewLocationTutorial() {
4886
4987 Ref<CCSprite> arrow = CCSprite::createWithSpriteFrameName (" navArrowBtn_001.png" );
5088 arrow->setRotation (90 );
51- arrow->setPosition (pos + ccp (0 , 20 . f ));
89+ arrow->setPosition (button-> getContentSize () / 2 . f + ccp (0 , 20 ));
5290 arrow->runAction (CCRepeatForever::create (
5391 CCSequence::createWithTwoActions (
5492 CCMoveBy::create (0 .2f , ccp (0 , 10 .f )),
5593 CCMoveBy::create (0 .2f , ccp (0 , -10 .f ))
5694 )
5795 ));
58- arrow->runAction (CCSequence::createWithTwoActions (
59- CCDelayTime::create (2 .f ),
60- CCRemoveSelf::create ()
61- ));
6296 arrow->setZOrder (z + 10 );
63- CCScene::get ()->addChild (arrow);
64-
65- // dont want the user pressing it before we do
66- button->setEnabled (false );
97+ button->addChild (arrow);
6798
6899 // two circles
69- for (int i = 0 ; i < 2 ; ++i) {
70- auto * circle = CCCircleWave::create (0 .f , 100 .f , 0 .5f , false , true );
71- circle->setPosition (pos);
72- circle->setZOrder (z);
73- CCScene::get ()->addChild (circle);
74- co_await awaitAction (button, CCDelayTime::create (0 .5f ));
75- }
76-
77- button->setEnabled (true );
78- button->selected ();
79-
80- co_await awaitAction (button, CCDelayTime::create (0 .2f ));
100+ button->runAction (CCRepeatForever::create (
101+ CCSequence::createWithTwoActions (
102+ CallFuncExt::create ([=] {
103+ auto * circle = CCCircleWave::create (0 .f , 100 .f , 0 .5f , false , true );
104+ circle->setPosition (pos);
105+ circle->setZOrder (z);
106+ CCScene::get ()->addChild (circle);
107+ }),
108+ CCDelayTime::create (0 .5f )
109+ )
110+ ));
81111
112+ co_await AwaitButtonPress::create (button);
82113 arrow->removeFromParentAndCleanup (true );
83- button->activate ();
84- button->unselected ();
85114 };
86115
87116 auto * settingsBtn = typeinfo_cast<CCMenuItemSpriteExtra*>(layer->getChildByIDRecursive (" settings-button" ));
0 commit comments