Skip to content

Commit 5bf01f6

Browse files
committed
only proceed with tutorial when user presses button
1 parent 4ac7a31 commit 5bf01f6

1 file changed

Lines changed: 52 additions & 23 deletions

File tree

src/Tutorial.cpp

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3573
void 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

Comments
 (0)