2013-03-16 150 views
2

我在網上搜索,但沒有真正的教程就明確給我,所以我需要在此簡要說明:如何在Lua代碼上創建新的數據類型?

我想爲LUA創建新的數據類型(在Ç語言編譯器)像創造價值:

pos1 = Vector3.new(5, 5, 4) --Represents 3D position 

pos2 = CFrame.new(4, 2, 1) * CFrame.Angles(math.rad(40), math.rad(20), math.rad(5)) --Represents 3D position AND rotation 

這些都是一些行我能叫上一個Roblox遊戲引擎正常使用。我想重新使用它們來使用外部的Roblox。

+1

關於如何創建對象沒有「簡要」解釋。在Lua中有很多方法可以這樣做,這取決於你對此有多認真。 – 2013-03-16 17:02:48

+1

爲什麼不爲你的新數據類型使用普通的Lua表(可以從C和Lua完全訪問)? – 2013-03-16 17:27:17

回答

1
local Vector3 = {} 
setmetatable(Vector3,{ 
    __index = Vector3; 
    __add = function(a,b) return Vector3:new(a.x+b.x,a.y+b.y,a.z+b.z); end; 
    __tostring = function(a) return "("..a.x..','..a.y..','..a.z..")" end 
}); --this metatable defines the overloads for tables with this metatable 
function Vector3:new(x,y,z) --Vector3 is implicitly assigned to a variable self 
    return setmetatable({x=x or 0,y=y or 0,z=z or 0},getmetatable(self)); #create a new table and give it the metatable of Vector3 
end 

Vec1 = Vector3:new(1,2,3) 
Vec2 = Vector3:new(0,1,1) 
print(Vec1+Vec2) 

輸出

(1,3,4) 
> 
0

元表和加載鏈是我今天來給它以同樣的方式向這個關閉:

loadstring([=[function ]=] .. customtype .. [=[.new(...) 
return loadstring([[function() return setmetatable({...} , {__index = function() return ]] .. ... .. [[) end)() end]] ]=])() 

這只是我的意思的要點。對不起,它不完美和完美,但至少有一些事情要繼續(昨晚我沒有睡太多)。

相關問題