类型 函数 库 physics.* 返回值 布尔值 版本 发行版 2024.3703 关键字 刚体、物理、形状、轮廓 另请参见 物理刚体 (指南) physics.removeBody() graphics.newOutline()
此函数将大多数 Corona 显示对象转换为具有特定物理属性的模拟物理对象。它接受显示对象、一个可选的刚体类型(字符串)和一个可选的 params
表格,其中包含params
表格内,应用以下内容
如果指定了一个 radius
值,刚体边界将为圆形,并位于用于创建物理刚体的显示对象的中间。
如果指定了一个 shape
表格,刚体边界将遵循 shape 提供的多边形。请注意,每个 shape 的最大边数为八 (8),且所有角度都必须为**凸角**。如果在同一元素中同时指定了 shape
表格和 radius
属性,则 shape 表格的指定将覆盖 radius 属性。请注意,shape 坐标必须按顺时针顺序定义,且第一个和最后一个顶点必须不同。
可以通过指定多个刚体元素和 shape 来构建一个复杂的刚体。例如,如果对象整体 shape 为凹形或如果 shape 的边数超过八个,则可以使用多个刚体元素来构建它。请参阅 物理刚体 指南了解更多信息。
可选的 box
表格允许你使用 halfWidth
、halfHeight
、x
(偏移)、y
(偏移)和 angle
的值来创建一个中心偏移/旋转矩形刚体。
边缘形状(链)刚体可以通过 chain
数组定义。有关详细信息,请参阅下面。
如果指定了 outline
表格,刚体边界将遵循 graphics.newOutline() 提供的轮廓。
当你将显示对象转换为物理对象时,物理引擎会“拥有”该对象,并对该对象有其自己的规则。引擎还假定锚点位于对象中心。
在处理多元素刚体的碰撞时,刚体元素索引将作为每个碰撞事件的一部分进行报告,因此可以检测到复杂刚体的哪个特定部分涉及碰撞。更多信息,请参见 碰撞检测 指南。
如果您在添加物理体之前更改显示对象的 anchorX 或 anchorY 属性,则该物体将相对于调整后的锚点正确定位。但是,您在添加物理体后不应更改锚点,否则该对象和物理体将错位。
您可以按比例 缩放 显示对象,但物理引擎仍会将对象视为在应用缩放值之前的样子。从本质上讲,它将以可视方式反映应用的缩放值,但该物理体的碰撞边界仍与原始物理体定义相同。
除非物理体类型为 "static"
,否则不要将物理体添加到使用 display.newLine() 创建的 line 对象。
无法在碰撞事件中使用此调用。但是,您的碰撞处理程序可能通过 timer.performWithDelay() 设置标志或包括时间延迟,以使该操作在下一个应用程序周期或以后发生。有关此规则适用的 API 和方法的完整列表,请参见 碰撞检测 指南。
physics.addBody( object, [bodyType,] [params] )
DisplayObject. 要添加物理体的显示对象。
String. 在第一个物理体元素之前,可以在可选的字符串参数中指定物理体类型。可能的类型有 "static"
、"dynamic"
和 "kinematic"
。如果未指定值,则默认类型为 "dynamic"
。有关更多信息,请参见 object.bodyType。
Table. 指定物理体属性的键值对表 - 详细信息请参见下一部分。对于
params
表包括物理体的属性。
Number. 乘以物理体的形状面积,确定质量。基于水的标准值 1.0
。较轻的材料(例如木材)的密度低于 1.0
,较重的材料(例如石头)的密度大于 1.0
。默认值是 1.0
.
Number. 可以是任何非负值;0.0
的值表示没有摩擦力,1.0
表示相当大的摩擦力。默认值为 0.0
。
Number. 确定碰撞后物体速度有多少被返回。默认值为 0.2
。
categoryBits = cb
,其中 cb
是对象类别(通常只设置一位)。如果未设置,则默认为 0x0001
。maskBits = mb
,其中 mb
是形状将接受碰撞的类别。默认为 0xFFFF
。groupIndex = gb
,其中 gb
指定某组对象绝不会碰撞(负数)或总碰撞(正数)。默认为 0
(禁用)。如果将 groupIndex
设置为非零,它将覆盖 maskBits
设置。Number. 边界圆的半径。
数组. 包含形状顶点的形状数组:{ x1,y1, x2,y2, ..., xn,yn }
。例如 pentagonShape = { 0,-37, 37,-10, 23,34, -23,34, -37,-10 }
。坐标必须按顺时针顺序定义,并且所得形状必须在所有角点处凸出。物理引擎假设 0,0
点是对象的中心。负x 将在对象的中心左侧,负y 将在对象的中心顶部。
表。包括
halfWidth
—— 一半身体宽度。此属性为必需属性。halfHeight
—— 一半身体高度。此属性为必需属性。x
—— 从显示对象的中心到x 轴的偏移(±)。如果您沿x 轴偏移身体,您还必须指定y 轴偏移,即使不需要沿该轴偏移y=0
)y
—— 从显示对象的中心到y 轴的偏移(±)。如果您沿y 轴偏移身体,您还必须指定x 轴偏移,即使不需要沿该轴偏移x=0
)angle
—— 身体的角度(旋转)。此属性是可选属性,其默认值为 0
。数组。用于定义边缘形状的顶点数组。边缘形状不受多边形物体等凸角限制。
布尔值。如果设置为 true
,第一个和最后一个顶点将通过一条直线相连。如果设置为 false
(默认值),边缘形状将出现断开的末端。
您不应使用
数组。由 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 } )