棋类游戏中的棋子摆放逻辑

创建节点

代码编写


其实要点就一句话:我们看到的不应是棋盘,而是坐标。

现在通过下面的五子棋(或围棋)实例来看下如何理解这句话。

运行效果如下:

Cocos Creator版本:2.2.2

后台回复"",获取该项目完整文件。

创建节点

1. bg为Sprite类型节点,作为场景背景。

2. board bg也是Sprite类型节点,作为棋盘背景。

3. board虽然为空节点,但是非常关键,因为棋子都是添加到这个节点上的。它的大小应等于棋盘上可落子区域大小:

为方便开发,我们可以将该节点的锚点设置为(0, 0),那么对棋子来说左下角就是坐标原点了。

4. dot预制也会添加到board节点上。棋盘上有多少个点,就会有多少个预制。每个预制都会进行触摸监听,玩家点击到哪个dot,那么我们就在相应的dot位置上放一个棋子。

5. piece预制用来当做棋子。

代码编写

首先我们新建一个Board.js脚本,添加属性并编写onLoad方法内容:

// Board.js
properties: {piecePrefab: cc.Prefab,                  // 棋子预制touchDotPrefab: cc.Prefab                // 触摸点预制
},// LIFE-CYCLE CALLBACKS:onLoad () {cc.debug.setDisplayStats(false);const hLines = 15;                       // 水平线数量const vLines = 15;                       // 垂直线数量this.blockWidth = (this.node.width / (vLines-1)).toFixed(2);     // 每块区域的宽度this.blockHeight = (this.node.height / (hLines-1)).toFixed(2);   // 每块区域的高度this.boardPosArray = [];                 // 棋盘上所有点的坐标this.getBoardPos(hLines, vLines);       this.currentPlayer = 'BLACK';            // 当前着步方this.initTouchDots();                    // 添加所有触摸点
},

1. hLines和vLines常量用来保存棋盘上的水平线和垂直线数量,五子棋(围棋)的棋盘是一个正方形,所以横竖线数量相等,都为15。

2. 既然已经知道了可落子区域的总大小和横竖线数量,那么我们就可以求出每块小区域的大小了。

3. boardPosArray数组用来存储棋盘上各个点的坐标。而获取各个点的坐标就在getBoardPos方法中:

// Board.js
getBoardPos(hLines, vLines) {          for (let i=0; i<hLines; i++) {for (let j=0; j<vLines; j++) {let x = j*this.blockWidth;let y = i*this.blockHeight;this.boardPosArray.push([x, y, '0']);}}
},

boardPosArray数组的每个元素包含一个x坐标,一个y坐标以及用来判断当前位置是否存在棋子的标识,初始化时都是'0'。

4. currentPlayer变量用来存储当前的着步方。

5. initTouches用来添加触摸点,方法编写如下:

// Board.js
initTouchDots() {for (let i=0; i<this.boardPosArray.length; i++) {let touchDot = cc.instantiate(this.touchDotPrefab);touchDot.opacity = 0;this.node.addChild(touchDot);touchDot.getComponent('TouchDot').initBoard(this);touchDot.setPosition(this.boardPosArray[i][0], this.boardPosArray[i][1])}
},

触摸点是不能被看到的,所以透明度需要设为0。笔者这里给大家看下没有设置为透明时的样子:

该预制上挂着的TouchDot.js脚本编写如下:

// TouchDot.js
cc.Class({extends: cc.Component,properties: {},// LIFE-CYCLE CALLBACKS:onLoad () {this.node.on('touchstart', this.onTouchStart, this);},initBoard(board) {this.board = board;},onTouchStart() {this.board.putPiece(this.node.x, this.node.y);}
});

initBoard方法用于获取Board.js脚本实例。在onTouchStart方法中我们调用Board.js中的putPiece方法直接将棋子放置到该触摸点的位置。

putPiece方法编写如下:

// Board.js
putPiece(x, y) {// 放置棋子,并更新着步方xxlet is_ok = this.check(x.toFixed(2), y.toFixed(2));               if (!is_ok)return;let piece = cc.instantiate(this.piecePrefab);this.node.addChild(piece);piece.getComponent('Piece').setPic(this.currentPlayer);piece.width = this.blockWidth*0.9;piece.height = this.blockHeight*0.9;piece.setPosition(x, y)if (this.currentPlayer == 'BLACK') {this.currentPlayer = 'WHITE';}else {this.currentPlayer = 'BLACK';}
},

在该方法中,我们首先要调用check方法判断当前位置是否已经有棋子了,如果没有那么就在该位置上放一个棋子,放置完毕则更改着步方。

check方法编写如下:

// Board.js
check(x, y) {// 查看当前位置是否可以着步for (let i=0; i<this.boardPosArray.length; i++) {if (x==this.boardPosArray[i][0] && y==this.boardPosArray[i][1]){if (this.boardPosArray[i][2]=='0') {// 可以放置,并更新数组this.boardPosArray[i][2] = '1';return true;}else {// 已有棋子,不可放置return false;}}}
}

其实就是循环boardPosArray数组,判断该位置上是'0'还是'1',如果是前者,那么表明可以放置。

注:笔者这里的判断只是给大家进行简单进行演示,并不一定符合下棋规则。比如围棋中的某个空位落子后会直接没"气"(也就是说该空位已经被围死了),那么也不能在这个空位上落子对吧。

棋子预制上挂着的Piece.js脚本编写如下:

