使用cocos creator制作小游戏总结

要点

  • UI界面重构:可以把设计稿作为最底层节点,逐步把节点对齐设计稿,这样可以免计算节点位置。
  • 使用 VS Code 激活脚本编译(快捷键ctrl+p):配置地址
  • 少使用active属性,使用其会触发递归遍历场景,开销较大,可以通过设置opacityscale,或者修改位移达到隐藏和显示的效果
  • Label文字组件添加描边:LabelOutline组件
  • 对象浅拷贝与深拷贝:
浅拷贝:
var obj1 = {name:'lily',age:12}
var obj2 = obj1
obj2.age = 13 //obj1,obj2的age都变成13

深拷贝:
function copy(obj){
    var newObj = {}
    for(var attr in obj){
        newObj[attr] = obj[attr]
    }
    return newObj
}
var obj1 = {name:'lily',age:12}
var obj2 = copy(obj1)
obj2.age = 13
  • loading的制作:
1.将`cc.Sprite`组件的`type`属性改成`FILLED`
横向loading:
fillType: HORIZONTAL
fillStart:0  //从左边开始
fillRange:0  //填充的百分比,0~1
扇形loading:
fillType: RIDICAL //扇形
fillCenter:(0.5,0.5)//中心点开始
fillStart:0.25  //最上边
fillRange:0   //填充的百分比,负为顺时针,正为逆时针
扇形讲解图:
            ^y
        0.25|              
  0.375 ----|---0.125
        |   |   |
  0.5---|---|---|0----->x
        |   |   |       
   0.625----|---0.875
           0.75
2.通过脚本修改`fillRange`属性即可
cc.loader.onProgress = (completedCount, totalCount, item) => {
   const progress = (completedCount / totalCount).toFixed(2)
   // 顺时针
   this.loading.getComponent('cc.Sprite').fillRange = -progress
   }
 }
  • 锚点anchor:左下角是(0,0),右上角是(1,1)

  • 当在对战游戏中出现各种动画时,譬如:2s后根据对方或者自己开始某个动画,倘若一开始回合属于对手,该动画不应该在自己回合出现。但在2s的时间内对手已经完成自己的回合,此时回合到自己,这时2s后这个动画就认为一开始是自己的回合,导致动画执行错误,此时,需要添加一些判断条件,是否开始了一回合,以防止在某段时间内参数改变导致动画出错。

  • 随着新场景的切换,内存占用就会不断上升。除了使用 cc.loader.release等API来精确释放不使用的资源,我们还可以使用场景的自动释放功能,在场景属性管理器中设置自动释放资源选项。

  • 判断是在小游戏内还是app的webview内:cc.sys.isBrowser

  • 谷歌浏览器跨域调试:要完全退出chrome浏览器后,新建一个目录用来存放谷歌调试文件,在终端输入命令:
    open -n /Applications/Google\ Chrome.app/ --args --disable-web-security --user-data-dir=/Users/${你的用户名}/${新建的目录路径及名称}

    跨域调试成功标识

  • 对于打包web以及其他平台后,修改页面loading时出现的cocos creator官方的loading样式,修改该样式的方法(mac中,windows原理一样):
1.右键点击cocos creator软件选择“打开包内容”
2.去到文件路径路径:Contents/Resources/static/build-templates/shares/下修改style-mobile.css对应样式
  • 新建资源和删除资源要从cocos creator中进行操作,不要在vs code编辑器中操作,因为在vs code中操作删除只是删除了一个文件,没有把相应的.meta文件删掉。

  • 碰撞检测
    a.在编辑器中添加Collider,根据物体形状进行选择,使用矩形,圆形还是多边形碰撞
    b.在 项目-项目设置-分组管理 中添加分组,然后勾选会进行碰撞的组,例如 灯 和 人,然后在编辑器中的Node中的Group中选择相对应的碰撞分组
    c.给碰撞对象绑定组件,并在组件中添加碰撞检测代码,并做相应碰撞效果处理:

onCollisionEnter (other, self) {
   console.log('on collision enter')
   },
onCollisionStay (other, self) {
  console.log('on collision stay')
},
onCollisionExit (other, self) {
   console.log('on collision exit')
  }

d.并开启碰撞检测:

this.manager = cc.director.getCollisionManager()
// 开启碰撞检测
this.manager.enabled = true
// 开启碰撞边缘绘制调试
manager.enabledDebugDraw = true
// 开启包围盒绘制调试
manager.enabledDrawBoundingBox = true

e.如果需要去掉相同预制节点中不需要进行碰撞检测的节点,可以指定节点关闭

node.getComponent(cc.CircleCollider).enabled = false
  • 两人赛跑之间的位移差视觉处理:对不同物体选择不同的参照物
    a.当我停止对手在跑的时候,我与背景相对静止状态,对手向前跑
    b.当我跑的并且对手也在跑的时候,我和对手相对静止
    c.当我跑,对手停止的时候,对手和背景相对静止

