Cocos2d-x 游戏实例教程《跑跑跑》3:焦点是主角,让地图随着主角滚动

2015年03月22日 08:49 0 点赞 0 评论 更新于 2025-11-21 18:02

通过前两节课的学习,我们已经完成了项目的创建,添加了地图和主角,并且实现了主角向前跑动的功能。然而,在实际运行过程中,我们会发现主角跑着跑着就会跑出地图范围,这显然不利于游戏的正常进行。因此,在本节课中,我们将重点实现地图随着主角滚动的功能。

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 函数里的操作涉及到 retainrelease 方法,这些内容将在后面的章节中详细讲解。简单来说,该函数的作用是保留地图(map)的引用。目前,大家可以先忽略其具体实现细节。

4. 调用 setTiledMap 函数

最后,打开 TollgateScene.cpp 文件中的 addPlayer 函数。在创建 Player 对象之后,调用 PlayersetTiledMap 函数。示例代码如下:

void TollgateScene::addPlayer() {
// 创建 Player 对象
auto player = Player::create();
// 添加 Player 到场景中
this->addChild(player);
// 调用 setTiledMap 函数
player->setTiledMap(map);
}

5. 运行项目

完成上述代码的编写和修改后,运行项目。此时,你就可以看到地图会随着主角的移动而滚动,确保主角始终处于屏幕的合适位置。

效果图

(此处可插入地图随主角滚动的效果图)

通过以上步骤,我们成功实现了地图随着主角滚动的功能,为游戏的流畅体验打下了基础。在后续的教程中,我们将继续完善游戏的其他功能。

作者信息

boke

boke

共发布了 3994 篇文章