forked from lfeng1420/BrickGame
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTankGame.h
183 lines (139 loc) · 4.26 KB
/
TankGame.h
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
#pragma once
#include "GameBase.h"
class CTankGame : public CGameBase
{
// Start
void Start();
// Update
// param: dt, millisecond
void Update(float dt);
// Get game id
EnGameID GetGameID();
// Button event
void OnButtonEvent(const SEventContextButton* pButtonEvent);
private:
// Camp
enum _EnCampID
{
enCamp_Self,
enCamp_Enemy,
};
struct _TTankData
{
POSITION stPos; // Current pos
POSITION stDestPos; // Dest pos
int nDir; // Direction
int nCurMoveInterval; // Current move interval
int nMoveInterval; // Move interval
int nFireInterval; // Fire interval
int nCurFireInterval; // Current fire interval
_EnCampID enCampID; // Camp
bool bValidFlag; // Valid or not
};
struct _TBossTankData : public _TTankData
{
int nBossLife;
};
struct _TBulletData
{
POSITION stPos; // Current pos
int nDir; // Direction
_EnCampID enCampID; // Camp
int nInterval; // Update interval
bool bValidFlag; // Valid or not
};
typedef vector<_TBulletData> TVec_BulletData;
typedef set<int> TSet_InvalidBulletIdx;
// Config
enum
{
TANK_CREATE_INTERVAL_BASE = 800,
TANK_FIRE_INTERVAL_BASE = 4000,
TANK_MOVE_INTERVAL_BASE = 1000,
SELF_TANK_FIRE_INTERVAL_BASE = 400,
SELF_TANK_MOVE_INTERVAL_BASE = 55,
BULLET_MOVE_INTERVAL = 40,
TANK_KILL_ADD_SCORE = 10,
NORMAL_STAGE_TANK_COUNT_MAX = 5,
TANK_TOTAL_COUNT = 30,
BOSS_SHAPE_ROW_COUNT = 8,
BOSS_SHAPE_COLUMN_COUNT = 9,
BOSS_TANK_LIFE_COUNT = 10,
SELF_TANK_ANIM_INTERVAL = 100,
};
struct _TCreateTankData
{
int nCreateInterval;
int nCreateCount;
bool bCreateFinishFlag;
};
struct _TSelfTankAnimData
{
int nInterval;
bool bShowFlag;
};
private:
// Init tank data
void __InitAllTanks();
// Init all bullets
void __InitAllBullets();
// Create tank
void __CreateTank(float dt, bool& bUpdateFlag);
// Get invalid tank data index
int __GetInvalidTankIdx();
// Check overlap
bool __CheckTankPosValid(int nTankIdx, const _TTankData& stTankData, int nDir);
// Check tank overlap
int __CheckTankOverlap(int nSrcTankIdx, const _TTankData& stSrcTankData, const POSITION& stBrickPos);
// Check tank hitted or not
_TTankData* __GetHitTankData(const POSITION& stBrickPos, _EnCampID enCampID);
// Random dest pos
bool __GenDestPos(int nTankIdx, _TTankData& stTankData);
// Update bullet
void __UpdateBullet(float dt, bool& bUpdateFlag);
// Handle tank dead
// If a tank dies, return true
bool __HandleTankDead(_TTankData* pTankData);
// Update tank, like pos, fire, etc
void __UpdateTank(float dt, bool& bUpdateFlag);
// One tank move
bool __OneTankMove(int nTankIdx, _TTankData& stTankData, float dt);
// One tank fire
bool __OneTankFire(_TTankData& stTankData, float dt);
// Generate all bricks state
void __UpdateAllBricksState();
// Get valid tank count
int __GetValidTankCount();
// Update game stage
void __UpdateGameStage();
// Create boss tank
void __CreateBossTank();
// Update boss tank
void __UpdateBossTank(float dt, bool& bUpdateFlag);
// Boss tank move
bool __BossTankMove(float dt);
// Update self tank anim
void __UpdateSelfTankAnim(float dt, bool& bUpdateFlag);
// Draw self tank flag
void __DrawSelfTankFlag(bool bUpdateFlag = false);
//////////////////////////////////////////////////////////////////////////
// Get create tank interval
int __GetCreateTankInterval();
// Get tank move interval
int __GetTankMoveInterval(bool bSelfTankFlag);
// Random fire interval
int __GetTankFireInterval(bool bSelfTankFlag);
// Get bullet move interval
int __GetBulletMoveInterval();
private:
// Tank data
_TTankData m_arrTankData[NORMAL_STAGE_TANK_COUNT_MAX];
// Bullet data
TVec_BulletData m_vecBulletData;
// Create tank data
_TCreateTankData m_stCreateTankData;
// Boss data
_TBossTankData m_stBossData;
// Self tank anim data
_TSelfTankAnimData m_stSelfTankAnimData;
};