前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CreatorPrimer|物理小游戏(物理管理器组件)

CreatorPrimer|物理小游戏(物理管理器组件)

作者头像
张晓衡
发布于 2019-09-11 09:02:59
发布于 2019-09-11 09:02:59
94400
代码可运行
举报
运行总次数:0
代码可运行

源码地址:https://github.com/ShawnZhang2015/CreatorPrimer/tree/physics

前面两篇我们介绍了物理投篮小游戏的界面布局物理组件的基本使用方法,从今天开始进入编程篇的内容。难度在逐渐加深,为了不给大家造成阅读负担,程序篇会分成多次来讲,每篇教程尽量简单,就算没有编程基础,跟着源码、注释、讲解、视频,相信也能帮助大家快速上手Cocos Creator物理引擎。

1. 通用物理组件

在开始本篇时,Shawn已经将源码又重构了几次,重点依然是组件化思维:程序员以游戏设计师为服务对象,向他们提供易用的组件脚本,生产游戏内容。先来看一下Shawn提供5个物理组件脚本:

通用物理组件

使用这5个组件脚本,可以构建出非常有趣的物理小游戏,下面我们对这5个自定义组件做一个简单介绍:

  1. PhysicsManager:物理引擎管理器,使用它无需编程即可开启\关闭物理引擎,并提供刚体的着色调试开关。

物理引擎管理器

  1. PhysicsVelocity: 物理速度控制组件,提供了一个force函数方便使用cc.Button在编辑器中调用,为刚体施加外力。
  2. PhysicsColliderNotification: 物理碰撞通知组件,使用它可以让非物理组件或脚本能收到物理碰撞事件。
  3. ScoreNotificationHandle:得分通知处理组件,该组件监听PhysicsColliderNotification发出的事件通知,更新Label文本。
  4. ScoreVerifyNotificationHandle:带验证功能的得分通知处理组件,它可以监听PhysicsColliderNotification发出的事件,检查刚体碰撞过程中的方向(从上向下、从上向上、从左向右、从右向左),请看下图:

增强得分通知处理组件

我们的Demo就是由系统物理组件与这5个自定义这几个组件构成,其它没有任何代码,建议大家下载源码把玩把玩!

2. 物理引擎管理器

PhysicsManager组件是本篇教程的重点,我们看一下它的编辑器属性:

物理引擎管理器

此组件用于开启Cocos Creator的物理引擎,如果没有开启物理引擎,引擎提供的物理组件是不会生效的。通常开启物理引擎需要编写代码,这对非程序人员来说是一个不小的挑战,现在好了只要将此PhysicsManager组件放入你的工程,挂载到某个节点就好了。同时它还可以,设置物理刚体着色调试开关,使用非常方便,就算你不打算学习编程,也可以直接使用。

属性设计

