在上一周,学习了二维数组的基本思路,老师让我们回来完成一个2048的小游戏,所以本文就记录这个demo的完成流程

--案例展示--

  • 编辑器场景搭建以及方块预制体的制作
  • 脚本文件
  1. block.js——挂载在block预制体上的脚本

    import colors from 'color';
    cc.Class({extends: cc.Component,properties: {numberLabel:cc.Label,},// LIFE-CYCLE CALLBACKS:// onLoad () {},start () {},setNumber(number){if(number == 0){this.numberLabel.node.active = false;}this.numberLabel.string = number;if(number in colors){this.node.color = colors[number];}}// update (dt) {},
    });
    
  2. color.js——方块颜色的控制脚本
    var colors = [];
    colors[0] = cc.color(198,184,172,255);
    colors[2] = cc.color(235,224,213,255);
    colors[4] = cc.color(234,219,193,255);
    colors[8] = cc.color(240,167,110,255);
    colors[16] = cc.color(244,138,89,255);
    colors[32] = cc.color(245,112,85,255);
    colors[64] = cc.color(245,83,52,255);
    colors[128] = cc.color(234,200,103,255);
    colors[256] = cc.color(234,197,87,255);
    colors[512] = cc.color(234,192,71,255);
    colors[1024] = cc.color(146,208,80,255);
    colors[2048] = cc.color(0,176,240,255);module.exports = colors;
  3. game.js——游戏的流程控制脚本
