全部!
我来到这里是因为有一个问题困扰了我很长一段时间。我使用love2d引擎作为lua脚本的“图形”补充,但这个问题是lua类型的(至少我相信)。
我有一个功能:
createNew_keepOld = function (oldImgData, oldImgDraw)
local newImgData = oldImgData --I am assigning old value to another variable
local newImgDraw = oldImgDraw --I am doing the same thing as with data
for x = 0, newImgData:getWidth()-1 do
for y = 0, newImgData:getHeight()-1 do
local r, g, b, a = newImgData:getPixel(x, y)
r = 2*r
g = 2*g
b = 0.5*b
a = 2*a
newImgData:setPixel(x, y, r, g, b, a)
end
end
newImgDraw:replacePixels(newImgData)
return newImgData, newImgDraw
end
当这段代码完成时,我得到了我需要的更改,但不是我想要的地方。我只想生成两个新变量来存储数据和图像对象。但是,在此过程中,原始图像发生了变化。
有没有办法声明:
name = function (const param, const param)
return some_things
end
这样我就可以在不改变原始内容的情况下获得所需的输出?或者我的代码是否存在一些我看不到的问题?
谢谢!
最佳答案
其实这个问题的本质在Love2D和Lua中都有。无论如何。
Tables, functions, threads, and (full) userdata values are objects: variables do not actually contain these values, only references to them. Assignment, parameter passing, and function returns always manipulate references to such values; these operations do not imply any kind of copy.
Love2D 中的大多数类型都是 userdata Lua 类型,因此当将它们传递给你的函数时,你实际上传递了对它们的引用,因此你最终修改了“旧”版本。这些类型通常具有用于复制它们的函数。
ImageData
确实有一个并且 Image
不会,但您可以执行以下操作:
createNew_keepOld = function (oldImgData, oldImgDraw)
local newImgData = oldImgData:clone()
for x = 0, newImgData:getWidth()-1 do
for y = 0, newImgData:getHeight()-1 do
local r, g, b, a = newImgData:getPixel(x, y)
r = 2*r
g = 2*g
b = 0.5*b
a = 2*a
newImgData:setPixel(x, y, r, g, b, a)
end
end
local newImgDraw = love.graphics.newImage(newImgData, oldImgDraw:getFlags())
return newImgData, newImgDraw
end
请注意,我根据复制的 ImageData
和旧图像标志创建了全新的 Image
。
关于lua -> 如何将这些参数修改为 const,或者我应该做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56045849/