Love2D - 如何 math.floor love.graphics.scale 结果?
Love2D - how to math.floor the love.graphics.scale result?
我正在为我的游戏相机使用 Gamera 库,以便与移动设备上的多种屏幕分辨率兼容,我正在使用 Gamera 的 setScale 函数来相应地调整大小。 Gamera 使用 love.graphics.scale 来缩放图形,不幸的是,这会导致图形大小的子像素数字,因为缩放比例是十进制数。屏幕可见区域已调整为完美整数,因此没有问题。
当使用 Sprite 批处理绘制图块时,图形尺寸的这个子像素图会导致像素渗出。我已经尝试对这些问题图像进行 "nearest neighbour" 图像过滤,这是一种解决方法,但没有修复玩家 y 轴的像素溢出问题。一般来说,我认为一定有更好的方法,因为真正需要做的就是 math.floor 规模。 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
如果你想在你的体重秤上使用 math.floor,你所要做的就是用 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
简单的数学。
我正在为我的游戏相机使用 Gamera 库,以便与移动设备上的多种屏幕分辨率兼容,我正在使用 Gamera 的 setScale 函数来相应地调整大小。 Gamera 使用 love.graphics.scale 来缩放图形,不幸的是,这会导致图形大小的子像素数字,因为缩放比例是十进制数。屏幕可见区域已调整为完美整数,因此没有问题。
当使用 Sprite 批处理绘制图块时,图形尺寸的这个子像素图会导致像素渗出。我已经尝试对这些问题图像进行 "nearest neighbour" 图像过滤,这是一种解决方法,但没有修复玩家 y 轴的像素溢出问题。一般来说,我认为一定有更好的方法,因为真正需要做的就是 math.floor 规模。 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
如果你想在你的体重秤上使用 math.floor,你所要做的就是用 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
简单的数学。