Love2D - 如何math.floor love.graphics.scale结果?

时间:2018-03-01 07:44:37

标签: lua love2d

我将Gamera库用于我的游戏相机,以便与移动设备上的多种屏幕分辨率兼容,并使用与Gamera的setScale功能相应地调整大小。 Gamera使用love.graphics.scale来缩放图形,不幸的是,这会导致图形尺寸的子像素数字,因为缩放比例是十进制数。屏幕可见区域被调整为完美整数,但是那里没有问题。

图形尺寸的此子像素数字会在使用Sprite批次绘制切片时导致像素出血。我已经尝试过#34;最近邻居"对这些问题图像进行图像过滤,这是一种解决方法,但没有修复播放器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

1 个答案:

答案 0 :(得分:1)

如果你想在你的音阶上使用math.floor,你所要做的就是用math.floor(scale)替换你想要做的任何规模的出现。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="320dp"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CollapsingToolbarLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY"
            android:src="@drawable/lily_lake"
            app:layout_collapseMode="parallax"/>

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?actionBarSize"
            android:layout_gravity="bottom"
            app:layout_collapseMode="pin"/>


    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

由于程序员很懒惰,我们不想更频繁地计算事情,这个解决方案不是很漂亮。所以我们忘记了上面做了什么,只需要替换

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
由于评论

修改

如果你想使用确保love.graphics.scale()得到整数尺寸,你必须使用适当的尺度。

坚持你的榜样:

2048应缩减为1742:

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

如果你想让它缩小到30%:

love.graphics.scale(1742/2048)

将导致614而不是614.4

简单的数学。