KUOKUO又上一款开源游戏+教程,绝对经典(附 Github 地址)

Stella981
• 阅读 372

游戏演示

KUOKUO又上一款开源游戏+教程,绝对经典(附 Github 地址) KUOKUO又上一款开源游戏+教程,绝对经典(附 Github 地址)

一个月前就想做了,结果先鸽了半个月,16 天前完成 demo,后来又加入了方块数据编辑场景。再后面几天做了一些修改,加了一些注释,今天才做了出来,大家千万不要学我,要克服懒惰 O(∩_∩)O~

KUOKUO又上一款开源游戏+教程,绝对经典(附 Github 地址)

关系图

首先我们看下脚本的关系图:

KUOKUO又上一款开源游戏+教程,绝对经典(附 Github 地址) KUOKUO又上一款开源游戏+教程,绝对经典(附 Github 地址)

写些枚举

枚举的好处不再多说,我们先理一理俄罗斯方块这个游戏都需要些什么枚举。第一个是游戏中方块渲染,在 12 * 7 的格子中,每个格子应该有八种状态,或者说是不渲染与七种颜色;第二个是触摸事件,我们手指上下左右操作对应的事件名称;第三个就是各种音效对应的枚举;最后一个,是我为了方便使用 cc.find 找到节点的路径写的枚举。

enum.ts

  1. /** 不渲染与7个颜色 */

  2. export enum ItemColor {

  3. NULL = 0,

  4. Color1,

  5. Color2,

  6. Color3,

  7. Color4,

  8. Color5,

  9. Color6,

  10. Color7,

  11. }

  12. /** 触摸事件-上下左右滑动 */

  13. export enum TouchEvent {

  14. UP = 'touch-up',

  15. DOWN = 'touch-down',

  16. LEFT = 'touch-left',

  17. RIGHT = 'touch-right'

  18. }

  19. /** 音效事件 */

  20. export enum MusicEvent {

  21. BGM = 'bgm',

  22. ACTION = 'action',

  23. GAME_OVER = 'over',

  24. /** 方块消除 */

  25. ELIMINATE = 'eliminate'

  26. }

  27. /** 节点路径 */

  28. export enum NodeUrl {

  29. Canvas = 'Canvas',

  30. Music = 'Music'

  31. }

render渲染模块

游戏主场景是 12 * 7 方格,这个渲染模块就是通过一个 12 * 7 的数据数组对应,进行渲染。首先,将 12 * 7 个方格里面铺满带图片的节点(预制体 item 就是带有精灵组件的一个节点,config 中存着一些常量):

  1. init () {

  2. const height = config.row * config.blockHeight

  3. const width = config.col * config.blockWidth

  4. // 初始化所有节点

  5. for (let i = 0; i < config.row; i++) {

  6. this.itemArray[i] = []

  7. for (let j = 0; j < config.col; j++) {

  8. const x = -width / 2 + config.blockWidth / 2 + j * config.blockWidth

  9. const y = height / 2 - config.blockHeight / 2 - i * config.blockHeight

  10. const item = this.createItem(x, y)

  11. this.itemArray[i][j] = item

  12. }

  13. }

  14. }

  15. createItem (x: number, y: number): cc.Node {

  16. let item = cc.instantiate(this.item)

  17. this.node.addChild(item)

  18. item.setPosition(x, y)

  19. item.setContentSize(config.itemWidth, config.itemHeight)

  20. return item

  21. }

KUOKUO又上一款开源游戏+教程,绝对经典(附 Github 地址)

render.ts 中的渲染函数,根据传入数据进行图片替换,不渲染时数组越界为 undefined,取消掉纹理:

  1. /** 根据传入二维数组进行渲染 */

  2. render (dataArray: ItemColor[][]) {

  3. for (let i = 0; i < config.row; i++) {

  4. for (let j = 0; j < config.col; j++) {

  5. const color = dataArray[i][j]

  6. // 拖入图片的下标是 0-6,颜色枚举对应 1-7

  7. this.itemArray[i][j].getComponent(cc.Sprite).spriteFrame = this.itemSpriteFrames[color - 1]

  8. }

  9. }

  10. }

