Skip to content

Commit a01a737

Browse files
authored
Merge pull request #16 from Omnipotent-Youth/master
destroy bricks
2 parents ac2544c + 359137f commit a01a737

File tree

10 files changed

+113
-63
lines changed

10 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
}
@@ -167,6 +166,13 @@ void GameScene::update(float delta) {
167166

168167
makeMove(Vec2(position_x, position_y));
169168

169+
/* Bombs blow up destructable bricks */
170+
while (!current_bombs.empty() && !current_bombs.front()->bombIsCounting()) {
171+
Bomb * bomb = current_bombs.front();
172+
bomb_explode(bomb);
173+
current_bombs.erase(0);
174+
}
175+
170176
/* Test pick_item method */
171177
Item * speed_up_item = Item::create();
172178
speed_up_item->setPosition(Vec2(500, 380));
@@ -180,14 +186,58 @@ void GameScene::update(float delta) {
180186

181187
}
182188

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

193243
bool GameScene::isOutOfMap(Vec2 pos)
@@ -231,57 +281,26 @@ bool GameScene::collideWithBubble(cocos2d::Vec2 targetPos)
231281

232282
void GameScene::makeMove(Vec2 position)
233283
{
234-
Vec2 targetPos = position;
235-
236284
// correct the detection deviation caused by the sprite size
237285
Size figSize = hero->getContentSize();
238-
239-
if (y_movement == MOVE_STOP) {
240-
switch (x_movement) {
241-
case MOVE_LEFT:
242-
targetPos.x -= 1 * figSize.width / 3;
243-
break;
244-
case MOVE_RIGHT:
245-
targetPos.x += 1 * figSize.width / 3;
246-
break;
247-
}
248-
}
249-
else {
250-
switch (y_movement) {
251-
case MOVE_UP:
252-
if (x_movement == MOVE_STOP) {
253-
break;
254-
}
255-
else {
256-
if (x_movement == MOVE_LEFT) {
257-
targetPos.x -= 1 * figSize.width / 3;
258-
}
259-
else {
260-
targetPos.x += 1 * figSize.width / 3;
261-
}
262-
break;
263-
}
264-
case MOVE_DOWN:
265-
targetPos.y -= figSize.height / 2 + 3;
266-
if (x_movement == MOVE_STOP) {
267-
break;
268-
}
269-
else {
270-
if (x_movement == MOVE_LEFT) {
271-
targetPos.x -= 1 * figSize.width / 3;
272-
}
273-
else {
274-
targetPos.x += 1 * figSize.width / 3;
275-
}
276-
break;
277-
}
278-
}
286+
287+
Vec2 targetPos_down(position.x, position.y - figSize.height / 2);
288+
Vec2 targetPos_top = position;
289+
290+
switch (x_movement) {
291+
case MOVE_LEFT:
292+
targetPos_down.x -= 1 * figSize.width / 3;
293+
targetPos_top.x -= 1 * figSize.width / 3;
294+
break;
295+
case MOVE_RIGHT:
296+
targetPos_down.x += 1 * figSize.width / 3;
297+
targetPos_top.x += 1 * figSize.width / 3;
298+
break;
279299
}
280-
281300
// if the target position is out of bound
282-
if (isOutOfMap(targetPos)) return;
301+
if (isOutOfMap(targetPos_down) || isOutOfMap(targetPos_top)) return;
283302

284-
if (collideWithBrick(targetPos) || collideWithBubble(targetPos)) return;
303+
if (collideWithBrick(targetPos_down) || collideWithBrick(targetPos_top) || collideWithBubble(targetPos_down) || collideWithBubble(targetPos_top)) return;
285304

286305
hero->setPosition(position);
287306
}

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">
10.4 KB
Loading

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)