Cocos2d-x 游戏实例教程《跑跑跑》3:焦点是主角,让地图随着主角滚动
通过前两节课的学习,我们已经完成了项目的创建,添加了地图和主角,并且实现了主角向前跑动的功能。然而,在实际运行过程中,我们会发现主角跑着跑着就会跑出地图范围,这显然不利于游戏的正常进行。因此,在本节课中,我们将重点实现地图随着主角滚动的功能。
1. 添加 setViewPointByPlayer 函数
首先,我们需要在 Player 类中添加一个名为 setViewPointByPlayer 的函数。这个函数的主要功能是判断当主角的坐标发生改变时,是否需要滚动地图。
代码实现
Player.h
在 Player.h 文件中添加相应的声明(新添加的代码通常会有明确标识,这里假设红框内是新加的)。
Player.cpp
在 Player.cpp 文件中实现 setViewPointByPlayer 函数(以下展示新加的代码):
// 这里是 setViewPointByPlayer 函数的具体实现代码
void Player::setViewPointByPlayer() {
// 函数具体逻辑,判断是否需要滚动地图
// 示例逻辑:当主角超过屏幕中心一定范围时滚动地图
auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
Vec2 playerPos = this->getPosition();
if (playerPos.x > visibleSize.width / 2 + origin.x) {
// 滚动地图的具体操作
}
}
2. 重写 setTagPosition 函数
Player 类需要重写父类的 setTagPosition 函数。在原父类的实现基础上,添加对 setViewPointByPlayer 函数的调用。这样,当主角的位置发生改变时,就会触发地图滚动的判断逻辑。
// 重写 setTagPosition 函数
void Player::setTagPosition(const Vec2& position) {
// 调用父类的 setTagPosition 函数
Node::setTagPosition(position);
// 调用 setViewPointByPlayer 函数
this->setViewPointByPlayer();
}
3. 关于 setTiledMap 函数
setTiledMap 函数里的操作涉及到 retain 和 release 方法,这些内容将在后面的章节中详细讲解。简单来说,该函数的作用是保留地图(map)的引用。目前,大家可以先忽略其具体实现细节。
4. 调用 setTiledMap 函数
最后,打开 TollgateScene.cpp 文件中的 addPlayer 函数。在创建 Player 对象之后,调用 Player 的 setTiledMap 函数。示例代码如下:
void TollgateScene::addPlayer() {
// 创建 Player 对象
auto player = Player::create();
// 添加 Player 到场景中
this->addChild(player);
// 调用 setTiledMap 函数
player->setTiledMap(map);
}
5. 运行项目
完成上述代码的编写和修改后,运行项目。此时,你就可以看到地图会随着主角的移动而滚动,确保主角始终处于屏幕的合适位置。
效果图
(此处可插入地图随主角滚动的效果图)
通过以上步骤,我们成功实现了地图随着主角滚动的功能,为游戏的流畅体验打下了基础。在后续的教程中,我们将继续完善游戏的其他功能。