【别踩白块】游戏实战开发之游戏逻辑的实现
大家好,我是Lampard------是一位从事cocos开发的游戏小白。
如果各位大家有更好的建议,欢迎在下方评论,谢谢!!!
今天要介绍的是游戏主菜单场景的实现:
这款游戏的游戏逻辑很简单,主要是分为:
(1)实现黑白块行的实现
在上一篇的博客上面我们已经定义过了Block砖块类,所以我们初始化黑白块行时,我们只需要用随机数选取一个位置放置白块,然后用一个循环,从左到右依次的create砖块类,普通的位置放置黑块,当i==blockIndex时放置白块。并用LineCount来记录行的位置。
void GameLayer::addNormalLine(int LineIndex) {
Block *block;
int blockIndex = rand() % 4;
for (int i = 0; i < 4; i++) {
block = Block::createWithArgs(blockIndex==i?Color3B::BLACK:Color3B::WHITE,Size(vsable.width/4-1,vsable.height/4-1), "", 20, Color4B::BLACK);
this->addChild(block);
block->setPosition(i*vsable.width / 4, LineIndex*vsable.height / 4);
block->setLineIndex(LineIndex);
}
LineCount++;
}
(2)黑白块行的移动
移动函数包含了游戏成功界面的实现,首先我们要判断游戏是否已经结束,如果已经结束了,则切换到成功界面。如果没有结束,则把存放砖块的向量遍历,然后从第0行开始,把砖块沿着y轴放向向下移动一行。然后在第四行上面新建一行新的砖块行进行填充。
void GameLayer::moveDown() {
// 判断是否结束
if (LineCount < 25) {
addNormalLine(4);
}
else
{
log("%.1f",Time);
Director::getInstance()->replaceScene(WinLayer::createScene());
}
auto bs = Block::getBlocks();
for (auto it = bs->begin(); it != bs->end(); it++) {
(*it)->moveDown();
}
}
(3)游戏时间的记录
因为我们要在胜利场景中显示游戏所用的时间,所以我们需要设置一个计时器,来记录全局变量Time,TIME我保存在了存放全局变量的Global类中。
void GameLayer::addTime(float dt) {
Time=Time+0.1;
}
(4)用户操作的监听以及游戏失败的判断
监听函数我们使用单点触摸类来实现,然后判断所触摸的点是否在第一行,因为我们游戏里面,第一行时用户交互行,所以一切不在第一行的触摸不予以理会。当触摸点在第一行上时,则进行判断,所触摸的点对应的砖块的颜色。如果颜色等于黑色,则把黑色的砖块变黑,然后把游戏行进行下移。当触摸点对应的砖块为白块时,则跳转到失败界面。
auto Listener = EventListenerTouchOneByOne::create();
Listener->onTouchBegan = [this](Touch* t, Event* e) {
log("Ontouch");
auto bs = Block::getBlocks();
Block* block;
for (auto it = bs->begin(); it != bs->end(); it++) {
block = *it;
if (block->getLineIndex() == 1 && // 用户点击的点事在第一行并且发生碰撞的点事在block这个精灵内部的话,则执行游戏逻辑
block->getBoundingBox().containsPoint(t->getLocation())) // 砖块的内部含触摸点
{
if (block->getColor() == Color3B::BLACK) {
block->setColor(Color3B::GRAY);
this->moveDown();
}
else {
Director::getInstance()->replaceScene(FaildLayer::createScene());
}
break;
}
}
return false;
};
Director::getInstance()->getEventDispatcher()->
addEventListenerWithSceneGraphPriority(Listener, this);
至此,我们的游戏【别踩白块】系列所有的游戏逻辑已经实现。
感谢阅读,谢谢大家!!!