物理引擎 - dasasdhba/Super-Mario-Vandal-Editor GitHub Wiki
本章主要介绍本项目使用的物理引擎,其为自行编写。
参数
在 script physics_init 中可以找到本项目物理引擎使用的全部参数。
项目中的注释使用英文,且不一定完整,以下给出完整的中文注释。
physics = true //用于标记物件是否属于物理对象
//本项目中,马里奥的 phy_type 为 1,敌人为 2
phy_type = 0 //物理碰撞类型,0 为普通,如果大于 0,额外响应 type 变量与之相等的实心
phy_slope = 5 //斜坡的容错值,设为 0 将无法上下斜坡,值过小也无法走一格缝
//water detect
water_in = false //当物件入水的瞬间为 true,其他时候为 false(帧开始时不算)
water_out = false //当物件出水的瞬间为 true,其他时候为 false(帧开始时不算)
//gravity
gravity_state = 0 //0 为在地面上,1 为在空中,设为 -1 可禁用重力事件
gravity_water = false //是否在水中
gravity_place = true //是否执行碰撞检测
gravity_dir = 270 //重力方向,角度,与数学一致
gravity_v = 0 //速度
gravity_max = 10 //最大速度
gravity_max_water = 3 // 水中的最大速度
gravity_a = 1 //加速度,敌人一般为 0.4
gravity_d = 1 //减速度,敌人一般为 0.4
gravity_a_water = 0.1 //水中加速度
gravity_d_water = 0.85 //水中减速度
gravity_hit_up = false //物件顶到头的瞬间为 true,其他时候为 false(帧开始时不算)
gravity_hit_down = false //物件落地的瞬间为 true,其他时候为 false(帧开始时不算)
//用于移动平台补正,不用管
gravity_fix_vx = 0
gravity_fix_vy = 0
//move
move_state = 0 //0 为静止,1 为运动,设为 -1 可禁用运动事件
move_place = true //是否执行碰撞检测
move_dir = 0 //运动方向,同 gravity_dir
move_v = 0 //速度
move_mode = 0 //碰撞后的行为:0 = 停止; 1 = 180 度转向; 2 = move_hit_ext
move_hit = false //物件碰撞的瞬间为 true,其他时候为 false(帧开始时不算)
move_hit_ext = false //需要 move_mode = 2,物件碰撞后为 true
//auto
auto_place = false //是否开启自动碰撞检测,如果开启,当物件与实心重叠时,将会从四个方向中寻找最近的一个挤出
auto_finish = false //完成自动碰撞检测的瞬间为 true
//crush detect
solid_crush = false //被实心夹挤设为 true
用法
首先在对象的 Create 事件中执行physics_init(),根据需求调整上面的参数;
然后在 Step 事件中执行physics_step(),物理事件即可正常工作。
当然,你需要注意global.pause,所以更准确地来说,Step 事件中应该这样编写:
if !global.pause
physics_step()
碰撞检测
有两个用于碰撞检测的函数,分别是:
physics_place(x,y,setting,depth)physics_fix(x,y,dir,setting,depth)
其中 physics_place 用于检测对象是否与实心重叠,physics_fix 则用于将对象从给定方向挤出实心。
它们都有详细的英文注释,如果需要可自行查阅。