const ROWS = 4;
const NUMBERS = [2, 4];
const MIN_LENGTH = 50;
const MOVE_DURATION = 0.1;cc.Class({extends: cc.Component,properties: {scoreLabel: cc.Label,score: 0,blockPrefab: cc.Prefab,gap: 20,bg: cc.Node,},// LIFE-CYCLE CALLBACKS:// onLoad () {},start() {this.drawBgBlocks();//create Blocksthis.init();this.addEventHandler();//touch Click},drawBgBlocks() {this.blockSize = (cc.winSize.width - this.gap * (ROWS + 1)) / ROWS;let x = this.gap + this.blockSize / 2;//block.positionlet y = this.blockSize;this.positions = [];for (let i = 0; i < ROWS; ++i) {this.positions.push([0, 0, 0, 0]);for (let j = 0; j < ROWS; ++j) {let block = cc.instantiate(this.blockPrefab);block.width = this.blockSizeblock.height = this.blockSizethis.bg.addChild(block);block.setPosition(cc.v2(x, y));this.positions[i][j] = cc.v2(x, y);//存入格子位置数据x += this.gap + this.blockSize;block.getComponent('block').setNumber(0);}y += this.gap + this.blockSize;x = this.gap + this.blockSize / 2;}},init() {this.updateScore(0);if (this.blocks) {for (let i = 0; i < this.blocks.length; ++i) {for (let j = 0; j < this.blocks[i].length; ++j) {if (this.blocks[i][j] != null) {this.blocks[i][j].destroy();}}}}this.data = [];this.blocks = [];for (let i = 0; i < ROWS; ++i) {this.blocks.push([null, null, null, null]);this.data.push([0, 0, 0, 0]);}this.addBlock();this.addBlock();this.addBlock();},updateScore(number) {this.score = number;this.scoreLabel.string = '分数: ' + number;},getEmptyLocations() {let locations = [];for (let i = 0; i < this.blocks.length; ++i) {for (let j = 0; j < this.blocks[i].length; ++j) {if (this.blocks[i][j] == null) {locations.push({ x: i, y: j });}}}return locations;},addBlock() {let locations = this.getEmptyLocations();if (locations.length == 0) return false;let location = locations[Math.floor(Math.random() * locations.length)];let x = location.xlet y = location.y;let position = this.positions[x][y];let block = cc.instantiate(this.blockPrefab);block.width = this.blockSizeblock.height = this.blockSizethis.bg.addChild(block);block.setPosition(position);let number = NUMBERS[Math.floor(Math.random() * NUMBERS.length)]block.getComponent('block').setNumber(number);this.blocks[x][y] = block;this.data[x][y] = number;return true;},addEventHandler() {this.bg.on('touchstart', (event) => {this.startPoint = event.getLocation();});this.bg.on('touchend', (event) => {this.endPoint = event.getLocation();let vec = this.endPoint.sub(this.startPoint);if (vec.mag() > MIN_LENGTH) {if (Math.abs(vec.x) > Math.abs(vec.y)) {//xif (vec.x > 0) {this.moveRight();} else {this.moveLeft();}} else {//yif (vec.y > 0) {this.moveUp();} else {this.moveDown();}}}})},afterMove(hasMove) {if (hasMove == true) {this.addBlock();}},doMove(block, position, callback) {let action = cc.moveTo(MOVE_DURATION, position)let finish = cc.callFunc(() => {callback && callback()});cc.tween(block)//tween Action.then(action).then(finish).start()},moveLeft() {cc.log("left");let hasMove = false;let move = (x, y, callback) => {if (y == 0 || this.data[x][y] == 0) {callback && callback();return;} else if (this.data[x][y - 1] == 0) {//movelet block = this.blocks[x][y];let position = this.positions[x][y - 1];this.blocks[x][y - 1] = block;this.data[x][y - 1] = this.data[x][y];this.data[x][y] = 0;this.blocks[x][y] = null;this.doMove(block, position, () => {move(x, y - 1, callback);});hasMove = true;} else if (this.data[x][y - 1] == this.data[x][y]) {//addlet block = this.blocks[x][y];let position = this.positions[x][y - 1];this.data[x][y - 1] *= 2;this.data[x][y] = 0;this.blocks[x][y] = null;this.blocks[x][y-1].getComponent('block').setNumber(this.data[x][y- 1]);this.doMove(block, position, () => {block.destroy();callback && callback()});hasMove = true;} else {callback && callback();return;}}let toMove = [];for (let i = 0; i < ROWS; ++i) {for (let j = 0; j < ROWS; ++j) {if (this.data[i][j] != 0) {toMove.push({ x: i, y: j })}}}let counter = 0;for (let i = 0; i < toMove.length; ++i) {move(toMove[i].x, toMove[i].y, () => {counter++;if (counter == toMove.length) {this.afterMove(hasMove);}});}},moveRight() {cc.log("right");let hasMove = false;let move = (x, y, callback) => {if (y == 3 || this.data[x][y] == 0) {callback && callback();return;} else if (this.data[x][y + 1] == 0) {//movelet block = this.blocks[x][y];let position = this.positions[x][y + 1];this.blocks[x][y + 1] = block;this.data[x][y + 1] = this.data[x][y];this.data[x][y] = 0;this.blocks[x][y] = null;this.doMove(block, position, () => {move(x, y+1, callback);});hasMove = true;} else if (this.data[x][y + 1] == this.data[x][y]) {//addlet block = this.blocks[x][y];let position = this.positions[x][y + 1];this.data[x][y + 1] *= 2;this.data[x][y] = 0;this.blocks[x][y] = null;this.blocks[x][y+1].getComponent('block').setNumber(this.data[x][y+1]);this.doMove(block, position, () => {block.destroy();callback && callback()});hasMove = true;} else {callback && callback();return;}}let toMove = [];for (let i = ROWS - 1; i >= 0; --i) {for (let j = 0; j < ROWS; ++j) {if (this.data[i][j] != 0) {toMove.push({ x: i, y: j })}}}let counter = 0;for (let i = 0; i < toMove.length; ++i) {move(toMove[i].x, toMove[i].y, () => {counter++;if (counter == toMove.length) {this.afterMove(hasMove);}});}},moveUp() {cc.log("up");let hasMove = false;let move = (x, y, callback) => {if (x == 3 || this.data[x][y] == 0) {callback && callback();return;} else if (this.data[x + 1][y] == 0) {//movelet block = this.blocks[x][y];let position = this.positions[x + 1][y];this.blocks[x + 1][y] = block;this.data[x + 1][y] = this.data[x][y];this.data[x][y] = 0;this.blocks[x][y] = null;this.doMove(block, position, () => {move(x, y + 1, callback);});hasMove = true;} else if (this.data[x + 1][y] == this.data[x][y]) {//addlet block = this.blocks[x][y];let position = this.positions[x + 1][y];this.data[x + 1][y] *= 2;this.data[x][y] = 0;this.blocks[x][y] = null;this.blocks[x+1][y].getComponent('block').setNumber(this.data[x+1][y]);this.doMove(block, position, () => {block.destroy();callback && callback()});hasMove = true;} else {callback && callback();return;}}let toMove = [];for (let i = 0; i < ROWS; ++i) {for (let j = ROWS - 1; j >= 0; --j) {if (this.data[i][j] != 0) {toMove.push({ x: i, y: j })}}}let counter = 0;for (let i = 0; i < toMove.length; ++i) {move(toMove[i].x, toMove[i].y, () => {counter++;if (counter == toMove.length) {this.afterMove(hasMove);}});}},moveDown() {cc.log("down");let hasMove = false;let move = (x, y, callback) => {if (x == 0 || this.data[x][y] == 0) {callback && callback();return;} else if (this.data[x - 1][y] == 0) {//movelet block = this.blocks[x][y];let position = this.positions[x - 1][y];this.blocks[x - 1][y] = block;this.data[x - 1][y] = this.data[x][y];this.data[x][y] = 0;this.blocks[x][y] = null;this.doMove(block, position, () => {move(x, y + 1, callback);});hasMove = true;} else if (this.data[x - 1][y] == this.data[x][y]) {//addlet block = this.blocks[x][y];let position = this.positions[x - 1][y];this.data[x - 1][y] *= 2;this.data[x][y] = 0;this.blocks[x][y] = null;this.blocks[x-1][y].getComponent('block').setNumber(this.data[x-1][y]);this.doMove(block, position, () => {block.destroy();callback && callback()});hasMove = true;} else {callback && callback();return;}}let toMove = [];for (let i = 0; i < ROWS; ++i) {for (let j = 0; j <ROWS; ++j) {if (this.data[i][j] != 0) {toMove.push({ x: i, y: j })}}}let counter = 0;for (let i = 0; i < toMove.length; ++i) {move(toMove[i].x, toMove[i].y, () => {counter++;if (counter == toMove.length) {this.afterMove(hasMove);}});}},// update (dt) {},
});
  • 那么到此,就完成了这个2048demo的基本操作(移动,合成等)如果你有兴趣那么可以在后续添加分数,死亡等游戏判定

