LiquidFun 物理引擎允许您模拟水龙头、水池、波浪、溪流和其他令人惊叹的
在 LiquidFun 中,所有液体都由粒子系统表示,这意味着溪流或水池是由许多相互作用以模拟所需效果的“粒子”组成的。每个粒子都是圆形的,它们是粒子系统中最小的物质单位。默认情况下,粒子表现为液体,但您可以更改单个粒子或粒子组的行为。您还可以设置粒子属性,例如位置、速度和颜色。
LiquidFun 框架定义的粒子与
在 Corona 中,您可以通过 physics.newParticleSystem() 函数创建一个 ParticleSystem 对象
physics.newParticleSystem( params )
在此 API 中,params
是一个参数表,只有一个必需元素:要为每个粒子实例渲染的粒子图像的文件名 (filename
)
local physics = require( "physics" ) physics.start() local testParticleSystem = physics.newParticleSystem( { filename = "particle.png" })
但是,为了使您的粒子系统表现更好,您应该指定一些其他属性。至少,您应该定义粒子 radius
来控制构成液体效果的粒子的大小。另一个有用的参数是 imageRadius
,如果定义了该参数,它将指示 Corona 以与 radius
定义的物理实体不同的尺寸渲染粒子图像。本质上,如果 imageRadius
略大于 radius
,则粒子会有些重叠,从而产生更具凝聚力的
local physics = require( "physics" ) physics.start() local testParticleSystem = physics.newParticleSystem( { filename = "particle.png", radius = 2, imageRadius = 4 })
其他参数及其用途的完整列表超出了本教程的范围,因此请参阅文档或 LiquidFun 程序员指南了解更多信息。
建立粒子系统后,可以使用 object:createParticle() 方法生成新的粒子。它接受一个可选参数表,用于控制每个生成粒子的行为,例如
testParticleSystem:createParticle( { x = 0, y = 0, velocityX = 256, velocityY = 480, color = { 1, 0.2, 0.4, 1 }, lifetime = 32.0, flags = { "water", "colorMixing" } })
这些参数大多是
x
和 y
确定新粒子在内容空间中的生成位置。velocityX
和 velocityY
指定新粒子的起始速度值。color
是粒子的 RGB+A 值表。lifetime
定义粒子在消失之前在屏幕上保留的秒数。flags
可以是字符串或字符串表,用于指示粒子的各种行为方面。这些选项超出了本教程的范围,因此请参阅 LiquidFun 程序员指南了解更多信息。需要注意的是,object:createParticle() 只在整个系统中创建一个粒子,因此要创建有用的场景,您需要通过重复计时器或其他重复方法调用此函数来生成大量粒子。例如
local physics = require( "physics" ) physics.start() local testParticleSystem = physics.newParticleSystem( { filename = "particle.png", radius = 2, imageRadius = 4 }) local function onTimer( event ) testParticleSystem:createParticle( { x = 0, y = 0, velocityX = 256, velocityY = 480, color = { 1, 0.2, 0.4, 1 }, lifetime = 32.0, flags = { "water", "colorMixing" } }) end timer.performWithDelay( 20, onTimer, 0 )
除了在系统中创建单个粒子外,您还可以使用 object:createGroup() 函数创建相关的粒子组。本质上,这会在一个命令中用多个粒子“填充”定义的区域,并且可以为该组分配各种行为和视觉属性。例如
local physics = require( "physics" ) physics.start() local testParticleSystem = physics.newParticleSystem( { filename = "particle.png", radius = 2, imageRadius = 4 }) testParticleSystem:createGroup( { x = 0, y = 0, color = { 0, 0.3, 1, 1 }, halfWidth = 64, halfHeight = 32, flags = { "water", "colorMixing" } })
此代码生成一个矩形粒子组,但您也可以创建圆形组和任意形状组。请参阅文档了解有关创建不同组类型的信息。
可以通过 object:applyForce() API 将线性力应用于粒子系统中所有粒子的中心。此方法接受两个数值,分别表示在 **x** 和 **y** 方向上施加的力的大小。例如
testParticleSystem:applyForce( 0, -9.8 * testParticleSystem.particleMass )
或者,您可以使用 object:applyLinearImpulse() API 对所有粒子施加线性冲量。这与上述方法类似,不同之处在于冲量是瞬间的
testParticleSystem:applyLinearImpulse( 0, -9.8 * testParticleSystem.particleMass )
虽然生成单个粒子甚至粒子组可以提供一些惊人的效果,但在某些时候您可能需要检测和操纵定义区域内的粒子。这是通过 object:queryRegion() 函数使用以下语法完成的
ParticleSystem:queryRegion( upperLeftX, upperLeftY, lowerRightX, lowerRightY, hitProperties )
定义的区域必须是矩形的,它由前四个参数定义 — 只需指定upperLeftX
/upperleftY
)lowerRightX
/lowerRightY
)
最后一个参数 hitProperties
是一个可选属性表,可以应用于该区域中的每个粒子。有效属性包括
deltaX
— 要应用于每个粒子的 **x** 位置增量。deltaY
— 要应用于每个粒子的 **y** 位置增量。velocityX
— 要应用于每个粒子的 **x** 速度增量。velocityY
— 要应用于每个粒子的 **y** 速度增量。因此,如果您想对某个区域中的所有粒子应用向上的 **y** 速度,代码可能如下所示
local hits = testParticleSystem:queryRegion( 10, 40, 100, 160, { velocityY=-40 } )
hitProperties
表中可能应用的所有值都是将应用于每个粒子当前关联值的增量值。例如,如果您将 velocityY
为 -40
应用于该区域中的粒子,它不会直接将 -40
设置为它们的实际 **y** 速度,而是将该速度以增量关系应用于粒子已有的任何现有速度。
检测 LiquidFun 粒子与其他物理对象之间的碰撞事件是一个
本教程旨在简要介绍 Corona 中的 LiquidFun 物理引擎,但该框架的功能超出了此范围。请查阅文档或 LiquidFun 程序员指南了解更多信息。