难点

  • 几个场景公用一条websocket连接:建立ws模块,在游戏逻辑模块进行托管处理
// ws模块:
const WS = {
  ws: null,
  wsUrl: null
  },
  _setWsCloseFunc: function () {},
  _setOpenFunc: function () {},
  _setMessageFunc: function () {}
}
// 连接websocket
WS._createWebSocket = function (url) {
  try {
    this.ws = new WebSocket(url)
    this._initEventHandle()
  }
  catch (e) {
    console.log('catch', e)
  }
}

// websocket事件
WS._initEventHandle = function () {
  this.ws.onclose = () => {
    this._setWsCloseFunc()
  }
  this.ws.onerror = (err) => {
  }
  this.ws.onopen = () => {
    this._setOpenFunc()
  }
  this.ws.onmessage = (event) => {
    this._setMessageFunc()
  }
}
module.exports = WS

// 游戏逻辑模块
import WS from './ws'
cc.Class({
  extends: cc.Component,
  properties: {
  },
  onLoad () {
  },
  start () {
    WS._setOpenFunc = this._setOpenFunc.bind(this)
    WS._setMessageFunc = this._setMessageFunc.bind(this)
    WS._setWsCloseFunc = this._setWsCloseFunc.bind(this)
  },
  // onclose
  _setWsCloseFunc () {
  },
  // onopen
  _setOpenFunc () {
  },
  // onmessage
  _setMessageFunc () {
  },

})

  • 弹窗事件穿透:对遮罩层添加默认事件
node.on(cc.Node.EventType.TOUCH_START, () => { })
  • ios web中不能自动播放音频(浏览器的限制策略),必须手动触发事件播放,解决此问题,在微信中,需要用WeixinJSBridge:
    WeixinJSBridge.invoke('getNetworkType', {}, (e)=> {这里执行播放音乐});

  • creator中开启音乐的时候默认场景间会共享这个音乐,如果需要跨场景关闭音乐,可全局保存一个audioId,用来关闭

  • 解决多次点击动画显示问题:例如:动物弹起和坐下是两个位置变化的动画,弹起显示可移动方向箭头,如果多次点击,可能会造成动画错乱现象,可以定义好在某个动作在进行时,stop其他动画。

  • 对于棋盘类游戏,一般分别定义一个二维数组存储棋盘信息,一个二维数组保存棋盘UI信息,通过更新二维数组信息,以更新界面UI

  • iphoneX以及高屏适配问题:在设计分辨率使用FIT HEIGHT模式的前提下,采用整体缩放根节点的方式适配:(设计分辨率在720*1280前提下,在各种设备下,高始终是1280,宽度小于720时缩放canvas)

this.windowRatio = this.node.width / 720
if (this.node.width < 720) {
  this.node.scale = this.windowRatio
}
  • h5压后台游戏停止导致时间停滞问题:
    a.在自己回合的时候压后台,利用setTimeout递归控制时间,每一秒进行时间设置的时候都记录两个时间戳,对这两个时间戳进行相减,如果为1,则时间正确,否则用realTime=timer - timeStamp
...
this._controlTime(turn, timer)
...
_controlTime (turn, timer) {
    timer--
    const timeStamp1 = Date.parse(new Date()) / 1000
    setTimeout(() => {
        const timeStamp2 = Date.parse(new Date()) / 1000
        const timeStamp = parseInt(timeStamp2 - timeStamp1)
        let realTime = 0
        if (timeStamp === 1) {
          realTime = timer
        }
        else {
          realTime = timer - timeStamp
        }
        console.log(timeStamp, realTime)
        this._controlTime(turn, realTime)
    }, 1000)
}

b.在对方回合压后台,一开始记录连接ws的时候用后台的时间戳与本地时间戳做一个校准,表示服务器与客户端相差多少时间deltaTimer,在每个回合变换时间的时候,用后台的时间戳与本地时间戳和矫正时间戳做比较,设置正确的timer。

timer = serviceTimer - localTimer - deltaTimer
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 01 每天晚上你能拿出一小时陪孩子吗?大概很多和孩子住在一起的父母会很肯定地说:当然能啦,还不止一小时咧。 和大家...
    小海狸妈妈阅读 554评论 1 0
  • 权杖皇后 正位 早上抽到牌的时候感觉皇后表情有些迟疑、底气不足、过度担忧和退缩,跟我今天的状态完全一致。公开课虽然...
    小小笨鸟可爱多阅读 243评论 0 0
  • 她淡淡地说:“我不爱你了,我走了。” 从此再没有回来过。 再没有回过他们一同奋斗得来的小屋, 再没有回过他们一起居...
    木兆木子不言阅读 458评论 1 0