重复填充

本指南概述了如何使用重复填充,该功能允许使用重复镜像重复重复模式,以“平铺图案”填充较大的显示对象。对于每个图案,可以对填充应用 xy 偏移,并且可以独立于对象旋转/缩放填充。此外,这些填充设置可以通过显式声明或通过逐渐过渡来应用,以实现各种动画效果。

重复填充模式

在实现重复填充之前,必须针对特定情况设置正确的填充模式。这是通过使用 "textureWrapX" 和/或 "textureWrapY" 键以及以下环绕模式之一调用 display.setDefault() 来实现的。

例如,考虑一个基本的 160×128 矩形矢量对象,可以如下设置沿 x 轴的重复填充和沿 y 轴的镜像重复填充。

local rect = display.newRect( 0, 0, 160, 128 )
rect.x, rect.y = display.contentCenterX, display.contentCenterY

display.setDefault( "textureWrapX", "repeat" )
display.setDefault( "textureWrapY", "mirroredRepeat" )

应用填充

在矢量对象到位并且沿两个轴设置填充模式后,可以用此处看到的示例 64×64 图像填充它。

具体来说,这可以通过一个初始命令来完成,该命令将 rect 对象的 fill 属性设置为包含两个键值

rect.fill = { type="image", filename="logo.png" }

的 Lua 表。

第一个(type)告诉 Corona 用图像填充对象,filename 键指示使用 logo.png 图像执行填充。

此命令的结果是右侧的图像,默认情况下,该图像被拉伸以填充矢量矩形的整个宽度和高度。因此,仅使用最少的代码,声明的纹理环绕模式就没有视觉重复 — 但这将在下一节中解决。使用重复填充模式时("repeat""mirroredRepeat"),填充图像必须两侧的尺寸均为2的幂

缩放填充

,例如 16、32、64、128、256、512 等。虽然不符合这些规格的图像将在 Corona 模拟器中正确填充,但实际设备将不会将其视为有效的填充图像。

rect.fill.scaleX = 0.5
rect.fill.scaleY = 0.5

显然,用一个拉伸的图像填充整个形状不会导致重复填充。要获得预期的视觉重复,必须对对象填充使用缩放方法。这只需要两行额外的代码。

这会缩放填充图像,但不幸的是它仍然被拉伸 — GPU 只是获取拉伸的填充纹理并将其在每个轴上缩放到 50%。

local scaleFactorX = 64 / rect.width
local scaleFactorY = 64 / rect.height
为了使填充图案在填充对象上保持其 1:1 的比率,我们可以使用简单的数学来计算正确的缩放比率,而不管目标对象的宽度和高度如何。

重要请注意,每个计算中的第一个数字 (64) 表示用于填充的图像的宽度和高度,在本指南中为 64×64。要保持填充的正确 1:1 比例,这些数字必须根据所使用的实际填充图像的宽度/高度进行调整。例如,如果填充图像为 32×128,则应分别调整这些值,如32 / rect.width.

128 / rect.height

rect.fill.scaleX = scaleFactorX
rect.fill.scaleY = scaleFactorY

使用这些计算值,可以正确缩放重复填充,如下所示。

偏移填充

结果是填充重复的比例为 1:1 — 这意味着填充本身保持其原始大小 64×64 像素,在填充对象的边界内重复,并按预期溢出边缘之外。

前面示例中的一个共同因素是填充图案重复始终居中于填充对象内。无论比例如何,填充“图块”都将位于对象的中心,然后向所有方向向外重复,假设两个轴都没有被钳制 ("clampToEdge")。

rect.fill.x = 0.5
rect.fill.y = 0
虽然此默认居中可能在大多数情况下都有效,但有时可能需要偏移填充。这可以通过简单地调整填充的 xy 值来完成,例如。
  • 注意

  • 不需要为 xy 属性设置特定的像素值,而是需要一个介于 -11 之间的值。这告诉 GPU 将图案偏移填充图像宽度或高度的完整重复。因此,将 0.5 设置为 x 属性将沿 x 轴将图案移动半个重复距离。

对齐填充

另一个重要的区别是,设置 x 值会将图案向移动,而 x 值会将对象向移动。类似地, y 值将向上偏移图案,而 y 值将向下偏移图案。

扩展填充偏移概念,有时需要将填充对齐到对象的边缘。

local scaleOffsetX = ( ( rect.width - 64 ) / 2 ) / 64
local scaleOffsetY = ( ( rect.height - 64 ) / 2 ) / 64
为了使填充图案在填充对象上保持其 1:1 的比率,我们可以使用简单的数学来计算正确的缩放比率,而不管目标对象的宽度和高度如何。

由于被填充对象的大小可能无法被填充图像大小整除,因此可以实现一些巧妙的计算以实现一致的填充对齐。

再次,在这些计算中使用 (64) 表示用于填充的图像的宽度和高度。为了实现正确的对齐,这些数字必须根据所使用的实际填充图像的宽度/高度进行调整。

rect.fill.x = offsetX
rect.fill.x = offsetX * -1
rect.fill.y = offsetY
rect.fill.y = offsetY * -1

旋转填充

要将填充与 rect 对象的边缘对齐:

rect.fill.rotation = 30

最终的潜在调整是独立于对象旋转填充。

过渡填充

填充旋转只是以熟悉的度数从 0360 执行。请注意,旋转是围绕填充对象的中心应用的,不能设置为锚点(填充不考虑 anchorXanchorY 属性)。

重复填充的最后一个强大功能是能够通过基本的 Corona 过渡 对其进行过渡。这允许您在填充对象内移动、旋转或缩放填充图案,并且独立于填充对象本身上可能发生的任何过渡/移动。

transition.to( rect.fill, { time=4000, x=0.5 } )
transition.to( rect.fill, { time=4000, rotation=80 } )
transition.to( rect.fill, { time=4000, scaleX=0.5, scaleY=0.4 } )

成功填充过渡的关键方面是将填充对象的 fill 属性指向过渡的目标,在本例中为 rect.fill。例如:

transition.to( rect.fill, { time=4000, x=rect.fill.x-1, iterations=-1 } )