接下来我们看看PhysicsManager组件的properties属性接口的编码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* PhysicsManager.js
*/ 
cc.Class({    
    extends: cc.Component,
   properties: {
      active: {
          default: true,
          tooltip: '是否启用物理引擎',
      },       
       aabb:{           
           default: true,
          tooltip: '是否显示包围盒',
      },       
       pair: {           
           default: true,
          tooltip: '我也没看出来是什么用:-('
      },       
       centerOfMass: {
          default: true,
          tooltip: '是否显示中心点'
      },       
       joint: {
          default: true,
          tooltip: '是否显示关节连接线'
      },       
       shape: {           
           default: true,
          tooltip: '是否填充形状'
      },       
       mouseJoint: {           
           default: false,
          tooltip: '是否开启鼠标关节,可以拖动动态刚体'
      }
   },
   ...
}

从上面代码可以看到,为每个组件属性的tooltip设置了文本,方便设计人员从编辑器上了解组件属性的功能含义:

tooltip

PhysicsManager组件属性完全不依赖外部节点、组件、资源,是一个非常干净的组件,符合我们功能型通用组件的设计标准(哈哈,自我吹嘘!)。

开启物理引擎

定义好接口,我们看如何实现物理引擎的开启和关闭,以及active属性是如何起作用的,请看下面代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* PhysicsManager.js
*/ 
cc.Class({    
    extends: cc.Component,    
    properties: {
       ...
   },
    
    /**
   *组件激活
   **/
   onEnable() {        
        //从导演对象上获取引擎物理管理器 
       let physicsManager = cc.director.getPhysicsManager();        
        //如果物理引擎重复开启,给出一个警告提示
       if (physicsManager.enabled && this.active) {
           cc.warn('The physical system is enabled!');
       }        
        //开启或关闭物理系统
       physicsManager.enabled = this.active;        
        //如果是关闭物理引擎,退出
       if (!this.active) {            
            return;
       }        
       //调试选项
       ...
   },
 
    /**
   *组件禁用
   **/
   onDisable() {        
        //组件失效时关闭物理引擎
       cc.director.getPhysicsManager().enabled = false;
   }
});

上面代码中核心关键是在onEnable事件中通过cc.director.getPhysicsManager()获取PhysicsManager对象,控制物理引擎的开启和关闭。注意,物理引擎在整个游戏中只需要开启一次就可以了,如果你挂载了多次PhysicsManager组件并重复开启物理引擎,运行时会收到一个警告哦!

物理调试开关

6个物理刚体调试开关

PhysicsManager组件提供了6个调试开关,方便观察刚体的物理表现,在开发过程中特别有用。我们再看一下实现这些功能的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* PhysicsManager.js
*/ 
cc.Class({    
    extends: cc.Component,    
    properties: {
      ....
   },   onEnable() {
       ....        
        //设置调试标志
       let DrawBits = cc.PhysicsManager.DrawBits;
        if (CC_PREVIEW) {
           ‍physicsManager.debugDrawFlags =
               (this.aabb && DrawBits.e_aabbBit) |
               (this.pair && DrawBits.e_pairBit) |
               (this.centerOfMass && DrawBits.e_centerOfMassBit) |
               (this.joint && DrawBits.e_jointBit) |
               (this.shape && DrawBits.e_shapeBit);}
       ...  
   },
  ...
});

cc.PhysicsManager.DrawBits是引擎定义的一个枚举类型,通过设置physicsManager对象的debugDrawFlags属性来开启绘制刚体调试开关,方便看到刚体外形是否与节点渲染出的外形相匹配。请看下图,你就能明白这些刚体调试开关的作用了:

其中joint开关需要在Joint类型的物理组件上才能看到,当你开启了Mouse Joint属性时,快速拖动动态刚体也能看到一关节连接线。

物理调试开关中还有一个e_pairBit开关,Shawn也没观察出它有什么作用,如果你知道希望能告诉我,非常感谢!

动态刚体自由拖拽

MouseJoint是物理引擎关节组件中的一个,使用MouseJoint组件可以方便在开发中任意拖拽刚体,在开发期间方便测试,我们看一下具体代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* 物理引擎管理组件,开启各种调试
*/
cc.Class({    
     extends: cc.Component,    
     properties: {
        ...
        mouseJoint: {           
             default: false,           
             tooltip: '是否开启鼠标关节,可以拖动动态刚体'
        }
   },   onEnable() {
       ...
       this._setMouseJoint();    
   },   _setMouseJoint() {        
        //鼠标可拖刚体
       if(this.mouseJoint && this.active) {            
            let node = this.node;            
            //获取节点上的刚体组件
           let rigidBody = node.getComponent(cc.RigidBody);            
            //不存在添加一个
           if (!rigidBody) {
               rigidBody = node.addComponent(cc.RigidBody);
           }            
            //获取组件上的鼠标关节组件
           let mouseJoint = node.getComponent(cc.MouseJoint);            
            //不存在添加一个
           if (!mouseJoint) {
               mouseJoint = node.addComponent(cc.MouseJoint);
           }            
            //设置为静态刚体
           rigidBody.type = cc.RigidBodyType.Static;            
            //设置鼠标范围
           mouseJoint.mouseRegion = node;
       }
   },
   ...
});

_setMouseJoint函数是动态为当前节点添加物理刚体(cc.RigidBody)和鼠标关节(cc.MouseJoint)。同时设置当前节点为静态刚体,设置鼠标控制范围为当前节点范围。因此PhysicsManager组件适合放在根节点上或父类节点上,管理它下面的子孙节点。

上面讲了这么多,使用时只需要将PhysicsManager组件挂载到Canvas节点上,设置需要的调试开关即可,运行在非预览环境时,调试开关不会起作用。

3. 小结

本篇介绍了物理投篮Demo游戏中使用到的自定义组件,重点讲解了PhysicsManager组件的实现细节,有了它任何人都可以启动Cocos Creator的物理引擎,你可以把它放到自己的项目中使用,可以根据自己的需求进行修改调整。

最后预告下次的教程内容,继续我们的物理小游戏程序篇-物理碰撞监听,同时还会介绍Cocos Creator的事件机制的运用:组件间通信,敬请期待!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Creator星球游戏开发社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​Cocos Creator入门实战:桌球小游戏
在开始桌球小游戏之前,我们需要对creator有一定了解以及熟悉,对js语法有一定的了解。在开始同样还是希望大家能够仔细的阅读一遍官方文档,以便理解。
张晓衡
2019/09/11
2.6K0
​Cocos Creator入门实战:桌球小游戏
【中英双语教程】桌球小游戏(1)
桌球小游戏是 BigBear 老师设计、撰写的中英双语的 Cocos Creator 入门教程,面向 Cocos Creator 初学者,但不论你技术如何,相信你会在 BigBear 老师的文章中有所收获。
张晓衡
2019/09/11
9040
【中英双语教程】桌球小游戏(1)
CreatorPrimer|物理小游戏(碰撞监听)
继续物理小游戏,我们先回顾一下CreatorPrimer仓库中提供的五个组件脚本:
张晓衡
2019/09/11
7020
CreatorPrimer|物理小游戏(碰撞监听)
CreatorPrimer(17)|物理小游戏(物理组件)
本视频的工程已经上传github,CreatroPrimer仓库physics分支,传送地址:https://github.com/ShawnZhang2015/CreatorPrimer/tree/physics
张晓衡
2019/09/11
1.1K0
CreatorPrimer(17)|物理小游戏(物理组件)
研究一下物理引擎,做了个游戏,文末有感
前阵子过春节,在家看小孩没法出去玩,于是就码起来了,心血来潮想做个基于物理引擎的小游戏,于是愉快地打开了cocos creator(后面简称为ccc)。
花叔
2019/03/12
2K1
研究一下物理引擎,做了个游戏,文末有感
CreatorPrimer(16)|物理小游戏(开篇)
我们前面讲了组件化开发的一些思路以及Cocos Creator的最佳工作流。但真正要做到界面与逻辑分离,开发人员与设计师高效协作,并不是一朝一夕之事,Shawn会在这条道路上继续前行,也希望大家能多多支持,关注「奎特尔星球」公众号。
张晓衡
2019/09/11
5170
CreatorPrimer(16)|物理小游戏(开篇)
CreatorPrimer|飞机大战(一)
前两天在Cocos官方公众号上学习了「大掌教」的Cocos Creator 2.x Camera教程,总算是对摄像机组件有了一个初步的认识,乘热打铁Shawn用Camera摄像机练习了一个飞机大战游戏,目前主要实现3个功能:
张晓衡
2019/09/11
1.4K0
CreatorPrimer|飞机大战(一)
从0开始实现一个合成大西瓜
作者:橙红年代 (https://juejin.cn/post/6923803717808422925)
落落落洛克
2021/03/08
1.1K0
从0开始实现一个合成大西瓜
前端er开发cocos小游戏快速入门
前段时间一直在更 vue2的源码系列,最近换了换口味,学了一下 cocos ,照猫画虎的写了一个「挑战1024」小游戏。
windliang
2022/12/21
1.1K0
前端er开发cocos小游戏快速入门
手把手教你起步Creator3D横版酷跑游戏
两个平台一个跳跃方块,靠这些就可以做横版3D跑酷了哟!下面介绍游戏的具体的制作过程,而且还带工程源码哦!
张晓衡
2019/09/11
9220
手把手教你起步Creator3D横版酷跑游戏
CocosCreator一步一步实现重力球游戏
通过手机陀螺仪,调整手机,让球从上一层的间隔中落到下一层,楼层会不断上涨,如果球碰到上方或者下方的火焰,游戏结束。
一枚小工
2020/03/02
1.6K0
CreatorPrimer|飞机大战(三)
《飞机大战(一)》介绍摄像机实现地图的滚动和子弹组件的设计;在此基础上《飞机大战(二)》增加了子弹的角度直线发射以及动态角度更新能力,用于实现如:散弹、螺旋扫射等华丽的子弹表现。
张晓衡
2019/09/11
1.1K0
CreatorPrimer|飞机大战(三)
Cocos Creator之组件的生命周期
用户只要定义特定的回调函数,Creator 就会在特定的时期自动执行相关脚本,用户不需要手工调用它们。
李小白是一只喵
2021/04/28
1.3K0
Cocos Creator之组件的生命周期
CreatorPrimer|编写一个版本号组件
在集合类游戏中,不论是大厅还是子游戏都会涉及到版本的更新,在开发调试阶段,检查更新是否生效的一个直观的方法就是观察版本号的变化,因此版本号的显示是游戏中不可缺少的细节,特别是集合类游戏。
张晓衡
2019/09/11
7270
CreatorPrimer|编写一个版本号组件
CreatorPrimer|触摸事件冒泡
前两天正在愁公众号写点什么,打开微信看到uikiller用户「悦雨」遇到了一个问题:
张晓衡
2019/09/11
1.4K0
CreatorPrimer|触摸事件冒泡
CreatorPrimer|预制件嵌套
预制件嵌套可以将复杂UI界面模块化,让每一个界面模块可以独立运行,也可以组合使用,开篇之前先看个视频演示:
张晓衡
2019/09/11
6070
CreatorPrimer|预制件嵌套
Cocos Creator 源码解读:引擎启动与主循环
而在主循环的内容中还会涉及到:组件的生命周期和计时器、缓动系统、动画系统和物理系统等...
陈皮皮
2020/11/05
3.6K0
【干货】Cocos Creator制作一个微信小游戏(下)
| 导语 微信小游戏都火成这样了,为什么不尝试一下? 我们的目标是使用Cocos Creator从零开始制作一个小游戏,并放到微信上玩。 上文链接:Cocos Creator制作一个微信小游戏(上) 四、游戏逻辑 开始游戏菜单逻辑 在Script文件夹上右键-新建-JavaScript,创建一个名字为Menu的代码文件。 双击一下资源管理器中的Menu场景,再在层级管理器中单击一下Canvas节点,显示节点的属性检查器,然后把Script目录中的Menu代码文件搬去到属性检查器中,以实现代码和场景的绑定。
腾讯NEXT学位
2018/12/04
6K2
【干货】Cocos Creator制作一个微信小游戏(下)
微信小游戏案例三 抓星星
万少
2025/02/11
1360
微信小游戏案例三 抓星星
LayaAirIDE的可视化2D物理使用文档
今天,又摘了一篇官网的文档,献给对2D物理还未入门或刚刚上手的开发者,已经熟悉的朋友们欢迎转发到微信朋友圈,让有需要的开发者看到。
Layabox Charley
2021/01/12
2.5K0
LayaAirIDE的可视化2D物理使用文档
相关推荐
​Cocos Creator入门实战:桌球小游戏
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档