通过给物体传入一些属性值,来操作物体或者改变物体的属性
1 .提供各种方法和属性,用于创建和操作Bodies模块种的函数创建的实体
4 .有的时候我们只是想要控制其中几个实体的特性
给物体一些力
1 .旋转 Body.rotate(box,Math.PI/6) 如何围绕一个点转呢?
2 .缩放 Body.scale(box,1.5,1.5)
3 .移动 Body.translate(box,{x:10,y:10})
4 .改变物体的线性速度 Body.setVelocity(circle,{x:0,y:-10})
5 .改变物体的角速度 Body.setAngularVelocity(middele,Math.PI/6)
6 .直接给物体一个力
给物体添加一些物理属性-bodies创建的时候加的,但是属性是继承自这里
1 .物体的弹力
2 .动态摩擦力
3 .静态摩擦力
4 .空气阻力
5 .渲染物体的一些类似css的样式
6 .设置物体的位置
7 .设置物体的质量
8 .设置物体的密度:通过 这个属性来控制物体的质量,他的质量将根据其面积自动计算。通过这种方式,可以通过密度来区分不同的对象
9 .物体的状态
10 .物体的硬度
11 .物体的比热
12 .物体的磁性
13 .熔点
14 .沸点
15 .延展性
16 .从9以后都是没有的。但是我觉得硬度是挺有用的,不知道可不可以扩展原来的
17 .碰撞之后的表现形式,一个函数来根据收到的力,决定自己的形变状态
18 .是否会破碎,有的碰撞物体会分解,有的只是会形变
配置的属性
const ti=Bodies.trapezoid(100,100,200,50,0.01,{
// body-create物体的配置参数
// angle:Math.PI/2,
// angularSpeed:1,
// 旋转的角速度,
// area:
// 物体的面积
// axes:
// 用于碰撞检测的唯一轴向量阵列,并在Body.update的过程不断更新
// bounds:边界
// 定义aabb为体对象,从给定的vertices阵列中自动计算出来,并会在给定模拟的过程中不断更新
collisionFilter:{
// group:-1,
// category:1,
// mask:2,
// 两个都是负数,两个都相等,永远不会碰撞,两个属性都是-1那么会穿过去
// 两个都是正数,两个都相等,永远都会碰撞
// 两个不相等的时候,根据以下条件判断
// category:设置一个碰撞位,即标记。值为[1,2-31]一共可以有32种不同的结果
// mask:可以接收碰撞的集合:比如我自己是的category是1,我想和设置了4的碰撞,这个值就是必须>=4(他的值必须是1+2+4+8这种值的结果),同理
// 对方的category必须是4,mask必须是大于1
},
density:0.05,
// 定义了密度,会根据面积自动更新物体的体积
force:{
x:10,
y:10
},
// 定义一个初始的力
// friction:0.5,
// 摩擦力:0表示没有摩擦力,永远不会停下来,1意味着施加力之后身体可以立即停止运动
// frictionAir:0.9,
// 空气摩擦力,0表示不会不会受到空气的干扰,永远不会减速,值越大,物体在空间移动时速度越慢,该值的影响是非线性的
// firctionStatic:1,
// 静摩擦力
// inertia:,
// 不知道是啥用
// inverseIntertia:
// 不知道是啥用
// inverseMass:
// 定义主体的反质量
// isSensor:true,
// 指示身体是否有传感器,传感器触发碰撞事件,但不会与物理盆装物体发生反应
// isSleeping:false,
// 指示身体是否被视为睡眠提,一个沉睡的身体的行为类似于静止的身体,除了他只是暂时的,可以被唤醒
// isStatic:false,
// 只是是否讲身体是为静态物体
// label:"libatere",
// 加一个字符串,便与管理
// mass:20
// 物体的质量
// motion:
// 目前的动量组合,他是只读的
// parent:
// 如果身体不是零一身体的一部分,则是自我引用,否则这是对身体的引用
// parts:
// 构成这个身体的一系列身体,数组中的第一个主体必须始终是对当前主体实例的自我引用
// parts阵列中的所有物体一起形成单个刚性复合体。允许部件重叠,具有间隙或孔甚至是凹体。
// 单个的零件本身永远不要添加到world里面,只有组合成父体才应该加入到世界里面去
// position:{
// x:100,
// y:100
// },
// 物体在当前世界空间的位置
render:{
fillStyle:"red",
// 填充颜色
lineWidth:2,
// 轮廓宽度
opacity:0.5,
// 透明度
sprite:{
// 添加图片
// texture:'',
xOffset:"",
// x方向偏移位置
yOffset:"",
// xScale:,
// x轴缩放
// yScale:,
// y轴缩放
},
},
restitution:1,
// 定义弹性
// sleepThreshold:60,
// 不知道用法
// slop:0.05,
// 稳定堆叠,定义两个物体之间的距离的容差
// speed:0,
// 进入世界的速度
// timeScale:0.3,
// 时间尺度,调节镜头的速度,快还是慢
// torque:0,
// 当前步骤应用的扭矩
// type:Body,
// 表示对象的类型
// vertices:[],
// 一组Vector对象,指定刚体的凸包。传递时Body.create,顶点相对于Body.position进行平移,这些
// vector对象还增加了有效碰撞检测所需的附加属性
})
2 .可以操作的方法
// Body.applyForce(ti,{x:ti.position.x,y:ti.position.y},{x:0.1,y:-0.3})
// 添加一个力
// console.log(Body.nextCategory())
// 返回下一个唯一类别位域
// console.log(Body.nextGroup())
// 返回实体将要发生碰撞的下一个唯一组索引
// Body.rotate(ti,Math.PI/4,{x:0,y:0})
// 旋转一个实体
// Body.scale(ti,1.1,1.1,{x:0,y:0})
// 缩放一个实体,相关物理属性也会被缩放
// console.log(ti)
// Body.set(ti,"isStatic",true)
// 设置给定的的属性和值。下面是一堆包装的用法
// console.log(ti)
// Body.setAngle(ti,Math.PI/3)
// 设置物体的角度,其余参数不变
// Body.setAngularVelocity(ti,1)
// 设置物体的角速度,位置,角度等不变
// Body.setDensity(ti,0.9)
// 设置身体的密度,质量和惯性会自动更新以反映变化
// Body.setIntertia(ti,1)
// 设置物体的惯性,其余属性会自动更新
// Body.setMass(ti,10000)
// 设置物体的质量,密度,惯性会自动更新变化
// Body.setParts(ti,)
// 设置部分body并更新质量,惯性和质心。
// Body.setPosition(ti,{x:200,y:100})
// 设置物体的位置
// Body.setStatic(false)
// 将主体设置为静态,包括将isStatic设置为false,质量和惯性设置为无限
// Body.setVelocity(ti,0.5)
// 设置物体的线速度,位置,角度,力等不变
// Body.setVertices()
// 设置新的顶点,并更新主体属性
// Body.translate(ti,{x:10,y:-10})
// 移动这些单位向量的距离
// Body.update(ti,1,0.1,1)
// 更新某一个时间段
// 他这些示例函数只是给了传入参数的类型,但是数字类型需要给传入的范围和单位吧
3 .可以被监听的事件
// setInterval(()=>{
// Body.applyForce(ti,{x:ti.position.x,y:ti.position.y},{x:0.1,y:-0.3})
// },1000)
// 可以触发的事件
Events.on(ti,"sleepEnd",(e)=>{
console.log('end')
})
Events.on(ti,"sleepStart",(e)=>{
console.log('start')
})
//粘连两个物体
let boxA=Bodies.rectangle(300,300,500,100)
let boxB=Bodies.rectangle(300,300,100,500)
const cpu=Body.create({
parts:[boxA,boxB]
// 如何按照特殊的坐标粘连呢?
})
2 .官网demo
var bodyA = Bodies.rectangle(100, 200, 50, 50,{isStatic:true}),
bodyB = Bodies.rectangle(200, 200, 50, 50),
bodyC = Bodies.rectangle(300, 200, 50, 50),
bodyD = Bodies.rectangle(400, 200, 50, 50),
bodyE = Bodies.rectangle(550, 200, 50, 50),
bodyF = Bodies.rectangle(700, 200, 50, 50),
bodyG = Bodies.circle(400, 100, 25),
partA = Bodies.rectangle(600, 200, 120, 50),
partB = Bodies.rectangle(660, 200, 50, 190),
compound = Body.create({
parts: [partA, partB],
isStatic: true
});
// World.add(engine.world, [bodyA, bodyB, bodyC, bodyD, bodyE, bodyF, bodyG, compound]);
World.add(engine.world, [bodyB,bodyC,bodyD]);
let counter=0;
let scaleFactor=1.01
Events.on(engine,'beforeUpdate',(e)=>{
counter+=1
if(counter===400){
Body.setStatic(bodyG,true)
// 过一段时间让他变成静止物体
}
if(scaleFactor>1){
Body.scale(bodyF,scaleFactor,scaleFactor)
bodyE.vertices[0].x -= 0.3;
bodyE.vertices[0].y -= 0.3;
bodyE.vertices[1].x += 0.1;
bodyE.vertices[1].y -= 0.1;
// 按照这个速度变换新的顶点,并且可以更新主体属性,包括惯性,面积,和质量
Body.setVertices(bodyE, bodyE.vertices);
Body.scale(compound,0.995,0.995)
// 然后使用新的,可以做出形变
}
var py = 300 + 100 * Math.sin(engine.timing.timestamp * 0.002);
// Body.setVelocity(bodyA, { x: 0, y: py - bodyA.position.y });
// 改变线速度,好像没啥用
// Body.setPosition(bodyA, { x: 100, y: py });
// 改变位置方法1:
// Body.applyForce(bodyA,{x:bodyA.position.x,y:bodyA.position.y},{x:0,y:0.00001})
//改变位置方法2: 这个物体设置isStatic的时候applyForce是不能调节位置的
Body.setVelocity(compound, { x: 0, y: py - compound.position.y });
// 设置线速度
// Body.setAngularVelocity(compound, 0.02);
// 设置角速读
Body.setPosition(compound, { x: 600, y: py });
// 设置位置
// Body.rotate(compound, 0.02);
// 旋转
if (counter >= 60 * 1.5) {
Body.setVelocity(bodyB, { x: 0, y: -20 });
// 给一个线速度,有点像给了一个力
Body.setAngle(bodyC, -Math.PI * 0.26);
// 设置身体的角度。类似于rotate的一半操作
Body.setAngularVelocity(bodyD, 0.5);
// 设置身体的角速度
// reset counter
// 根据一些变量来确定渲染样式,然后在一段时间之后重置,避免涨爆
counter = 0;
scaleFactor = 1;
}
})