@@ -82,11 +82,17 @@ void CTankGame::Play(float dt)
82
82
// 状态切换, 如果BOSS阶段没有开启,此时所有坦克已经死亡,则切换到暂停状态
83
83
if (!m_bBossFlag && m_enGameState == GAMESTATE_RUNNING && CheckAllTankDead ())
84
84
{
85
- // 切换到暂停状态,
85
+ // 切换到暂停状态
86
86
m_enGameState = GAMESTATE_PAUSE;
87
87
88
88
// 重置时间
89
89
m_fWaitRefreshTime = 0 ;
90
+
91
+ // 清除所有子弹
92
+ for (int i = 0 ; i < BULLET_MAXNUM; ++i)
93
+ {
94
+ m_arrBullet[i].m_bValid = false ;
95
+ }
90
96
}
91
97
92
98
if (GAMESTATE_OVER == m_enGameState)
@@ -198,8 +204,10 @@ void CTankGame::Play(float dt)
198
204
m_stBoss.m_bDead = false ;
199
205
200
206
// 随机发射子弹时间间隔
201
- m_stBoss.m_fFireMaxTime = Random (BOSS_FIRE_MIN_INTERVAL - 20 * m_iSpeed, BOSS_FIRE_MAX_INTERVAL - 50 * m_iSpeed);
207
+ m_stBoss.m_fFireMaxTime = Random (BOSS_FIRE_MIN_INTERVAL / 10 - m_iSpeed, BOSS_FIRE_MAX_INTERVAL / 10 - 3 * m_iSpeed) * 10 ;
202
208
m_stBoss.m_fFireWaitTime = 0 ;
209
+ m_stBoss.m_iMaxStep = 15 + m_iSpeed; // 击中最大次数
210
+ m_stBoss.m_iCurStep = 0 ;
203
211
204
212
// 方向只有左右
205
213
int iDirection = Random (DIR_MIN, DIR_MAX);
@@ -235,7 +243,7 @@ bool CTankGame::GetBrickState(int iRowIndex, int iColIndex)
235
243
stTargetPos.m_iColIdx = iColIndex;
236
244
237
245
// 自己
238
- if (DrawTank (m_stSelfTank.m_stPos , m_stSelfTank.m_iDirection , stTargetPos))
246
+ if (DrawTank (m_stSelfTank.m_stPos , m_bBossFlag ? DIR_UP : m_stSelfTank.m_iDirection , stTargetPos))
239
247
{
240
248
return true ;
241
249
}
@@ -462,7 +470,7 @@ bool CTankGame::CreateTank(float dt)
462
470
stData.m_iCurStep = 0 ;
463
471
stData.m_iMaxStep = Random (0 , TANK_MOVE_MAXSTEP);
464
472
stData.m_fFireWaitTime = 0 ;
465
- stData.m_fFireMaxTime = Random (50 , BULLET_CREATE_MAXTIME - 450 * m_iSpeed);
473
+ stData.m_fFireMaxTime = Random (1 , ( BULLET_CREATE_MAXTIME - 350 * m_iSpeed) / 100 ) * 100 ;
466
474
467
475
// 坦克创建数量更新
468
476
++m_iTankCreateCount;
@@ -521,7 +529,8 @@ bool CTankGame::TankMove(float dt)
521
529
{
522
530
// 时间更新
523
531
m_fTankMoveTime += dt;
524
- if (m_fTankMoveTime < TANK_MOVE_INTERVAL - 70 * m_iSpeed)
532
+ float fMaxTime = TANK_MOVE_INTERVAL - 50 * m_iSpeed + (m_bBossFlag ? 200 : 0 );
533
+ if (m_fTankMoveTime < fMaxTime )
525
534
{
526
535
return false ;
527
536
}
@@ -825,41 +834,73 @@ bool CTankGame::SelfTankMove( float dt )
825
834
// 重置
826
835
m_fSelfMoveTime = 0 ;
827
836
828
- for ( int i = DIR_MIN; i < DIR_MAX; ++i )
837
+ if (m_bBossFlag )
829
838
{
830
- if (! m_arrBtnState[i ])
839
+ if (m_arrBtnState[DIR_LEFT ])
831
840
{
832
- continue ;
841
+ m_stSelfTank. m_iDirection = DIR_LEFT ;
833
842
}
834
-
835
- POSITION stNextPos;
836
-
837
- if (m_stSelfTank.m_iDirection != i)
843
+ else if (m_arrBtnState[DIR_RIGHT])
838
844
{
839
- m_stSelfTank.m_iDirection = i;
840
-
841
- stNextPos = m_stSelfTank.m_stPos ;
845
+ m_stSelfTank.m_iDirection = DIR_RIGHT;
842
846
}
843
847
else
844
848
{
845
- // 方向与当前方向一致,检查下一个位置是否有效
846
- if (!GetNextPos (-1 , stNextPos) || !CheckPos (-1 , stNextPos))
847
- {
848
- return false ;
849
- }
850
-
851
- // 更新位置
852
- m_stSelfTank.m_stPos = stNextPos;
849
+ return false ;
850
+ }
853
851
854
- // 最后一行/列不显示
855
- m_pGameScene->UpdateBrick (stNextPos.m_iRowIdx + POS_CHANGE_LIST[i * 4 ], stNextPos.m_iColIdx + POS_CHANGE_LIST[i * 4 + 1 ], false , false );
856
- m_pGameScene->UpdateBrick (stNextPos.m_iRowIdx + POS_CHANGE_LIST[i * 4 + 2 ], stNextPos.m_iColIdx + POS_CHANGE_LIST[i * 4 + 3 ], false , false );
852
+ // 检查下一个位置是否有效
853
+ POSITION stNextPos;
854
+ if (!GetNextPos (-1 , stNextPos))
855
+ {
856
+ return false ;
857
857
}
858
858
859
+ // 更新
860
+ m_stSelfTank.m_stPos = stNextPos;
859
861
// 画我方坦克
860
862
m_pGameScene->UpdateBricks (stNextPos.m_iRowIdx - 1 , stNextPos.m_iColIdx - 1 , stNextPos.m_iRowIdx + 2 , stNextPos.m_iColIdx + 2 );
863
+
861
864
return true ;
862
865
}
866
+ else
867
+ {
868
+ for (int i = DIR_MIN; i < DIR_MAX; ++i)
869
+ {
870
+ if (!m_arrBtnState[i])
871
+ {
872
+ continue ;
873
+ }
874
+
875
+ POSITION stNextPos;
876
+
877
+ if (m_stSelfTank.m_iDirection != i)
878
+ {
879
+ m_stSelfTank.m_iDirection = i;
880
+
881
+ stNextPos = m_stSelfTank.m_stPos ;
882
+ }
883
+ else
884
+ {
885
+ // 方向与当前方向一致,检查下一个位置是否有效
886
+ if (!GetNextPos (-1 , stNextPos) || !CheckPos (-1 , stNextPos))
887
+ {
888
+ return false ;
889
+ }
890
+
891
+ // 更新位置
892
+ m_stSelfTank.m_stPos = stNextPos;
893
+
894
+ // 最后一行/列不显示
895
+ m_pGameScene->UpdateBrick (stNextPos.m_iRowIdx + POS_CHANGE_LIST[i * 4 ], stNextPos.m_iColIdx + POS_CHANGE_LIST[i * 4 + 1 ], false , false );
896
+ m_pGameScene->UpdateBrick (stNextPos.m_iRowIdx + POS_CHANGE_LIST[i * 4 + 2 ], stNextPos.m_iColIdx + POS_CHANGE_LIST[i * 4 + 3 ], false , false );
897
+ }
898
+
899
+ // 画我方坦克
900
+ m_pGameScene->UpdateBricks (stNextPos.m_iRowIdx - 1 , stNextPos.m_iColIdx - 1 , stNextPos.m_iRowIdx + 2 , stNextPos.m_iColIdx + 2 );
901
+ return true ;
902
+ }
903
+ }
863
904
864
905
return false ;
865
906
}
@@ -898,7 +939,7 @@ bool CTankGame::TankFire(float dt)
898
939
m_stBoss.m_fFireWaitTime = 0 ;
899
940
900
941
// 随机时间
901
- m_stBoss.m_fFireMaxTime = Random (BOSS_FIRE_MIN_INTERVAL - 20 * m_iSpeed, BOSS_FIRE_MAX_INTERVAL - 50 * m_iSpeed);
942
+ m_stBoss.m_fFireMaxTime = Random (BOSS_FIRE_MIN_INTERVAL / 10 - m_iSpeed, BOSS_FIRE_MAX_INTERVAL / 10 - 3 * m_iSpeed) * 10 ;
902
943
m_stBoss.m_fFireWaitTime = 0 ;
903
944
904
945
// 创建子弹
@@ -924,7 +965,7 @@ bool CTankGame::TankFire(float dt)
924
965
}
925
966
926
967
// 随机时间
927
- refData.m_fFireMaxTime = Random (50 , BULLET_CREATE_MAXTIME - 450 * m_iSpeed);
968
+ refData.m_fFireMaxTime = Random (1 , ( BULLET_CREATE_MAXTIME - 350 * m_iSpeed) / 100 ) * 100 ;
928
969
refData.m_fFireWaitTime = 0 ;
929
970
930
971
// 创建子弹
@@ -1017,6 +1058,11 @@ int CTankGame::GetBulletFireTankIndex(const POSITION& stBulletPos, int iCamp)
1017
1058
{
1018
1059
if (iCamp == CAMP_A)
1019
1060
{
1061
+ if (m_bBossFlag && stBulletPos == m_stBoss.m_stPos )
1062
+ {
1063
+ return 1 ;
1064
+ }
1065
+
1020
1066
for (int i = 0 ; i < TANK_MAXNUM; ++i)
1021
1067
{
1022
1068
if (m_arrTank[i].m_bDead )
@@ -1103,19 +1149,31 @@ void CTankGame::BulletShoot()
1103
1149
{
1104
1150
if (refData.m_iCamp == CAMP_A)
1105
1151
{
1106
- TANK_DATA& refTankData = m_arrTank[iTankIdx];
1152
+ if (m_bBossFlag)
1153
+ {
1154
+ if (++m_stBoss.m_iCurStep >= m_stBoss.m_iMaxStep )
1155
+ {
1156
+ m_enGameState = GAMESTATE_PASS;
1157
+ }
1158
+
1159
+ log (" m_iCurStep=%d m_iMaxStep=%d" , m_stBoss.m_iCurStep , m_stBoss.m_iMaxStep );
1160
+ }
1161
+ else
1162
+ {
1163
+ TANK_DATA& refTankData = m_arrTank[iTankIdx];
1107
1164
1108
- // 敌方坦克死亡
1109
- refTankData.m_bDead = true ;
1165
+ // 敌方坦克死亡
1166
+ refTankData.m_bDead = true ;
1110
1167
1111
- // 重画对应区域状态
1112
- POSITION& stDeadTankPos = refTankData.m_stPos ;
1113
- m_pGameScene->UpdateBricks (stDeadTankPos.m_iRowIdx - 1 , stDeadTankPos.m_iColIdx - 1 ,
1114
- stDeadTankPos.m_iRowIdx + 2 , stDeadTankPos.m_iColIdx + 2 );
1168
+ // 重画对应区域状态
1169
+ POSITION& stDeadTankPos = refTankData.m_stPos ;
1170
+ m_pGameScene->UpdateBricks (stDeadTankPos.m_iRowIdx - 1 , stDeadTankPos.m_iColIdx - 1 ,
1171
+ stDeadTankPos.m_iRowIdx + 2 , stDeadTankPos.m_iColIdx + 2 );
1115
1172
1116
- // 分数增加
1117
- m_iScore += TANK_KILL_ADD_SCORE;
1118
- m_pGameScene->UpdateScore (m_iScore);
1173
+ // 分数增加
1174
+ m_iScore += TANK_KILL_ADD_SCORE;
1175
+ m_pGameScene->UpdateScore (m_iScore);
1176
+ }
1119
1177
}
1120
1178
else if (refData.m_iCamp == CAMP_B)
1121
1179
{
0 commit comments