使用CocosCreator完成2048小游戏demo相关推荐

  1. 一文梳理2048小游戏从开发到上云全流程

    摘要:本文主要以Cocos2d Web项目2048小游戏的开发上云为例,介绍DevOps开发实践的全流程 前言 本文主要以Cocos2d Web项目2048小游戏的开发上云为例,介绍DevOps开发实 ...

  2. ​.NET手撸2048小游戏

    前言 2048是一款益智小游戏,得益于其规则简单,又和 2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎" FlysEngine,从空白窗口 ...

  3. 2048小游戏js实现

    摘要 2048小游戏,采用原生js的dom操作,做的比较粗糙,目的是练习原生js的常用操作.游戏功能与界面均为他人设计,本demo具体代码实现由本人独立实现. 样式 demo功能: 常见的2048游戏 ...

  4. c#小游戏_.NET手撸2048小游戏

    前言 2048是一款益智小游戏,得益于其规则简单,又和 2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎" FlysEngine,从空白窗口 ...

  5. 微信小程序:2048小游戏

    实战 看了微信小程序的开发文档和熟悉了微信小程序的使用后,拿著名的2048小游戏练练手,做个DEMO玩玩. IDEA 界面抽象如下: [重新开始按钮] [模式选择] [用时(秒级)] [难度级别] 时 ...

  6. 0.用CocosCreator开发拼图小游戏——序言

    为什么第一行会默认字号比较大-(不好 暴露自己没用过这玩意的事实了 划掉划掉) 进入社会快2年了...还没被社会毒打(雾).在想写点什么东西,顺便整理下开发思路的前提下,这一篇流水账便开始了序幕(很可 ...

  7. python游戏代码五子棋_用20行Python代码实现2048小游戏,你会吗?

    前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...

  8. python秒表游戏代码_用20行Python代码实现2048小游戏,你会吗?

    前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...

  9. 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 猜猜它是什么?印着姓名.职位和邮箱,看起来是个名片.可是右下角有芯片,看起来又像是个PCB电路板. 其实它是一台超迷你的ARM计算机,不仅 ...

最新文章

  1. 如何利用 C# 实现神经网络的感知器模型?
  2. R语言使用coin包应用于分类变量独立性问题的置换检验(permutation tests)、使用普通卡方检验chisq.test函数和置换近似卡方检验chisq.test函数、检验分类变量的独立性
  3. exchange 2010备份及恢复
  4. 恭贺《构建高可用Linux服务器》荣获几项殊荣
  5. Java8 HashMap 扩容机制与线程安全分析
  6. Fedora 18 下安装 mplayer
  7. python 算术运算
  8. Objective-C模版方法(TemplateMethod)
  9. android shape.xml 属性详解
  10. linux的定cron计划任务命令
  11. onInterceptTouchEvent / onTouchEvent响应事件的详析
  12. php数组去重复数据的小例子
  13. 用SYS本地登录或远程登录引起ORA-01031错误
  14. @Resource和@Autowired小笔记
  15. 梯度,雅克比矩阵和海森矩阵
  16. 读《JOINT AND ADVERSARIAL TRAINING WITH ASR FOR EXPRESSIVE SPEECH SYNTHESIS》
  17. Vue 中使用高德地图api
  18. 计算机的键盘组合件,电脑组合键盘快捷键大全
  19. 通讯录版本1.0到3.0简易版
  20. 连接打印机提示:找不到驱动程序,windows在网络上找不到Canon LBP2900的驱动程序,若要手动查找,请单击“确定”。否则,请单击“取消”并咨询你的网络管理员或者访问打印机制造商的网站

热门文章

  1. 微信小程序生成海报可保存海报和分享海报
  2. Sqlserver将人名转换为拼音函数
  3. 修ITI.Transcendata.CADFIX.v11.SP1-ISO 1DVD
  4. 如何更改 think-cell 图表的默认颜色?使用教程
  5. Red Hat Enterprise Linux (RHEL) 8.5 发布(含下载)
  6. mac启动idea后显示“idea”意外退出
  7. 【论文阅读】Don‘t be so sure! Boosting ASR Decoding via Confidence Relaxation
  8. Windows 7中如何安装卸载IE11或重装IE10
  9. STC12系列单片机的空闲模式、休眠模式(又叫掉电模式、停机模式)
  10. 想要安装ZBrush!却不知道对电脑有什么特别的要求?