Jump to content

Recommended Posts

Собственно я знаю, что в Lua нет классов, но они могут быть "эмулированы" с помощью Lua-таблиц или userdata.

Я с Lua имел дело только в сталкере, попытался сделать всё привычным образом.. Но так как в сталкере все классы уже созданны, в MTA мне пришлось делать велосипед самому D:

  
local rightclick_menu = { }; 
local rightclick_menu_meta = { __index = rightclick_menu }; 
  
setmetatable( {}, rightclick_menu_meta ); 
  
function rightclick_menu:__init() -- вызываю из main() 
    self:InitControls(); -- создаём элементы GUI 
    self:InitCallBacks(); -- добавляем эвенты 
end 
  
function rightclick_menu:InitControls() 
    self.list               = self:CreateGridList( 0, 0, .13, .08, true ); 
    self.list:SetSelectionMode      ( 0 ); 
    self.list:SetSortingEnabled     ( false ); 
     
    self.list_Column            = self.list:AddColumn( " ", .8 ); 
     
    self.list:SetVisible            ( false ); 
end 
  
function rightclick_menu:InitCallBacks( ) -- добавляю эвент на GridList 
    addEventHandler( "onClientGUIClick",  self.list, self:OnList_clicked ); -- function arguments expected near ',' 
end 
  
function rightclick_menu:OnList_clicked( button, state ) 
    if button == "left" and state == "up" then 
        -- бла бла бла 
    end 
end 
  
function main() 
    if gui.rc_dlg == nil then -- массив gui ={} создан в главном файле ресурса. (client-side естественно) 
        gui.rc_dlg = rightclick_menu(); 
        gui.rc_dlg:__init(); 
    end 
end 
addEventHandler( "onClientClick", root, main ); 
  

В общем проблема караз в этом варнинге ( на строке 23 ) из-за которого ничего не работает и остановилось продвижение..

Просьба не ругаться, ибо с Lua работал в сталкере и то давно, поэтому осталось много привычек оттуда и подзабытый синтаксис Lua :D

Link to comment

"self:OnList_clicked" - это ты уже вызываешь функцию, просто "self.OnList_clicked" в addEventHandler. Разница в том что функции вызванные с двоеточием передают объект на котором они вызваны в первом аргументе, то есть self:OnList_clicked() это то же самое что self.OnList_clicked ( self ) или rightclick_menu.OnList_clicked ( self )

Link to comment

табличная эмуляция выглядит проще, именно поэтому ее юзаю, дабы было понятно для других скриптеров, а не только мне

названиеКласса = {} 
  
function названиеКласса.создатьОбъект ( начальныеПараметрыОбъекта ) 
    local self = {} -- объект класса 
  
    local приватнаяПеременная = 123 
    self.публичнаяПеременная = 456 
  
    local function приватныйМетодОчисткиТаблицы ( таблица ) 
        local индекс = next(таблица) 
        while индекс do 
            if type(таблица[индекс]) == 'table' then 
                приватныйМетодОчисткиТаблицы(таблица[индекс]) 
            end 
            таблица[индекс] = nil 
            индекс = next(таблица, индекс) 
        end 
    end 
  
    function self.__конструктор ( начальныеПараметрыОбъекта ) 
         приватнаяПеременная = начальныеПараметрыОбъекта 
    end 
  
    function self.__деструктор ( ) 
        приватныйМетодОчисткиТаблицы(self) 
        приватнаяПеременная = nil 
    end 
  
    self.__конструктор( начальныеПараметрыОбъекта ) -- запуск конструктора 
  
    function self.публичныйМетод ( ... ) 
        outputChattBox( 'приватнаяПеременная = ' .. tostring(приватнаяПеременная) ) 
    end 
  
    return self 
end 
  
function названиеКласса.уничтожитьОбъект ( объект ) 
    объект.__деструктор() 
    объект = nil 
end 

local мойОбъект = названиеКласса.создатьОбъект( 777 ) 
мойОбъект.публичныйМетод() 
названиеКласса.уничтожитьОбъект( мойОбъект ); мойОбъект = nil 

это так, чистая фантазию должна быть у скриптера. На самом деле из таблиц можно создавать свою уникальную логику и иерархию, непохожую на классы, объекты и прочий стандартный набор.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...