// Piece.js
cc.Class({extends: cc.Component,properties: {blackPic: cc.SpriteFrame,whitePic: cc.SpriteFrame},// LIFE-CYCLE CALLBACKS:onLoad () {},setPic(currentPlayer) {if (currentPlayer=='BLACK') {this.node.getComponent(cc.Sprite).spriteFrame = this.blackPic;}else if (currentPlayer=='WHITE') {this.node.getComponent(cc.Sprite).spriteFrame = this.whitePic;}}
});

blackPic和whitePic就是黑白棋子图片,而setPic方法会根据当前的着步方来设置相应的棋子图片。

P.S. 虽然笔者这里用的是五子棋(或围棋)这个例子,但是开发逻辑同样适用于其他棋类,比如象棋。

好,那本节教程就到这,希望大家有所收获~

《Cocos Creator游戏实战》棋类游戏中的棋子摆放逻辑相关推荐

  1. Cocos Creator入门实战:桌球小游戏

    Cocos Creator入门实战:桌球小游戏 转载请保留原文链接:https://blog.csdn.net/zzx023/article/details/90035153 本篇主要是希望能够通过C ...

  2. Cocos Creator 开发实战——篮球物理游戏

    Cocos Creator 开发实战--篮球物理游戏 知识点 教程 基础背景搭建 物理系统 篮网制作 篮球 结语 Cocos Creator 开发实战--篮球物理游戏 本篇文章教大家实现篮球物理游戏最 ...

  3. ​Cocos Creator入门实战:桌球小游戏

    本文作者:BigBear 多年游戏行业研发经验 精通Unreal.CocosCreator游戏引擎 参与过多款手游.端游项目的研发 Cocos Creator入门实战:桌球小游戏 本篇主要是希望能够通 ...

  4. cocos creator开发微信小游戏(五)贪吃蛇大作战

    目录 小游戏介绍 小游戏cocos creator场景图 小游戏部分JS代码 开发中碰到的问题 工程及说明 小游戏介绍 贪吃蛇小游戏:贪吃蛇试玩(首次加载比较慢),类似贪吃蛇大作战的小游戏.当玩家的蛇 ...

  5. Cocos Creator发布微信小游戏包内体积过大问题

    1.初识 设置微信开发工具和js编辑器 3.5.2 :Cocos Creator perferences 2.Cocos Creator发布微信小游戏包内体积过大问题 2.1 已不可取:搭建本机服务器 ...

  6. 用 Cocos Creator 制作平台跳跃游戏

    前言 平台跳跃类游戏如<超级马里奥><Celeste蔚蓝>等,非常考验玩家的操作和判断,有着非常本真的游戏乐趣.这类游戏乍一看,挺容易做的,但是要做好却不太容易.今天,我将使用 ...

  7. cocos creator实例--实现FlappyBird游戏的基本功能 | 附代码

    FlappyBird是早期的早IOS上的一款非常受欢迎的像素游戏. 游戏玩法: 点击屏幕控制小鸟上下飞行:小鸟在飞行的过程中,碰撞到管子就结束游戏,飞过一根管子分数加1: 游戏效果: 实现逻辑介绍: ...

  8. cocos creator 开发浅塘游戏(1) 软件安装

    cocos creator 开发浅塘游戏 文章目录 cocos creator 开发浅塘游戏 一.浅塘游戏 二.使用软件 1.cocos creator 2.vs code 一.浅塘游戏 浅塘是一款华 ...

  9. cocos creator 横版射击游戏 突击对决H5+安卓+IOS三端源码

    cocos creator 横版射击游戏 突击对决H5+安卓+IOS三端源码,多关卡,开发脚本为js方便扩展和阅读,支持cocos creator2.X版本,完整的源码可直接运营. 源码下载链接 co ...

最新文章

  1. 更多传媒巨头或进军大数据产业
  2. window.event.srcElement (转)
  3. workaround for error message Table maintenance not allowed for table XXX
  4. C/C++代码优化方法
  5. 自托管websocket和webapi部署云服务器域名及远程访问
  6. django mysql debug_django mysql db 日志无输出
  7. (数据结构)约瑟夫环问题——C语言实现
  8. BIOS之内存控制器设置以及内存电路接口分析
  9. Qt开发技术:Qt绘图系统(二)QPainter详解
  10. html怎么调用node.js,nodejs如何调用函数?
  11. No base URI; hope URI is absolute: http://
  12. 使用Kubuntu运行命令对话框(Alt + F2)
  13. VMware 15.5.7 的下载与安装
  14. 面向对象版学员管理系统(存储数据库)
  15. 可用主机ip地址数量的计算
  16. 扬帆致远跨境电商:跨境电商品牌如何锁定真实用户
  17. 【程序源代码】微信小程序商城,微信小程序微店
  18. Ball in Berland
  19. linux redis 日志在哪里,Redis的日志系统
  20. CCS中的.gel文件

热门文章

  1. AE自带抠像插件解释
  2. 记录一下Python的11个小技巧
  3. c语言中变量加1,c语言中,指针加1的情况.指针变量详细介绍
  4. db2和相关驱动的下载
  5. android 微信好友,朋友圈分享
  6. 【即点即改】关于PHP即点即改的一些东西
  7. SQLSERVER 数据库或表修复(DBCC CHECKDB)
  8. Matlab实现倒谱法 求 基音频率和共振峰
  9. 从两张Excel表格中筛选相同的值
  10. logd 删除log