这样渲染模块的 render 函数只接受一个二维数组数据,主逻辑那边只操作数据,最后调用下 render 即可!看下 render.ts 整体:

  1. import { config } from "./config"

  2. import { ItemColor } from "./enum"

  3. const {ccclass, property} = cc._decorator

  4. @ccclass

  5. export default class Render extends cc.Component {

  6. @property(cc.Prefab)

  7. item: cc.Prefab = undefined

  8. @property([cc.SpriteFrame])

  9. itemSpriteFrames: cc.SpriteFrame[] = []

  10. /** 游戏层上应该铺满节点,然后根据数据渲染 */

  11. itemArray: cc.Node[][] = []

  12. onLoad () {

  13. this.init()

  14. }

  15. init () {

  16. const height = config.row * config.blockHeight

  17. const width = config.col * config.blockWidth

  18. // 初始化所有节点

  19. for (let i = 0; i < config.row; i++) {

  20. this.itemArray[i] = []

  21. for (let j = 0; j < config.col; j++) {

  22. const x = -width / 2 + config.blockWidth / 2 + j * config.blockWidth

  23. const y = height / 2 - config.blockHeight / 2 - i * config.blockHeight

  24. const item = this.createItem(x, y)

  25. this.itemArray[i][j] = item

  26. }

  27. }

  28. }

  29. /** 根据传入二维数组进行渲染 */

  30. render (dataArray: ItemColor[][]) {

  31. for (let i = 0; i < config.row; i++) {

  32. for (let j = 0; j < config.col; j++) {

  33. const color = dataArray[i][j]

  34. // 拖入图片 0-6,颜色枚举 1-7

  35. this.itemArray[i][j].getComponent(cc.Sprite).spriteFrame = this.itemSpriteFrames[color - 1]

  36. }

  37. }

  38. }

  39. createItem (x: number, y: number): cc.Node {

  40. let item = cc.instantiate(this.item)

  41. this.node.addChild(item)

  42. item.setPosition(x, y)

  43. item.setContentSize(config.itemWidth, config.itemHeight)

  44. return item

  45. }

  46. }

逻辑数据处理

方块的数据我是这样规定的:

KUOKUO又上一款开源游戏+教程,绝对经典(附 Github 地址)

绿色那里代表(0,0)位置,这样有相对位置,方便处理数据,我就这样定义了当前方块的数据结构:

  1. /** 当前形状 */

  2. currentShape: CurrentShapeData = {

  3. center: cc.v2(0, 0),

  4. index: 0,

  5. color: ItemColor.NULL

  6. }

身为程序员(懒人),必然得方便自己搞个编辑数据的场景(举例:7形状的数据就是上面图片表格对应的一个数组)

KUOKUO又上一款开源游戏+教程,绝对经典(附 Github 地址)

我们在 main 主脚本维护一个二维数组数据:

  1. /** 二维数组 */

  2. dataArray: ItemColor[][] = []

这样比如我们新添加一个形状到游戏里,只要先获取这个数组[cc.v2(-1, -1), cc.v2(-1, 0), cc.v2(0, 0), cc.v2(1, 0)],然后遍历一次添加到 dataArray 最后走一次 render,方块就出来了:

  1. /** 根据当前中心点和形状类型加入数据 */

  2. setCurrentData (currentShape: CurrentShapeData) {

  3. const { center, color, index } = currentShape

  4. const shape = `shape${color}`

  5. const shapeData: cc.Vec2[][] = config[shape]

  6. shapeData[index].forEach(ele => {

  7. const row = center.x + ele.x

  8. const col = center.y + ele.y

  9. this.dataArray[row][col] = color

  10. })

  11. // 刷新视图

  12. this.render()

  13. }

好了,剩下的逻辑大家去 GitHub 上下载一波看一看吧,注释还是蛮多的!

结语

源码已经开源,喜欢的记得给点个 Star!

开源地址(阅读源文):https://github.com/KuoKuo666/CocosCreator-Tetris

KUOKUO又上一款开源游戏+教程,绝对经典(附 Github 地址)

欢迎加我微信,我们一起成长!

本文分享自微信公众号 - Creator星球游戏开发社区(creator-star)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
2年前
Postman 使用方法详细介绍
1,下载安装:https://www.getpostman.com/apps2,打开Postman,如图所示:!(https://oscimg.oschina.net/oscnet/00f434cd831f2f74fea6f6d7b86bc46a751.png)3,创建一个接口项目!(https://oscimg.oschina.
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这