ToySubGameSceneTapNCatch.h
6.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
//
// ToySubGameSceneTapNCatch.h
// SteveAndMaggieGame
//
// Created by Katarzyna Kalinowska-Górska on 07/05/2019.
//
#ifndef ToySubGameSceneTapNCatch_h
#define ToySubGameSceneTapNCatch_h
#include "ToySubGameScene.h"
#include <vector>
#include <map>
#include "ToyTouchableSprite.h"
#include "ToySoundsRepo.h"
#include "ToyMathUtils.h"
class ToySubGameSceneTapNCatch : public ToySubGameScene {
public:
struct LevelConfig {
float updateTimeInterval;
float maxItemsFrac;
float itemDisappearProbLim;
};
struct GameConfig {
int levelsPerLevel;
std::vector<LevelConfig> levelConfigs;
// std::vector<cocos2d::Rect> obstacles;
int staticItems;
float additionalPaddingW;
float additionalPaddingH;
float levelTimeSeconds;
};
enum class MoveInPhase {
NONE,
PHASE_LINEAR,
PHASE_BIG_CIRCLE,
PHASE_SMALL_CIRCLE
};
struct EntryRotationParams {
float currentMaggieDPhi;
float maggieMoveInTotalTime;
float totalDisplacement;
float linearVelocity;
float bigCircleRadius;
cocos2d::Point midPoint;
};
struct TapNCatchGameState {
bool isAnimatingSilent;
int score;
float updateTimeCount;
MoveInPhase maggieMoveInPhase;
EntryRotationParams entryRotationParams;
};
static ToySubGameSceneTapNCatch* create(int pGameId, std::string layoutFilePath, CommonConfig commonConfig, std::function<void(GameConfig&)> gameConfigParser);
virtual void onEnter() override;
virtual void update(float time) override;
protected:
int gameId;
class TapNCatchItem : public Item {
public:
cocos2d::Rect targetBBRect; // with full scale
bool appearing;
float disappearingInTime;
bool disappearing;
bool touchedAlready;
virtual ~TapNCatchItem(){
// Item::~Item();
}
};
class FloatingCharacter : public cocos2d::Node {
public:
static FloatingCharacter* create(std::string spritePath){
FloatingCharacter * character = new (std::nothrow) FloatingCharacter();
if(character && character->init(spritePath))
{
character->autorelease();
return character;
}
CC_SAFE_DELETE(character);
return nullptr;
}
virtual void startCirclingAround(){
isCirclingAround = true;
circleMidPoint = getPosition();
previousDirection = 1;
circleAround();
}
virtual void stopCirclingAround(){
if(isCirclingAround){
isCirclingAround = false;
stopAllActions(); //TODO by tag
}
}
virtual void circleAround(){
float radiusX = getBoundingBox().size.height/100;
float radiusY = getBoundingBox().size.height/16;
float newX = circleMidPoint.x + ToyMathUtils::getRandom(-radiusX, radiusX);
float newY = circleMidPoint.y + radiusY*previousDirection;
auto animationTime = 0.6;//*(dX*dX+dY*dY)/(radiusX*radiusX+radiusY*radiusY);
auto floatAction = cocos2d::Sequence::create(cocos2d::EaseInOut::create(cocos2d::MoveTo::create(animationTime, cocos2d::Vec2(newX, newY)), 2), cocos2d::CallFunc::create([&](){
circleAround();
}), nullptr);
runAction(floatAction);
previousDirection *= -1;
}
protected:
cocos2d::Point circleMidPoint;
int previousDirection;
bool isCirclingAround;
virtual bool init(std::string spritePath){
if(!cocos2d::Node::init()){
return false;
}
setAnchorPoint(cocos2d::Vec2(0.5,0.5));
auto mainSprite = cocos2d::Sprite::create(spritePath);
addChild(mainSprite);
setContentSize(cocos2d::Size(mainSprite->getBoundingBox().size.width,mainSprite->getBoundingBox().size.height));
mainSprite->setPosition(getContentSize().width/2,getContentSize().height/2);
mainSprite->setGlobalZOrder(100);
isCirclingAround = false;
return true;
}
};
GameConfig gameConfig;
TapNCatchGameState tapNCatchGameState;
cocos2d::Label* scoreLabel;
cocos2d::Sprite* scoreStar;
FloatingCharacter* maggie;
cocos2d::Sprite* steve;
cocos2d::Sprite* maggiesRandomItem;
virtual bool initWithConfiguration(int pGameId, std::string layoutFilePath, CommonConfig commonConfig, std::function<void(GameConfig&)> gameConfigParse);
virtual void setupPauseButton();
virtual void clearGameState() override;
virtual void generateStaticItems(int nItems);
virtual void generateItem(float delay, bool animated = true);
virtual cocos2d::Rect generateValidRect(float rectW, float rectH);
virtual void animateCorrectItem(Item& item);
virtual void animateIncorrectItem(Item& item);
virtual void flagRemoveAllItemsRapidly();
virtual void changeType();
virtual void changeTypeInternal();
virtual void changeLevel();
virtual void changeLevelInternal();
virtual void reenableItemTouch();
virtual void addScoreLabel();
virtual void updateScoreLabel();
virtual void startGame(bool playIntro = true) override;
virtual void finishGame(ToySoundsRepo::SoundInfo sound);
virtual void showScoreAndReplay();
virtual void hideScoreAndReplay();
virtual void updatePhaseCheckTime(float dt);
virtual void updatePhaseRemoveScheduledItems(float dt);
virtual void updatePhaseScheduleRemoveItems(float dt);
virtual void updatePhaseGenerateNewItems(float dt);
virtual void updatePhaseMoveInMaggie(float dt);
void prepareMaggieEntryRotation(float animationTotalTime);
virtual bool onReplayButtonClicked() override;
virtual void pauseGame() override;
virtual void resumeGame() override;
};
#endif /* ToySubGameSceneTapNCatch_h */