construct2中对象的物理属性(Physics Behaviors)

Construct2游戏中经常需要给某些对象添加物理属性(Physics Behavior),下面详细描述了这个物理Physics属性。

(物理运动只能发生在都带有物理属性的对象之间,如果有的对象不带有物理属性,那么就不会发生任何物理运动。)

参数:

  • Immovable(禁止移动): 通常用于游戏场景的设置。比如为了防止带有重力属性的游戏地面掉落出游戏画面,或是受到撞击,这些场景就会旋转或是移动。通过设置Immovable参数来防止移动和旋转等运动,但是又可以参与游戏中的物理碰撞。
  • Collision mask(碰撞检测面):这个参数设置对象碰撞检测的形状,它有三个选择项:
    1. Collision Polygon(多边形碰撞检测面): 默认设置.选择了这个设置,就可以在图片编辑器里编辑对象的碰撞多边形。需要注意的是,碰撞多边形的边越多,就会导致游戏越慢。
    2. Bounding Box(边界框检测面): 选择这个设置,会忽略图片编辑器里的碰撞多边形设置,而以对象图片的边界框(通常为矩形)为检测面。
    3. Circle(圆圈检测面):选择这个设置,会忽略图片编辑器里的碰撞多边形设置,而以一个围绕对象的圆为检测面。
  • Prevent rotation(阻止旋转):设置这个属性的对象不再具备旋转的特性。
  • Density(密度):对象的密度跟它的质量相关,而物体的质量决定了它移动的难易程度。
  • Friction(摩擦力):这个参数决定了两个对象(带有物理属性)相互滑动时的难易程度。
  • Elasticity(弹力):决定了对象的弹性。
  • Linear damping(线性阻尼):表示对象物体线性运动中的阻力(包括摩擦力、空气阻力等等),为0就表示物体在真空中,受力后会永远运动。
  • Angular damping(角度阻尼):同线性阻尼类似,就是阻止对象物体旋转的阻力。设为0的话,物体收到一个使其旋转的力后,就会以一个速度永远的旋转下去。

性能:

  1. 物理仿真非常消耗CPU,过多的使用带有物理属性的对象,会严重消耗CPU,从而降低游戏的速度。而且,如果游戏是为手机等移动设备设计时,就更要注意这一点。
  2. 如果带有物理属性的对象大都处于静止“睡眠”状态的话,这些对象的物理属性是不会消耗CPU,只有发生了物理碰撞,或是处于物理运动的对象才会消耗CPU,所以,如果一个游戏里虽然有大量具备物理属性的对象的,但是大部分处于静止“睡眠”状态的话,是不会影响游戏的运行效率。

物理仿真的稳定性:

为了保证物理仿真的可靠性,一是不要使用不真实的物理变化,尽量采用符合现实生活的物理变化;二是具备物理属性的对象边长保持在5~500个像素以内。

重力Gravity.

重力是所有添加了物理属性的对象所具备的。它的默认值为10,重力的方向通常设置在Y轴,从上向下。

重力值是可以被改变,通常在事件里改变,而这个改变是整个游戏世界的重力改变。如果设置为0的话,就是整个游戏中所有的对象都没有重力。

Set Physics world gravity to 0

外力与对象运动的物理仿真效果

游戏中,可以通过一些设置的方式来改变对象的位置或是使其运动,比如在事件中通过Set X, Set Y来使物体运动到一个新位置,又比如给物体增加“8个方向的控制”属性,然后通过箭头键使其运动。虽然这些设置导致物体(带有物理属性)的运动也会很好的仿真物理效果,但是不如通过物理行为(比如:给物体施加一个力量force或是一个脉冲式的力量impulse)使之运动的物理效果,这样更加精准。

  1. 力量(force):是在一段时间里,持续施加在对象物体上的一种力量,带给物体速度、加速度和方向,比如重力。
  2. 脉冲式力量(impulse):瞬间的力量,比如物体之间的撞击。
  3. 扭矩(Torque):带给物体旋转的力量。
  4. 连接(Joint):将两个物体连接固定到一起 ,它有两种连接方式,点连接和线连接。点连接的话,两个物体的某一点固定到一起,然后保持不变,但是各自的其他部分可以旋转变化;线连接的话有点类似在两个物体之间用一根不能弯曲的铁棍连接到一起,各自的其他部分可以旋转,但是两个连接点相对位置不能变化。
