Skip to content

Commit d9cd88a

Browse files
authored
Merge pull request #5 from BombingAdventure/master
Update to the latest version
2 parents 796e6fa + 483ce12 commit d9cd88a

File tree

9 files changed

+113
-63
lines changed

9 files changed

+113
-63
lines changed

BombingAdventure/Classes/Bomb.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,13 @@ void Bomb::startCounting(float time) {
3333
isCounting = true;
3434
}
3535

36+
int Bomb::getPower()
37+
{
38+
return power;
39+
}
40+
41+
bool Bomb::bombIsCounting()
42+
{
43+
return isCounting;
44+
}
45+

BombingAdventure/Classes/Bomb.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ class Bomb : public Entity {
5757

5858
void startCounting(float time);
5959

60+
int getPower();
61+
62+
bool bombIsCounting();
63+
6064
private:
6165

6266
int power; /* The power of the bomb */

BombingAdventure/Classes/GameScene.cpp

Lines changed: 75 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ bool GameScene::init() {
5858
map->getLayer("background")->setGlobalZOrder(-1);
5959

6060
// "destructable" layer, indicating the tiles which can be blown up by bubbles
61-
TMXLayer * destructable = map->getLayer("destructable");
61+
destructable = map->getLayer("destructable");
6262
destructable->setVisible(false); /* set it transparent*/
6363

6464
// object layer (probably useless)
@@ -117,8 +117,7 @@ bool GameScene::init() {
117117
case EventKeyboard::KeyCode::KEY_SPACE:
118118
if (hero->can_set_bomb()) {
119119
Bomb *bomb = hero->set_bomb();
120-
addChild(bomb);
121-
bomb->setGlobalZOrder(0);
120+
current_bombs.pushBack(bomb);
122121
}
123122
break;
124123
}
@@ -174,6 +173,13 @@ void GameScene::update(float delta) {
174173

175174
makeMove(Vec2(position_x, position_y));
176175

176+
/* Bombs blow up destructable bricks */
177+
while (!current_bombs.empty() && !current_bombs.front()->bombIsCounting()) {
178+
Bomb * bomb = current_bombs.front();
179+
bomb_explode(bomb);
180+
current_bombs.erase(0);
181+
}
182+
177183
/* Test pick_item method */
178184
Item * speed_up_item = Item::create();
179185
speed_up_item->setPosition(Vec2(500, 380));
@@ -186,14 +192,58 @@ void GameScene::update(float delta) {
186192
}
187193
}
188194

189-
void GameScene::bomb_explode()
190-
{
191-
192-
}
193-
194-
Vector<Bomb*> GameScene::get_all_bomb()
195+
void GameScene::bomb_explode(Bomb *bomb)
195196
{
196-
return this->currentBomb;
197+
int power = bomb->getPower();
198+
Vec2 bomb_tile_coord = tileCoordFromPosition(bomb->getPosition());
199+
int firstGid = destructable->getTileSet()->_firstGid;
200+
201+
int i = 0;
202+
for (; i < power && bomb_tile_coord.x - i - 1 >= 0; i++) {
203+
int GID = destructable->getTileGIDAt(Vec2(bomb_tile_coord.x - i - 1, bomb_tile_coord.y));
204+
if (GID - firstGid >= 0) {
205+
map->getLayer("bricks")->removeTileAt(Vec2(bomb_tile_coord.x - i - 1, bomb_tile_coord.y));
206+
if (bomb_tile_coord.y > 0) {
207+
map->getLayer("tops")->removeTileAt(Vec2(bomb_tile_coord.x - i - 1, bomb_tile_coord.y - 1));
208+
}
209+
destructable->removeTileAt(Vec2(bomb_tile_coord.x - i - 1, bomb_tile_coord.y));
210+
break;
211+
}
212+
}
213+
i = 0;
214+
for (; i < power && bomb_tile_coord.x + i + 1 < MAP_SIZE.width; i++) {
215+
int GID = destructable->getTileGIDAt(Vec2(bomb_tile_coord.x + i + 1, bomb_tile_coord.y));
216+
if (GID - firstGid >= 0) {
217+
map->getLayer("bricks")->removeTileAt(Vec2(bomb_tile_coord.x + i + 1, bomb_tile_coord.y));
218+
if (bomb_tile_coord.y > 0) {
219+
map->getLayer("tops")->removeTileAt(Vec2(bomb_tile_coord.x + i + 1, bomb_tile_coord.y - 1));
220+
}
221+
destructable->removeTileAt(Vec2(bomb_tile_coord.x + i + 1, bomb_tile_coord.y));
222+
break;
223+
}
224+
}
225+
int j = 0;
226+
for (; j < power && bomb_tile_coord.y + j + 1 < MAP_SIZE.height; j++) {
227+
int GID = destructable->getTileGIDAt(Vec2(bomb_tile_coord.x, bomb_tile_coord.y + j + 1));
228+
if (GID - firstGid >= 0) {
229+
map->getLayer("bricks")->removeTileAt(Vec2(bomb_tile_coord.x, bomb_tile_coord.y + j + 1));
230+
map->getLayer("tops")->removeTileAt(Vec2(bomb_tile_coord.x, bomb_tile_coord.y + j));
231+
destructable->removeTileAt(Vec2(bomb_tile_coord.x, bomb_tile_coord.y + j + 1));
232+
break;
233+
}
234+
}
235+
j = 0;
236+
for (; j < power && bomb_tile_coord.y - j - 1 >= 0; j++) {
237+
int GID = destructable->getTileGIDAt(Vec2(bomb_tile_coord.x, bomb_tile_coord.y - j - 1));
238+
if (GID - firstGid >= 0) {
239+
map->getLayer("bricks")->removeTileAt(Vec2(bomb_tile_coord.x, bomb_tile_coord.y - j - 1));
240+
if (bomb_tile_coord.y - j - 1 != 0) {
241+
map->getLayer("tops")->removeTileAt(Vec2(bomb_tile_coord.x, bomb_tile_coord.y - j - 2));
242+
}
243+
destructable->removeTileAt(Vec2(bomb_tile_coord.x, bomb_tile_coord.y - j - 1));
244+
break;
245+
}
246+
}
197247
}
198248

199249
bool GameScene::isOutOfMap(Vec2 pos)
@@ -237,57 +287,26 @@ bool GameScene::collideWithBubble(cocos2d::Vec2 targetPos)
237287

238288
void GameScene::makeMove(Vec2 position)
239289
{
240-
Vec2 targetPos = position;
241-
242290
// correct the detection deviation caused by the sprite size
243291
Size figSize = hero->getContentSize();
244-
245-
if (y_movement == MOVE_STOP) {
246-
switch (x_movement) {
247-
case MOVE_LEFT:
248-
targetPos.x -= 1 * figSize.width / 3;
249-
break;
250-
case MOVE_RIGHT:
251-
targetPos.x += 1 * figSize.width / 3;
252-
break;
253-
}
254-
}
255-
else {
256-
switch (y_movement) {
257-
case MOVE_UP:
258-
if (x_movement == MOVE_STOP) {
259-
break;
260-
}
261-
else {
262-
if (x_movement == MOVE_LEFT) {
263-
targetPos.x -= 1 * figSize.width / 3;
264-
}
265-
else {
266-
targetPos.x += 1 * figSize.width / 3;
267-
}
268-
break;
269-
}
270-
case MOVE_DOWN:
271-
targetPos.y -= figSize.height / 2 + 3;
272-
if (x_movement == MOVE_STOP) {
273-
break;
274-
}
275-
else {
276-
if (x_movement == MOVE_LEFT) {
277-
targetPos.x -= 1 * figSize.width / 3;
278-
}
279-
else {
280-
targetPos.x += 1 * figSize.width / 3;
281-
}
282-
break;
283-
}
284-
}
292+
293+
Vec2 targetPos_down(position.x, position.y - figSize.height / 2);
294+
Vec2 targetPos_top = position;
295+
296+
switch (x_movement) {
297+
case MOVE_LEFT:
298+
targetPos_down.x -= 1 * figSize.width / 3;
299+
targetPos_top.x -= 1 * figSize.width / 3;
300+
break;
301+
case MOVE_RIGHT:
302+
targetPos_down.x += 1 * figSize.width / 3;
303+
targetPos_top.x += 1 * figSize.width / 3;
304+
break;
285305
}
286-
287306
// if the target position is out of bound
288-
if (isOutOfMap(targetPos)) return;
307+
if (isOutOfMap(targetPos_down) || isOutOfMap(targetPos_top)) return;
289308

290-
if (collideWithBrick(targetPos) || collideWithBubble(targetPos)) return;
309+
if (collideWithBrick(targetPos_down) || collideWithBrick(targetPos_top) || collideWithBubble(targetPos_down) || collideWithBubble(targetPos_top)) return;
291310

292311
hero->setPosition(position);
293312
}

BombingAdventure/Classes/GameScene.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ class GameScene : public cocos2d::Layer
4444
* 这个函数实现:判定炸弹爆炸的有效范围(是否被砖块挡住),把范围内的可炸(dectructable)砖块炸掉。
4545
* 炸弹炸到人的判定可以再写一个函数?
4646
*/
47-
void bomb_explode();
48-
49-
Vector<Bomb*> get_all_bomb();
47+
void bomb_explode(Bomb *bomb);
5048

5149
bool isOutOfMap(cocos2d::Vec2 pos);
5250

@@ -94,9 +92,9 @@ class GameScene : public cocos2d::Layer
9492
// Item * speed_up_item;
9593
private:
9694

97-
Vector<Bomb*> currentBomb;
98-
cocos2d::TMXTiledMap * map; /* the tile map for Bombing Adventure game */
99-
cocos2d::TMXLayer * collidable;
95+
Vector<Bomb*> current_bombs;
96+
cocos2d::TMXTiledMap * map; /* the tile map for Bombing Adventure game */
97+
cocos2d::TMXLayer * destructable; /* destructable layer */
10098

10199
enum STATUS_AT {
102100
EMPTY, /* Corresponding position is empty */

BombingAdventure/Classes/Player.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ Bomb* Player::set_bomb() {
6060
bomb->setPosition(Vec2(player_tile_coord.x*TILE_SIZE.width + TILE_SIZE.width / 2,
6161
(MAP_SIZE.height - player_tile_coord.y)*TILE_SIZE.height - TILE_SIZE.height / 2));
6262

63+
this->getParent()->addChild(bomb);
64+
bomb->setGlobalZOrder(0);
65+
6366
++(this->num_present_bombs);
6467

6568
bomb->startCounting(2.5f);

BombingAdventure/Resources/bg.png

2.25 MB
Loading

BombingAdventure/Resources/map/map1.tmx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
</layer>
2929
<layer id="20" name="destructable" width="24" height="16">
3030
<data encoding="base64" compression="zlib">
31-
eJxjYBgFo2AUDASQIBIPBUCsmyXQaFLMx8ZGtx8XH5eZpIY/ue4nBMgxD90tEjjEcOkBYQAh6wQh
31+
eJzNk4EKwCAIBf0M//9LxxiDId5Vg8WCCDOfl2VGRMY17jWK/Vy7PYpJ8HdnbNa4qrWTn85k8Y/YiH8mH/FTbb/kN+2Oi2zSM+3V//MmR5fP/H/gt/ra+5C29Yr9JepZYiK746U7EJvxz9TfctcxeqOVGOtBq+VMzDkPiEoRKQ==
3232
</data>
3333
</layer>
3434
<objectgroup id="4" name="object1">

BombingAdventure/proj.win32/BombingAdventure.vcxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,18 +153,22 @@ xcopy "$(ProjectDir)..\Resources" "$(OutDir)" /D /E /I /F /Y
153153
</ItemDefinitionGroup>
154154
<ItemGroup>
155155
<ClCompile Include="..\Classes\AppDelegate.cpp" />
156+
<ClCompile Include="..\Classes\Bomb.cpp" />
156157
<ClCompile Include="..\Classes\Entity.cpp" />
157158
<ClCompile Include="..\Classes\GameScene.cpp" />
158159
<ClCompile Include="..\Classes\HelloWorldScene.cpp" />
160+
<ClCompile Include="..\Classes\Item.cpp" />
159161
<ClCompile Include="..\Classes\Player.cpp" />
160162
<ClCompile Include="..\Classes\RulesScene.cpp" />
161163
<ClCompile Include="main.cpp" />
162164
</ItemGroup>
163165
<ItemGroup>
164166
<ClInclude Include="..\Classes\AppDelegate.h" />
167+
<ClInclude Include="..\Classes\Bomb.h" />
165168
<ClInclude Include="..\Classes\Entity.h" />
166169
<ClInclude Include="..\Classes\GameScene.h" />
167170
<ClInclude Include="..\Classes\HelloWorldScene.h" />
171+
<ClInclude Include="..\Classes\Item.h" />
168172
<ClInclude Include="..\Classes\Player.h" />
169173
<ClInclude Include="..\Classes\RulesScene.h" />
170174
<ClInclude Include="main.h" />

BombingAdventure/proj.win32/BombingAdventure.vcxproj.filters

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@
3333
<ClCompile Include="..\Classes\Player.cpp">
3434
<Filter>src</Filter>
3535
</ClCompile>
36+
<ClCompile Include="..\Classes\Bomb.cpp">
37+
<Filter>src</Filter>
38+
</ClCompile>
39+
<ClCompile Include="..\Classes\Item.cpp">
40+
<Filter>src</Filter>
41+
</ClCompile>
3642
</ItemGroup>
3743
<ItemGroup>
3844
<ClInclude Include="main.h">
@@ -56,6 +62,12 @@
5662
<ClInclude Include="..\Classes\Player.h">
5763
<Filter>src</Filter>
5864
</ClInclude>
65+
<ClInclude Include="..\Classes\Bomb.h">
66+
<Filter>src</Filter>
67+
</ClInclude>
68+
<ClInclude Include="..\Classes\Item.h">
69+
<Filter>src</Filter>
70+
</ClInclude>
5971
</ItemGroup>
6072
<ItemGroup>
6173
<ResourceCompile Include="game.rc" />

0 commit comments

Comments
 (0)