Love2D - 如何在 love.graphics.scale 的结果上使用 math.floor 函数?

我正在为游戏的相机使用 Gamera 库,并使用 setScale 函数以调整图像大小以适应多种屏幕分辨率。Gamera 使用 love.graphics.scale 来缩放图像,不幸的是,由于比例是小数,这会导致图像大小的子像素图。但是,屏幕可见区域被调整为完美的整数,所以没有问题。

这个图像大小的子像素图会在使用 Sprite 批处理绘制瓦片时导致像素的溢出。我已经尝试了对这些问题图像使用“最近邻”图像过滤,这是一种解决方法,但无法解决角色在 y 轴上的像素溢出问题。一般而言,我认为必须有更好的方法,因为真正需要做的就是对比例进行向下取整。2048x2048 层级大小被调整为类似于 1742.8234 的大小。如果它只是 1742,那就没有问题了。

这是 Gamera 中相关的绘图函数:

function gamera:draw(f)
  love.graphics.setScissor(self:getWindow())

  love.graphics.push()
    local scale = self.scale
    love.graphics.scale(scale)

   love.graphics.translate((self.w2 + self.l) / scale, (self.h2+self.t) / scale)
   love.graphics.rotate(-self.angle)
   love.graphics.translate(-self.x, -self.y)

   f(self:getVisible())

  love.graphics.pop()

  love.graphics.setScissor()
end
点赞
用户2858170
用户2858170

如果你要在你的比例尺上使用math.floor函数,你只需要在你想要做的scale的任何出现位置替换为math.floor(scale)即可。

function gamera:draw(f)
  love.graphics.setScissor(self:getWindow())

  love.graphics.push()
    local scale = self.scale
    love.graphics.scale(math.floor(scale))

   love.graphics.translate((self.w2 + self.l) / math.floor(scale), (self.h2 + self.t) / math.floor(scale))
   love.graphics.rotate(-self.angle)
   love.graphics.translate(-self.x, -self.y)

   f(self:getVisible())

  love.graphics.pop()

  love.graphics.setScissor()
end

作为懒惰的程序员,我们不想计算更多的东西,因此这种解决方案并不非常好看。因此,我们忘记上面所做的事情,只需将

local scale = self.scale

替换为

local scale = math.floor(self.scale)

现在,在该函数中使用scale与预期相同。

如果我们希望保持该更改超出该函数的范围,我们也可以这样做

self.scale = math.floor(self.scale)
local scale = self.scale

编辑由于评论

如果您要确保love.graphics.scale()的结果为整数尺寸,则必须使用适当的比例。

坚持你的例子:

2048应该缩小到1742:

love.graphics.scale(1742/2048)

如果你想将其缩小为30%:

love.graphics.scale(math.floor(0.3*2048)/2048)

将结果为614而不是614.4

简单的数学。

2018-03-05 08:09:26