时间: 2024-10-11 12:59:47

construct2中对象的物理属性(Physics Behaviors)的相关文章

javascript中对象访问自身属性的方式

在javascript中,通过对象的方法访问对象自身属性时,必须采用this.fieldName的方式. 原因是javascript中Function是无状态的,访问对象的属性时,必须指定当前的上下文状态,即添加this关键字.如果没有指定,则上下文默认为window. 举例如下: 1 var obj = 2 { 3 name:"James", 4 showName:function(){ 5 alert(name); 6 } 7 } 通过控制台执行obj.showName() 输出为

js 中对象--属性相关操作

查询属性: 可以用 对象.属性 来查询属性和属性方法               或者                    对象[“属性”]  来查询属性和属性方法 演示代码: 1 <script> 2 var obj ={ 3 username:"ziksang", 4 age:22, 5 addr:"北京", 6 say:function(){ 7 return "我的名字叫 "+this.username //解析this,此

Vue 改变数组中对象的属性不重新渲染View的解决方案

在解决问题之前,我们先来了解下 vue响应性原理: Vue最显著的一个功能是响应系统-- 模型只是一个普通对象,修改对象则会更新视图.受到javascript的限制,Vue不能检测到对象属性的添加或删除,因为vue在初始化实列时将属性转为getter/setter,所以属性必须在data对象上才能让vue转换它.但是vue可以使用 Vue.set(object, key, value)方法将响应属性添加到嵌套的对象上:如下代码: Vue.set(obj, '_isHover', true); 或

关于vue数组中对象属性变更页面没重新渲染的问题

前段时间做开发的时候用mqtt监听了服务端信息,推送过来的数据要变更数组里面的对象的数据,修改好后但是页面并没有更新,因为javascript机制,vue并不能检测到数组变化,也是查阅知道了$set()函数, 具体用法: arr.$set(index, { name : value }), index: 索引,name: 数组中对象的属性名, value: 要赋给属性的值 this.footerList.$set(i, { siteId : monitorSiteData[j].siteId,

JavaScript中对象属性的添加和删除

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 用.为对象添加属性 用关键字delete删除属性 用[]添加属性 和.的不同 r.name==r["name"]; r.

js检测对象中是否存在某个属性

1.使用in关键字.该方法可以判断对象的自有属性和继承来的属性是否存在. 2.使用对象的hasOwnProperty()方法.该方法只能判断自有属性是否存在,对于继承属性会返回false. 3.用undefined判断.自有属性和继承属性均可判断,如果属性的值就是undefined的话,该方法不能返回想要的结果. 4.在条件语句中直接判断.如果x是undefine,null,false," ",0或NaN,它将保持不变

javascript,检测对象中是否存在某个属性

检测对象中属性的存在与否可以通过几种方法来判断. 1.使用in关键字. 该方法可以判断对象的自有属性和继承来的属性是否存在. var o={x:1}; "x" in o; //true,自有属性存在 "y" in o; //false "toString" in o; //true,是一个继承属性 2.使用对象的hasOwnProperty()方法. 该方法只能判断自有属性是否存在,对于继承属性会返回false. var o={x:1}; o.h

JavaScript中对象的属性

原文:http://www.2ality.com/2012/10/javascript-properties.html JavaScript中有三种不同类型的属性:命名数据属性(named data properties),命名访问器属性(named accessor properties)以及内部属性(internal properties). 命名数据属性 这种属性就是我们通常所用的"普通"属性,它用来将一个字符串名称映射到某个值上.比如,下面的对象obj有一个名为字符串"

java 对list中对象按属性排序

实体对象类 --略 排序类----实现Comparator接口,重写compare方法 package com.tang.list; import java.util.Comparator; public class Mycompera implements Comparator<Student> { @Override    public int compare(Student o1, Student o2) {        if (o1.getSid() > o2.getSid()