creator物理引擎 /RPG运动类型 /坦克

1 applyForce/ToCenter(). 这个力怎么计算 (牛顿第二定律F=ma)
2 .linearVelocity()是像素/米 (看源码)
3 why到第四帧才有速度

CocosCreator官方文档物理引擎Demo(physics-example,下载链接:https://github.com/2youyou2/physics-example)

---------------------------汤姆猫水上乐园坑:
1 长方形是保卫盒==AABB框
2 无法通过动画修改刚体位置,如何移动刚体? / 台球杆提示条 / 提示条动画播指定帧
3 有问题需求证。新建个Demo就是。 如:何刚体能否穿过别的刚体

7 碰撞后刚体如何设置静止? 可以删除原来的,重新创建一个
8 碰撞回调里不能修改属性位置/旋转. Or报错:Assertion failed! Pls debug.
是因为: 锁定了(world.IsLocked()),需要在时间步Step后去操作 解决:update里判断为true的时候改变位置
---------------------切水果
1 MotionStreak(拖尾)/RichText(富文本 新浪微博功能) 组件 + 插件脚本
2 从对象池创建对象,施加力/冲量时要先清空/重置之前速度。 bug:问3程序
3 切水果:可以only一小部分用Box2d
4 精灵绕中心轴旋转? /LabelOutline(字体描边)组建

5 Scroview问题:1content中item尺寸为(0,0)导致显示部分Ui 2LayOut的ResizeMode属性==1显示部分UI
6 XX.getComponent(cc.PhysicsCircleCollider).offset = cc.v2(_x, _y); // bug: offset要在addchild渲染前调,才生效
7 setTimeout/pomelo.on/wx.onShow()…切换场景后一样会调用
8 子域报错:XXXundefined js声明提前 (self = this 函数内会修改this)
------------------------微信打包
1 运行wx.is not defined ? 答案:判断下平台if /官方文档:旋转缩放信息
2 打包到微信平台时 Box2d相关的接口提示都招不到? —设置->模块
3 包体过大? 答案: 将“设置->模块”中无用的去掉减少2Mb多
----------------------后期:
1 刚体无法运动, 因为:applyForec/Impluse时间太短 在update就ok
2 cocos实现翻牌: 动作 反面牌(1,1)->(0,0.9) 正面牌(0, 0.9)->(1,1)
3 creator拼UI–logic混乱: 金币+红包2个并行节点+总结node / 放入效果图 ***
4 微信请求openID失败,困扰3月。把htpp请求的URL手动拼接,问题没有 ?&格式错误


官网文档是如此介绍applyForceToCenter(),

applyForceToCenter

施加一个力到刚体上的质心上。
meta
description
定义于
https:/github.com/cocos-creator/engine/blob/master/cocos2d/core/physics/CCRigidBody.js:683
参数列表

force Vec2 the world force vector.
wake Boolean also wake up the body.

咋看,第一个参数force传的是一个力的向量,如cc.v2(0, 100),就是施加了一个竖直向上100牛顿的力。

翻到applyForceToCenter()的源码
/**

  • !#en
  • Apply a force to the center of mass.
  • !#zh
  • 施加一个力到刚体上的质心上。
  • @method applyForceToCenter
  • @param {Vec2} force - the world force vector.
  • @param {Boolean} wake - also wake up the body.
    */
    applyForceToCenter: function (force, wake) {
    if (this._b2Body) {
    tempb2Vec21.Set(force.x/PTM_RATIO, force.y/PTM_RATIO);
    this._b2Body.ApplyForceToCenter(tempb2Vec21, wake);
    }
    },

tempb2Vec21.Set(force.x/PTM_RATIO, force.y/PTM_RATIO);
这行代码中"force.x/PTM_RATIO" , 除以PTM_RATIO,而PTM_RATIO的值为32。

http://docs.cocos.com/creator/manual/zh/physics/physics/physics-manager.html

打开上面的链接,里面有介绍。
物理单位到像素单位的转换 :
box2d 使用 米-千克-秒(MDS) 单位制,box2d 在这样的单位制下运算的表现是最佳的。 但是我们在 2D 游戏运算中一般使用 像素 来作为长度单位制,所以我们需要一个比率来进行物理单位到像素单位上的相互转换。 一般情况下我们把这个比率设置为 32,这个值可以通过 cc.PhysicsManager.PTM_RATIO 获取,并且这个值是只读的。 通常用户是不需要关心这个值的,物理系统内部会自动对物理单位与像素单位进行转换,用户访问和设置的都是进行 2d 游戏开发中所熟悉的像素单位。
设置物理重力
重力是物理表现中非常重要的一点,大部分物理游戏都会使用到重力这一物理特性。 默认的重力加速度是 (0, -320) 像素/秒^2,按照上面描述的转换规则,即 (0, -10) 米/秒^2。

    由此可见,像素单位转换为物理单位,是除以PTM_RATIO的;而物理单位转换为像素单位,是乘以PTM_RATIO的。
    Box2D 中的坐标系统的单位是米(m)

    因此,applyForceToCenter()方法的第一个参数的力是以" 像素/秒^2"为单位算出来胡.

http://alexq.farbox.com/post/box2d-ru-men-jian-yao
这篇文章中,有讲到:

重力,简单的讲,就是使物体自然下落的力,Box2D 用 Vector2 向量类来模拟作用力。Vector2 是 “Box2D Vector2D”的缩写,表示二维空间中的一个向量,Vector2 类的构造函数中只有 x 和 y 两个
参数,分别表示 x 轴和 y 轴方向上的分量。

new Vector2(x, y)
对于C++,重力方向参考如下:
creator物理引擎 /RPG运动类型 /坦克_第1张图片

因为重力是垂直向下的,在水平方向没有任何力,所以 x 设置为 0,这个不难理解。至于y的参数值-9.8,实际上,这里的y指的是重力加速度,我们读高中时都学过,在没有任何阻力影响的情况, 理论的重力加速度是 9.8m/s2(米每平方秒)。 Box2D 中的坐标系统的单位是米(m) 这点很重要 这点很重要 这点很重要

重力是物理表现中非常重要的一点,大部分物理游戏都会使用到重力这一物理特性。 默认的重力加速度是 (0, -320) 像素/秒^2,按照物理单位和像素单位的转换规则,即 (0, -10) 米/秒^2。
creator物理引擎 /RPG运动类型 /坦克_第2张图片

onLoad () {
var physicsManager = cc.director.getPhysicsManager();
physicsManager.enabled = true;
physicsManager.enabledAccumulator = true;
this.gravity = physicsManager.gravity;
cc.log(“gravity(%f, %f)”, this.gravity.x, this.gravity.y);
cc.director.getCollisionManager().enabled = true;
this.enablePhysicsDebugDraw();

this.rigidbody = this.node.getComponent(cc.RigidBody);

},

start () {
var m = this.rigidbody.getMass();
var a = cc.v2(this.gravity.x, Math.abs(this.gravity.y)*10);
var force = a.mul(m);
this.rigidbody.applyForceToCenter(force, true);

cc.log("a(%f, %f) (%f, %f)", a.x, a.y, a.x/32, a.y/32);
cc.log("stone mass = %f", m);

cc.log("force(%f, %f)", force.x, force.y);

},

update (dt) {
var speed = this.rigidbody.linearVelocity;
cc.log(“dt=%f speed(%f, %f)”, dt, speed.x, speed.y);
cc.log(“position(%f, %f)”, this.node.x, this.node.y);
},

日志打印出,石头的质量为 5.46875kg, 那么石头受到的重力为 5.46875 x 10 = 54.6875 牛顿。

var a = cc.v2(this.gravity.x, Math.abs(this.gravity.y)*10); // 加速度(0, 3200)
var force = a.mul(m);

给一个加速度a(0, 3200) ,这里的单位是像素/秒^2, 转换为物理单位后,为100 米/秒^2,那么受到一个竖直向上的546.875牛顿的力,合算后,石头的加速度为 90 米/秒^2

日志中的 "speed(0, 48)"的速度是以像素/秒为单位的, 转换为物理单位后为 1.5 米/秒。由公式“v1 = v0 + at”计算可得,时间约为 0.016666秒


1 时间约为 0.016666秒。 可以推出理论是正确的
2 creator物理引擎 /RPG运动类型 /坦克_第3张图片


最近总结了下CocosCreator的技术框架结构,如图:
creator物理引擎 /RPG运动类型 /坦克_第4张图片

--------------------------------svn冲突
meta文件:
作用:用于资源管理
冲突:因为相同资源,但是每位开发者UUid不同
解决:一并提交SVN。(meta变动 但资源未使用过,不能提交)

---------------------------------2018.7.25
http://docs.cocos.com/creator/manual/zh/getting-started/quick-start.html
creator物理引擎 /RPG运动类型 /坦克_第5张图片

--------------------2018.8.26
模拟旋转台球球杆时提示条也旋转
cc.Class({
extends: cc.Component,

properties:{
    t:cc.Node
},

// 2个点差值---转换弧度---转换角度
start:function(){
    this.node.on(cc.Node.EventType.TOUCH_MOVE,function(e){
        var pos = e.getLocation();   //坐标系要一致
        var y = pos.y - 100;//canvas下还是本地坐标,(100,100)该节点的世界坐标
        var x = pos.x - 100;//
        var rotation = Math.atan(x/y) * 180 / Math.PI;  //得到触摸点和arrow出生点之间的夹角角度弧度
        if(y < 0){
            rotation += 180;              // 下面时相反 分析 正好差180度
        }
        rotation += 180;           //分析 正好差180度 (提示条正好相反)
        this.t.rotation = rotation;
    }.bind(this));
}

});

CocosCreator物理引擎Demo源码分析(3)-stick-arrow –

------------------刚体施加力/冲量方向有误差:
creator物理引擎 /RPG运动类型 /坦克_第6张图片

    var newc=cc.p(0, 1).rotate(-Math.abs((this.gun.node.rotation + 7)%360)*Math.PI/180);   //切水果炮筒在旋转(导致打歪)
    var _dir1 = cc.p(_stPos1.x-_stPos2.x, _stPos1.y-_stPos2.y);	//汤姆猫没有旋转

官方Demo:
在这里插入图片描述
-------------------龙骨(DragonBone)动画
基本概念:
1 API: 看白鹭API文档
2 骨骼–>插槽—>图片
骨骼下面–卡槽—可有多个图片 (同一时间only能显示一张图片)
3 (Egret之龙骨卡槽(slot)换皮)

this._armatureDisPlay = cc.find(“X”).getComponent(dragonBones.ArmatureDisplay) //获取 ArmatureDisplay
this._armature = this._armatureDisPlay.armature(); //获取 Armatrue

this._armatureDisPlay.armatureName = “mecha_1502b”
this._armatureDisPlay.animationName = “walk”
this._armature = this._armatureDisPlay.armature();

// var _t =  this._armature.animation.fadeIn('walk', -1, -1, 0, 'hit');
// _t.playTimes = 1;
// var _tt = _t.totalTime; 
// var  _ttt = _t.currentTime;
// // _t.currentTime = 1.2;  //等于从指定时间开始播放
var _test = this._armature.animation.gotoAndStopByTime("walk", 0.9);//将动画停止到指定的时间。
------------------------------------------------------------------------------- (备注:实现换装)  
this._armature.getSlot("face").displayIndex = -1;           // 隐藏或者显示插槽(-1不显示  0显示第一张图片  1显示第二张图片 2....)  

creator物理引擎 /RPG运动类型 /坦克_第7张图片
遇到坑:(不显示)
1 卡槽下图片名字和资源的名字要一样
2 导出的版本号不能太高 可选4.5
3 cavans模式不支持mesh(网格)

creator物理引擎 /RPG运动类型 /坦克_第8张图片
--------------------2018.8~9 WeChat命名规则
set get:属性方法
on off: 注册 反注册
creator物理引擎 /RPG运动类型 /坦克_第9张图片
--------------------2018.11
发不到微信平台,找不到路径。 因为未配置环境
creator物理引擎 /RPG运动类型 /坦克_第10张图片
--------------------2019.1.3
1 场景加载策略:异步加载极大提升scene加载速度
director.pause/resume();会导致切换场景后逻辑不会执行. 整了好久
2 ccc粒子特效2种方式:A使用Plist png B使用组件自定义
--------------------2018.8 坦克
1 Log格式 2原始 变化后 包含子节点边框 3active才会触发T方法
console.log("----hegith:%f boundingBox:%f getBoundingBoxToWorld:%f" ,this.node.height ,this.node.getBoundingBox().height ,this.node.getBoundingBoxToWorld().height);

2 动作 定时器使用前先销毁。stopAllAction/unschedule

3 测试性能/卡顿
var time = new Date().getTime();
console.error("---------time:"+ (new Date().getTime() - time)); //每次new耗内存
3

你可能感兴趣的:(cocos2d-x)