一、引言
昨天我已经在上一篇博客里实现了三消游戏的初始化和消除功能,然而并没有实现一般三消游戏都有的重力降落、自动消除、随机补充的功能。这篇博客就是研究如何实现这些功能的。
让我们总结下我们将要实现的三消游戏的功能:
1. 初始化
2. 消除
3. 重力降落
4. 自动消除(重力降落后可能引起的消除操作)
5. 随机补充(补充消除格子)
6. 额外功能:重新开始、计算分数
在上一篇博客我们已经实现了第 1 步和第 2 步,现在我们开始接下来功能的实现吧。
ps:
想要了解上一篇博客内容的同学可以点击这里:
思考的救赎(一):三消游戏实现探索
想要获取本系列博客代码的同学可以点击这里:
wangying2016/ThreeClearGame
哈哈哈,先来看下我们的最终效果展示吧:
二、开始前的一点架构
我们要实现如上 Gif 图的效果,我们就要知道整个游戏的流程是什么样子的:
这里我特意花了一个流程图(T_T 虽然有点不雅观),但是已经可以非常详细的说明我们一次消除过程中,到底程序做了什么。
也就是说,我们在消除两个格子之后,重力降落、自动消除和随机补充这三个行为是同步进行的(也就是一个结束了下一个才能开始的)。
并且由于自动消除的行为发生,我们会不停的随机补充新的格子,然后又可能会发生自动消除行为,最后又会触发我们的随机补充行为…
直到我们的当前网格里,已经没有三消可能了,才会停止下来。
这个过程的模拟,是由 SOUI 的定时器实现的。
1. 当我们成功消除格子之后,我们设置消除格子为删除皮肤,然后刷新界面。
// 刷新网格
void CMainDlg::RefreshNet(std::vector<std::vector<Grid>> vecNet)
{
// 删除计时器
KillTimer(TIMER_LAND);
// 刷新网格
SOUI::STileView* pTileView = FindChildByName2<SOUI::STileView>(L"tv_net");
assert(pTileView);
CNetAdapter* pAdapter = static_cast<CNetAdapter*>(pTileView->GetAdapter());
if (pAdapter != nullptr) {
pAdapter->UpdateNet(vecNet);
pAdapter->notifyDataSetChanged();
}
// 设置分数
SetScore()