SubGameSceneShoot.h
6.91 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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
//
// SubGameSceneTapNCatch.h
// SteveAndMaggieGame
//
// Created by Katarzyna Kalinowska-Górska on 07/05/2019.
//
#ifndef SubGameSceneShoot_h
#define SubGameSceneShoot_h
#include "SubGameScene.h"
#include <vector>
#include <map>
#include "TouchableSprite.h"
#include "SoundsRepo.h"
#include "MathUtils.h"
class SubGameSceneShoot : public SubGameScene {
public:
struct LevelConfig {
float levelTime;
float trolleyTime;
};
struct SItem {
int itemId;
std::vector<std::string> picFilePaths;
std::string groupPictureNodeName;
std::string splodgePicFilePath;
std::string soundRequest;
std::string soundConf;
std::string soundNo;
};
struct GameConfig {
int lives;
std::vector<LevelConfig> levelConfigs;
std::map<int, SItem> shelfItems;
cocos2d::Rect steveRect;
cocos2d::Rect maggieRect;
cocos2d::Rect trolleyRect;
std::vector<cocos2d::Point> trolleyItemPoints;
};
enum ItemState {
NONE,
WAITING_TO_BE_LOADED,
DRAGGING,
LOADED,
SHOT,
SHOT_RELEASED,
IN_TROLLEY
};
struct ShootGameState {
std::vector<int> itemIdsOrder;
std::vector<cocos2d::Node*> splashedItems;
int currentItem;
bool cartFlippedX;
float currentTimeSeconds;
int wrongItemsCount;
ItemState itemState;
bool itemFirstShot;
int currentTutorialItem { 0};
bool isAnimatingCart;
// bool cartSineMovement {false};
// float cartBaseY;
// float cartBaseVelocity;
// float cartVelocityModifier;
// float cartSineAmpModifier;
// float cartSineBreadth;
// float cartSineShift;
// cocos2d::Point cartStartPoint;
// cocos2d::Point cartEndPoint;
};
static SubGameSceneShoot* create(int pGameId, std::string layoutFilePath, std::function<void(GameConfig&)> gameConfigParser);
virtual void onEnter() override;
virtual void update(float time) override;
protected:
// tutorial
cocos2d::Sprite* hintFingerSprite {nullptr};
void tut_showItemDrag();
void tut_showSlingDrag();
void tut_showSlingDragAlongX();
void tut_prepareFingerIfNeeded();
// completion only for non-looped
void tut_moveFinger(const cocos2d::Point& startPosition, const cocos2d::Point& endPosition, float moveTime, float pauseTime, bool loop = false, std::function<void()> completion = [](){});
void tut_moveFingerBackAndForth(const cocos2d::Point& startPosition, const cocos2d::Point& endPosition, float moveTime, float pauseTime);
void tut_hideFinger(bool remove = true);
void tut_intro_start();
void tut_intro_stop();
void tut_intro_shootApple();
void tut_intro_shootChocolate();
void tut_intro_shootBanana();
void tut_intro_shootItem(std::string groupNodeName, std::string singleItemFilePath, float moveAnimTime = 1);
bool tutorialComplete();
void saveTutorialComplete();
/////
std::string currentSteveHead;
cocos2d::Node* _cart;
cocos2d::Node* _cartFoodLayer;
cocos2d::Node* _shelf;
cocos2d::Layer* darkLayer;
cocos2d::Label* _timeLabel;
int currentlyDraggedObjectId;
cocos2d::Sprite* _currentItem;
// bool itemInSling;
cocos2d::Sprite* _slingGumLeft;
cocos2d::Sprite* _slingGumRight;
cocos2d::Sprite* _movingSling;
cocos2d::Sprite* _slingStick;
cocos2d::Node* _slingHand;
cocos2d::Node* _slingSubHand;
cocos2d::Point _slingLeftAttachmentPoint;
cocos2d::Point _slingRightAttachmentPoint;
float _slingLeftStartLength;
float _slingRightStartLength;
bool _isDraggingSling;
bool _isSlingReturning;
float _baseSpringOmegaZero;
float _baseSpringDXForOmegaZero;
float _springOmegaZero;
float _springDampCoeff;
float _slingAmplitude;
float _totalReturningTime;
cocos2d::Point _slingDragStartLocation;
cocos2d::Point _movingSlingOriginalPosition;
cocos2d::Point _handOriginalPosition;
cocos2d::Vec2 _slingOriginalDeltaAnchorPoint;
cocos2d::Point _slingDragTotalDelta;
cocos2d::Point _oscMidPoint;
float _slingGumLeftShootRotation;
float _slingGumRightShootRotation;
float _slingReturnAnimTotalTime;
float prevCosVal;
// bool itemShot;
// bool itemReachedTarget;
float slingHeight;
float itemFlyTime;
float itemFlyTimeElapsed;
float itemV;
float baseItemV;
float slingAmpForBaseItemV;
void itemFollowsTheSling();
void gumsFollowTheSling(bool switchRotation);
int gameId;
GameConfig gameConfig;
ShootGameState shootGameState;
void cleanupSplashedItems();
void startTimer();
void setStartTimeAndLabel();
void onSecondElapsed(float dt);
virtual bool initWithConfiguration(int pGameId, std::string layoutFilePath, std::function<void(GameConfig&)> gameConfigParse);
virtual void clearGameState() override;
void maggieOpenBeak();
void maggieCloseBeak();
void prepareCartPosition();
void prepareCartPositionOutside();
void runCartAnimations(bool faster = false);
void flipCart();
void moveSlingToTheWorld();
void moveSlingBackToTheHand();
void placeItemInSling(cocos2d::Sprite* _item);
void removeItemFromSling();
void cancelItemDrag();
// scroll the items on the shelf so that the given index is visible (two pages)
void scrollShelf(cocos2d::Node* pageForNode, std::function<void()> completion = [](){});
bool checkRectHidesBehindSling(cocos2d::Rect rectWorldCoord);
SItem currentItem(){ return gameConfig.shelfItems[shootGameState.itemIdsOrder[shootGameState.currentItem]];}
void nextItem();
cocos2d::Sprite* splashItem(cocos2d::Node* where, cocos2d::Vec2 pos, float forHowLong = -1, int zOrder = 100);
void switchSteveHead(std::string headName);
virtual TouchHandlerFunction prepareTouchBeganHandler();
virtual TouchHandlerFunction prepareTouchMovedHandler();
virtual TouchHandlerFunction prepareTouchEndedHandler();
virtual bool touchHandlerForWidget(std::string objectName, cocos2d::ui::Widget::TouchEventType touchEventType) override;
void tryShoot();
void shoot();
void cancelSlingDrag(bool onlyOnStateDragging = true);
void emptyTrolley();
virtual void startGame(bool playIntro = true) override;
void loseLife();
virtual void gameLost() override;
virtual bool onReplayButtonClicked() override;
virtual bool onFastForwardButtonClicked() override;
//
virtual void pauseGame() override;
virtual void resumeGame() override;
virtual void hideSettingsMenuWithLevelReset() override;
void switchMenuToReplayButton();
void fadeDarkLayer(bool fadeIn);
void showWellDoneAndReplay();
void hideWellDoneAndReplay();
};
#endif /* SubGameSceneShoot_h */