参考资料:
《计算机游戏程序设计》(基础篇)(第3版)
说明:
<学习>系列所有的源代码均由《计算机游戏程序设计》提供。本人会在这些代码中融入自己的想法,对其进行迭代优化,旨在个人学习。
实现效果:
学习目标:
1.熟悉cocos2d-x开发环境。
2.了解cocos2d-x中二维游戏场景绘制方法。
3.掌握地图编辑器使用方法。
修改内容
1.完成Bug修改
修复树枝检测Bug。
步骤与过程
1. 完成Bug修改
试图修复树枝无法站立的bug。
① 首先我们找到判断角色站立在图块上的相关代码。在MapScene.cpp文件的void MapScene::update(float t)函数中,有这么一段代码:
// 不跳动时遇到非地面图块自动下落
if((int)(player_map_y / map->getTileSize().width) >= 0 && player_screen_x < sizeWidthTemp)
{
int playerTiledID = map->getLayer(MAP_BG_LAYER_NAME)->
getTileGIDAt(Vec2((int)(player_map_x/map->getTileSize().width),
(int)(map->getMapSize().height-1-player_map_y/map->getTileSize().height)));
if ((m_isJump == false)&&(m_jumpDir == Dir::STOP)&& (playerTiledID != 8)
&& (playerTiledID != 7) && (playerTiledID != 151) && (playerTiledID != 170)
&& (playerTiledID != 171) && (playerTiledID != 172)) {
m_isJump = true;
m_jumpDir = Dir::DOWN;
m_jumpSpeed = 2;
}
}
明显的,这段代码是用来判断角色“不跳动时遇到非地面图块自动下落”。而其中有一段加粗了的if判断语句则是判断目前角色是否站立在地面图块上,只有非地面图块才能执行后面的代码段更改角色的状态为下落状态。
而playerTiledID则明显是指图块的id了,因此,只要找到树枝图块对应的id号,把它作为判断条件加入到该加粗了的if判断语句中即可修复“树枝无法站立”的bug了。
值得注意的是,代码中playerTiledID变量的id是从1开始的,0代表空;而地图块中的id是从0开始的。因此两者id号相差1 (即playerTiledID - 1 才是地图块真正id号)。
用Tiled软件打开该游戏的地图素材图,寻找“树枝”块的id。如下图:
可见“树枝”图块的id为132和148 。因此,对应的playTiledID为133和149。
修改上文中加粗的if判断语句为:
if ((m_isJump == false)&&(m_jumpDir == Dir::STOP)&& (playerTiledID != 8) &&
(playerTiledID != 7) && (playerTiledID != 151) && (playerTiledID != 170)&&
(playerTiledID != 171) && (playerTiledID != 172) && (playerTiledID != 133) && (playerTiledID != 149))
② 在MapScene.cpp文件的void MapScene::update(float t)函数中,还有为“处理玩家跳跃”时的这么一段代码:
// 获取玩家脚下的地图块的编号
if (player_map_y/map->getTileSize().width >= 0 && player_screen_x < sizeWidthTemp) {
int tiledID = map->getLayer(MAP_BG_LAYER_NAME)->
getTileGIDAt(Vec2((int)(player_map_x/map->getTileSize().width),
(int)(map->getMapSize().height - 1 - player_map_y/map->
getTileSize().height)));
if (tiledID == 8 || tiledID == 7 || tiledID == 151 || tiledID == 170 || tiledID == 171
|| tiledID == 172) {
check = true;
player->setPositionY((int)(player_screen_y + player->
getContentSize().height/2 - 6));
m_jumpSpeed = PLAYER_JUMP_SPEED;
m_jumpDir = Dir::STOP;
m_isJump = false;
break;
}
}
在这段代码中,tiledID就类似于前文提到的playerTiledID变量一样。因此同理,在加粗的if语句段中加入“树枝”的id作为判断条件即可,更改为:
if (tiledID == 8 || tiledID == 7 || tiledID == 151 || tiledID == 170 || tiledID == 171
|| tiledID == 172 || tiledID == 133 || tiledID == 149)
至此,“树枝”bug修改完成。如下图所示,修改完该bug后,角色可以站在树枝上了: