闭关一周,开发一款消灭星星游戏



今天要分享的是消灭星星如何开发,这种消除游戏算是逻辑非常简单的一种类型,游戏玩法简单而有趣,我会详细介绍开发一款消灭星星游戏核心逻辑。
算法逻辑
消灭星星游戏的算法涉及到多个方面,包括星星的生成、消除规则、玩家操作的响应等。以下是一些会用到的算法:
星星生成算法:
随机生成:在游戏开始或关卡切换时,随机生成星星的位置和属性,属性主要是类型,不同类型可以设置不同的星星颜色。
规定生成:按照一定的规则,例如在特定位置生成特殊类型的星星,或者确保每个生成的星星都能够被消除。
这里采用比较简单的方式,地图采用10*10的二维数组,作为星星存放的位置,每个星星的宽度是75*75。一共有5种颜色类型的星星。

生成逻辑简单粗暴,随机颜色类型,初始化填满地图,10*10,然后缓存到一个对象上供后面计算使用,实例化的StarTile,并添加到父元素容器上。直接看代码,
function initializeStarTiles() { for (var col = 0; col < this.iTileCols; col++) { this.pMatriColTile[col] = []; for (var row = 0; row < this.iTileRows; row++) { var starTile = cc.instantiate(this.starTilePrefab); starTile.parent = this.elementLayer; var tileComponent = starTile.getComponent(_); tileComponent.setColRow(col, row); var randomColorType = parseInt(5 * Math.random()); tileComponent.setColorType(randomColorType); if (!this.starTileSize) { this.starTileSize = starTile.getContentSize(); } starTile.setPosition(this.calcStarTilePos(col, row)); this.pMatriColTile[col][row] = starTile; } }}
设置颜色类型的时候,顺便设置一下对应颜色的纹理,预制体的纹理如下:

星星消除规则:
相邻匹配:判断星星是否相邻,如果相邻并符合消除规则(如两个或以上相同颜色的星星相连),则进行消除。
检测连锁反应:消除后,检测是否形成新的匹配,从而触发连锁反应,可以有也可以没有,有的话游戏的节奏感会更好。

这次没有做深入的连锁反应逻辑处理,只做了简单的相邻匹配,这个算法相对来说比较简单,当前选择的星星上下左右的星星比较类型,如果满足连续N个则可以被消除。采用递归算法即可实现,具体可以参考下面的代码:
traversalTiles: function (column, row, targetTile) { var curspriteTile = this.pMatriColTile[column][row]; if (curspriteTile) {        if (!targetTile) { this.starTileRemove.push(curspriteTile) } // 上下左右依次查询 this.findSameTiles(column, row + 1, curspriteTile) this.findSameTiles(column, row - 1, curspriteTile)        this.findSameTiles(columo + 1, row, curspriteTile)        this.findSameTiles(column - 1, row, curspriteTile) } else { cc.log("curspriteTile is null!"); }}// 找相同临近的星星findSameTiles: function (column, row, targetTile) { if (!this.pMatriColTile[column] || !this.pMatriColTile[column][row]) { return false; } var currentTile = this.pMatriColTile[column][row];     if (targetTile && currentTile && targetTile != currentTile && !this.connectContain(currentTile)) { var tileComponentA = currentTile.getComponent(StarTile); var tileComponentB = targetTile.getComponent(StarTile); if (tileComponentA.getColorType() == tileComponentB.getColorType()) { cc.log("x * y", column, row); this.starTileRemove.push(currentTile); tileComponentA.setSelected(true); tileComponentB.setSelected(true);            this.traversalTiles(column, row, targetTile); // 如果找到了继续遍历查询 return true; } } return false;}
玩家操作响应:
触摸或点击检测:检测玩家触摸或点击的位置,确定选择的星星。这个处理逻辑比较简单,将手指坐标转换为星星的行列位置
onTouchBegin: function (event) { var e = Math.floor; var touchPos = this.elementLayer.convertTouchToNodeSpace(event.touch); var col = e(touchPos.x / this.starTileSize.width);      var row = e(touchPos.y / this.starTileSize.height); this.eliminateFlow(col, row); }
游戏结束判定逻辑:
达到目标分数:如果玩家在规定的步数或时间内达到目标分数,则游戏胜利。
检测无法移动:如果没有可消灭的星星,判定游戏失败。
遍历所有星星,判断是否还能消除。这个函数可以每一帧都调用一次,在组件的update生命周期方法中调用。目标分数计算很容易,消灭星星可以得分,然后对比当前关卡分数即可,完成目标分数则提前结束本关。
checkGameOver: function () { for (var col = 0; col < this.iTileCols; col++) { if (this.pMatriColTile[col]) { for (var row = 0; row < this.iTileRows && this.pMatriColTile[col][row]; row++) { var currentTile = this.pMatriColTile[col][row]; var currentColor = currentTile.getComponent(_).getColorType(); // 四个方向的位置 var positionsToCheck = [ cc.Vec2(col + 1, row), cc.Vec2(col - 1, row), cc.Vec2(col, row - 1), cc.Vec2(col, row + 1) ]; // 遍历检测 for (var index = 0; index < positionsToCheck.length; index++) { var position = positionsToCheck[index]; if ( this.pMatriColTile[position.x] && this.pMatriColTile[position.x][position.y] && this.pMatriColTile[position.x][position.y].getComponent(_).getColorType() == currentColor ) { // 有颜色相同说明还能消除 return false; } } } } } // 否则就结束了 return true;},
其他辅助道具就不做深入介绍,点击阅读全文体验游戏。
欢迎关注我的公众号,获取更多游戏开发知识和游戏源码,手把手教你做游戏。
更多历史文章
解密益智游戏背后的逻辑:水排序核心实现深度解析
玩转合成游戏:从0到1的合成游戏开发指南
新形势下,中小团队和个人开发者还能入局小游戏吗?
游戏弯道设计:曲线运动的关键技巧与策略
到顶部