2014-06-16 3 views
3

나는 내 게임 엔진을위한 스크립팅 레이어로 작업 중이다. 현재 Script라는 클래스를 사용하여 new라는 "Table"메소드를 추가합니다. 이 함수는 기본적으로 클래스의 인스턴스화 된 복사본을 만들었습니다. 스크립트의 인스턴스가 필요할 때 C API에서이 함수를 호출합니다.루아 : 새로운 C API

function PlayerController:new(o) 
    print('A new instance of the PlayerController has been created'); 

    o = o or {} 
    setmetatable(o, self) 
    self.__index = self 
    return o 
end 

내 질문은 : 나는 루아 코드 위를 가지고 가고, 내가이 시스템 쓰기 모든 스크립트 파일에 추가 할 필요는 없습니다 그래서 C로 그 이동할 수 있습니까?

+0

나쁜 생각을. 왜 루아 스크립트 (다른 ​​사람들을 호출 할 수도 있음)를 사용하여 루아 상태를 초기화하고 호스트가 제공하는 모든 함수를 적절한 루아 클래스에 넣을 수없는 이유는 무엇입니까? 그것은 작성하기가 훨씬 쉽고 유지 보수가 쉽고 확장하기 쉽습니다. 성능을 해치지 않아야합니다. – Deduplicator

+0

또한 클래스 정의 및 인스턴스화를 위해 call 메타 메소드 사용을 고려하십시오. – Deduplicator

+0

나는 잘 모르겠습니다. 또한 각 스크립트에 '새로운'메소드를 프로그래밍 방식으로 추가하는 것은 왜 나쁜 생각입니까? 그냥 궁금해서. 또한, 나는 메타 방법을 찾고있다. –

답변

0

이렇게하려면 클래스 선언 함수 을 작성해야 할 수 있습니다.

local lib = {type = 'helper'} 
local CALL_TO_NEW = {__call = function(lib, ...) return lib.new(...) end} 

function lib.class(class_name, tbl) 
    local lib = tbl or {} 
    lib.type = class_name 
    lib.__index = lib 

    -- Default "new" method 
    function lib.new() 
    return setmetatable({}, lib) 
    end 

    -- Enable foo.Bar() instead of foo.Bar.new() 
    return setmetatable(lib, CALL_TO_NEW) 
end 
return lib 

사용 예 :

local helper = require 'helper' 
local lib = helper.class 'foo.Bar' 

-- optional new function if there needs to be some argument handling 
function lib.new(args) 
    local self = {} 
    -- ... 
    return setmetatable(self, lib) 
end 

return lib 

lub.class

이것은 현실 세계 최소 클래스 선언 및 설정 시스템으로 여기에 완전한 "helper.lua"파일입니다. 그것은 등과 XML, YAML, 더빙, 많은 luarocks에 사용됩니다