【cocos2dx 3.2】一个都不能死4 游戏层
2015年03月17日 16:14
0 点赞
0 评论
更新于 2025-11-21 17:30
一、游戏层分析
游戏层主要包含人物、物块和地面三个元素,因此将其定义为 Layer 类。在游戏层的实现过程中,需要完成以下几个关键步骤:
- 往游戏层中添加各类元素。
- 设置
schedule定时添加物块。 - 添加
jump()方法,使人物能够向上跳起。 - 在主场景中添加游戏层
GameLayer.h。
二、代码实现
1. GameLayer.h 头文件
#include "cocos2d.h"
#include "Hero.h"
#include "Block.h"
#include "Edge.h"
class GameLayer : public cocos2d::Layer {
public:
// 根据 Y 轴位置初始化游戏层
virtual bool init(float positionY);
static GameLayer* create(float positionY);
// 按一定时间间隔添加物块
void resetTime();
void addBlock();
void update(float dt);
// 向上跳
void jump();
cocos2d::Node* getEdge();
private:
float _positionY;
Hero* _hero;
cocos2d::Node* _edge;
int oldTime;
int curTime;
cocos2d::Size visibleSize;
};
2. GameLayer.cpp 实现文件
#include "GameLayer.h"
USING_NS_CC;
GameLayer* GameLayer::create(float positionY) {
auto game = new GameLayer();
if (game && game->init(positionY)) {
game->autorelease();
return game;
}
delete game;
game = nullptr;
return nullptr;
}
bool GameLayer::init(float positionY) {
if (!Layer::init()) {
return false;
}
_positionY = positionY;
visibleSize = Director::getInstance()->getVisibleSize();
// 重置计时器
resetTime();
// 添加物理边界
_edge = Edge::create();
_edge->setPosition(visibleSize.width / 2, _positionY + 70);
addChild(_edge);
// 添加地板
auto floor = Sprite::create();
floor->setTextureRect(Rect(0, 0, visibleSize.width, 3));
floor->setColor(Color3B(0, 0, 0));
floor->setPosition(visibleSize.width / 2, _positionY + 1.5);
addChild(floor);
// 添加人物
_hero = Hero::create();
_hero->setPosition(50, _positionY + _hero->getContentSize().height / 2);
addChild(_hero);
// 添加障碍物计时器
scheduleUpdate();
return true;
}
// 按一定时间间隔添加物块
void GameLayer::update(float dt) {
oldTime++;
if (oldTime >= curTime) {
addBlock();
resetTime();
}
}
void GameLayer::resetTime() {
oldTime = 0;
curTime = (rand() % 60) + 100;
}
void GameLayer::addBlock() {
auto b = Block::create();
b->setPositionY(_positionY + b->getContentSize().height / 2);
addChild(b);
}
void GameLayer::jump() {
if (_hero->getPositionY() < _positionY + _hero->getContentSize().height / 2 + 5) {
_hero->getPhysicsBody()->setVelocity(Vec2(0, 400));
}
}
cocos2d::Node* GameLayer::getEdge() {
return _edge;
}
三、代码解释
GameLayer类:继承自cocos2d::Layer,用于管理游戏层的各种元素和逻辑。init方法:初始化游戏层,包括设置计时器、添加物理边界、地板、人物等元素,并开启更新调度。update方法:按一定时间间隔添加物块,通过比较oldTime和curTime来判断是否需要添加物块。resetTime方法:重置计时器,curTime为一个随机值,范围在 100 到 159 之间。addBlock方法:创建一个新的物块并添加到游戏层中。jump方法:当人物在一定范围内时,使其向上跳起,通过设置物理体的速度来实现。getEdge方法:返回物理边界节点。
通过以上代码和解释,我们实现了一个包含人物、物块和地面元素的游戏层,并实现了定时添加物块和人物跳跃的功能。