physics.addBody()

类型 函数
physics.*
返回值 布尔值
版本 发行版 2024.3703
关键字 刚体、物理、形状、轮廓
另请参见 物理刚体 (指南)
physics.removeBody()
graphics.newOutline()

概述

此函数将大多数 Corona 显示对象转换为具有特定物理属性的模拟物理对象。它接受显示对象、一个可选的刚体类型(字符串)和一个可选的 params 表格,其中包含键值对,用于指定物理刚体的属性。在此 params 表格内,应用以下内容

注意点

语法

physics.addBody( object, [bodyType,] [params] )
object (required)

DisplayObject. 要添加物理体的显示对象。

bodyType (optional)

String. 在第一个物理体元素之前,可以在可选的字符串参数中指定物理体类型。可能的类型有 "static""dynamic""kinematic"。如果未指定值,则默认类型为 "dynamic"。有关更多信息,请参见 object.bodyType

params (optional)

Table. 指定物理体属性的键值对表 - 详细信息请参见下一部分。对于多元素物理体,可以在用逗号分隔的系列中声明多个不同的参数表(每个物理体元素一个)。

参数参考

params 表包括物理体的属性。

核心参数

density (optional)

Number. 乘以物理体的形状面积,确定质量。基于水的标准值 1.0。较轻的材料(例如木材)的密度低于 1.0,较重的材料(例如石头)的密度大于 1.0。默认值是 1.0.

friction (optional)

Number. 可以是任何非负值;0.0 的值表示没有摩擦力,1.0 表示相当大的摩擦力。默认值为 0.0

bounce (optional)

Number. 确定碰撞后物体速度有多少被返回。默认值为 0.2

isSensor (optional)

Boolean. 将物理体设置为 传感器。传感器是一种检测碰撞但不会产生物理反应的固定装置。

filter (optional)

Table. 过滤值。有关更多信息,请参见 碰撞检测

  • categoryBits = cb,其中 cb 是对象类别(通常只设置一位)。如果未设置,则默认为 0x0001
  • maskBits = mb,其中 mb 是形状将接受碰撞的类别。默认为 0xFFFF
  • groupIndex = gb,其中 gb 指定某组对象绝不会碰撞(负数)或总碰撞(正数)。默认为 0(禁用)。如果将 groupIndex 设置为非零,它将覆盖 maskBits 设置。

圆形刚体

radius

Number. 边界圆的半径。

多边形刚体

shape

数组. 包含形状顶点的形状数组:{ x1,y1, x2,y2, ..., xn,yn }。例如 pentagonShape = { 0,-37, 37,-10, 23,34, -23,34, -37,-10 }。坐标必须按顺时针顺序定义,并且所得形状必须在所有角点处凸出。物理引擎假设 0,0 点是对象的中心。负x 将在对象的中心左侧,负y 将在对象的中心顶部。

中心偏移/旋转矩形刚体

box

。包括键值成对

  • halfWidth —— 一半身体宽度。此属性为必需属性。
  • halfHeight —— 一半身体高度。此属性为必需属性。
  • x —— 从显示对象的中心到x 轴的偏移(±)。如果您沿x 轴偏移身体,您还必须指定y 轴偏移,即使不需要沿该轴偏移(只需指定 y=0).
  • y —— 从显示对象的中心到y 轴的偏移(±)。如果您沿y 轴偏移身体,您还必须指定x 轴偏移,即使不需要沿该轴偏移(只需指定 x=0).
  • angle —— 身体的角度(旋转)。此属性是可选属性,其默认值为 0

边缘形状(链)刚体

chain

数组。用于定义边缘形状的顶点数组。边缘形状不受多边形物体等凸角限制。

connectFirstAndLastChainVertex (optional)

布尔值。如果设置为 true,第一个和最后一个顶点将通过一条直线相连。如果设置为 false(默认值),边缘形状将出现断开的末端。

重要提示

您不应使用自相交叉的线段构建边缘形状的身体——换句话说,您的顶点定义不应导致链的任何线段与其他线段交叉。这样做可能打破形状的预期碰撞检测。

轮廓刚体

outline

数组。由 graphics.newOutline() 生成的轮廓数组。与 shape 相比,outline 的限制更少,例如,轮廓可以是凸的或凹的。

示例

矩形刚体
local sky = display.newImage( "bkg_clouds.png" )
sky.x = 160; sky.y = 195
 
local ground = display.newImage( "ground.png" )
ground.x = 160; ground.y = 445
 
physics.addBody( ground, "static", { friction=0.5, bounce=0.3 } )
 
local crate = display.newImage( "crate.png" )
crate.x = 180; crate.y = -50; crate.rotation = 5
 
physics.addBody( crate, { density=3.0, friction=0.5, bounce=0.3 } )
圆形刚体
local ball = display.newImage( "ball.png" )
 
physics.addBody( ball, { density=1.0, friction=0.3, bounce=0.2, radius=25 } )
多边形刚体
local pentagon = display.newImage("pentagon.png")
 
local pentagonShape = { 0,-37, 37,-10, 23,34, -23,34, -37,-10 }
 
physics.addBody( pentagon, { density=3.0, friction=0.8, bounce=0.3, shape=pentagonShape } )
多元素刚体
local nebula = display.newImage( "nebula.png" )
nebula.x, nebula.y = display.contentCenterX, display.contentCenterY

local podT = {1,-89, 14,-83, 20,-70, 14,-57, 1,-51, -12,-57, -18,-70, -12,-83}
local podR = {69,-20, 82,-14, 88,-1, 82,12, 69,18, 56,12, 50,-1, 56,-14}
local podB = {1,49, 14,55, 20,68, 14,81, 1,87, -12,81, -18,68, -12,55}
local podL = {-70,-20, -57,-14, -51,-1, -57,12, -70,18, -83,12, -89,-1, -83,-14}

physics.addBody( nebula, "dynamic",
    { friction=0.2, bounce=0.4, shape=podT },
    { friction=0.8, bounce=0.0, shape=podR },
    { friction=0.8, bounce=0.0, shape=podB },
    { friction=0.2, bounce=0.4, shape=podL }
)
中心偏移/旋转矩形刚体
local body = display.newRect( 100, 200, 40, 40 )

local offsetRectParams = { halfWidth=5, halfHeight=10, x=10, y=0, angle=60 }

physics.addBody( body, "dynamic", { box=offsetRectParams } )
边缘形状(链)刚体
local body = display.newRect( 150, 200, 40, 40 )

physics.addBody( body, "static",
    {
        chain={ -120,-140, -100,-90, -80,-60, -40,-20, 0,0, 40,0, 70,-10, 110,-20, 140,-20, 180,-10 },
        connectFirstAndLastChainVertex = true
    }
)
轮廓刚体
local image_name = "star.png"

local image_outline = graphics.newOutline( 2, image_name )

local image_star = display.newImageRect( image_name, 32, 32 )

physics.addBody( image_star, { outline=image_outline } )