我正在为我的游戏相机使用Gamera库,以便与移动设备上的多个屏幕分辨率兼容我正在使用与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
如果你想在你的比例上使用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
简单的数学。