lua -> 如何将这些参数修改为const,或者我该怎么做?
2019-5-8 17:9:50
收藏:0
阅读:125
评论:2
全部!
我来这里是因为有一个问题困扰着我已经很长时间了。我正在使用love2d引擎作为lua脚本的“图形”补充,但这个问题是lua类型的(我相信至少是这样的)。
我有一个函数:
createNew_keepOld = function (oldImgData, oldImgDraw)
local newImgData = oldImgData --我正在将旧值分配给另一个变量
local newImgDraw = oldImgDraw --我正在做与数据一样的事情
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)
返回某些事情
end
这样我就可以得到我需要的输出而不改变原始的东西吗?或者我的代码是否存在某些我看不见的问题?
谢谢!
点赞
用户4567755
实际上,这个问题的本质是Love2D和Lua两者之间的。无论如何。
引用自Lua参考手册5.3:
表、函数、线程和(完整的)用户数据值都是对象:变量实际上不包含这些值,而只包含对这些值的引用。 赋值、参数传递和函数返回总是操作对这些值的引用;这些操作不意味着任何类型的复制。
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。
2019-05-08 17:56:32
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

Lua 变量与表格
在 Lua 中,如果你让一个变量等于某个表格值,你并没有复制或者复制该信息,新变量只是简单地指向另一个变量相同的值。
举个例子:
tbl1 = {} tbl2 = tbl1 tbl2[1] = 1 print(tbl1[1])如果你想要基于
oldImgData创建一个newImgData,你需要进行深拷贝:function deepcopy(orig) local orig_type = type(orig) local copy if orig_type == 'table' then copy = {} for orig_key, orig_value in next, orig, nil do copy[deepcopy(orig_key)] = deepcopy(orig_value) end setmetatable(copy, deepcopy(getmetatable(orig))) else -- number, string, boolean, etc copy = orig end return copy end关于表格复制的资源: Lua-Users Wiki: Copy Table
这种解决方案仅适用于
table类型,对于userdata则不适用。