Показано с 1 по 2 из 2

Тема: Введение в MTA OOP

  1. #1
    Диванный критик
    Регистрация
    03.07.2011
    Адрес
    Вологда
    Возраст
    29
    Сообщений
    2,107
    Репутация: 269

    Звание: как роза среди колючек

    Введение в MTA OOP

    Я не собираюсь объяснять, что такое ООП и для чего оно нужно так как в википедии это уже описано, я лишь расскажу, как пользоваться предоставляемыми в MTA методами.

    Итак, создадим ресурс, назовем его oop-tutorial, в нем создадим файлы oop_s.lua и meta.xml.
    В meta.xml напишем:
    Код HTML:
    <meta>
    	<oop>true</oop>
    	<script src="oop_s.lua" type="server" />
    </meta>
    Обратите внимание на строку "<oop>true</oop>". По умолчанию ООП в MTA не используется и его нужно активировать вручную.
    При включении ООП изменяется поведение некоторых функций, каких именно - увидите далее.

    Затем откроем файл oop_s.lua и приступим к написанию кода.
    Для начала давайте попробуем получить координаты игрока: для этого нам нужно создать команду /pos.

    PHP код:
    local function commandPos (pPlayer)
        
    local vec pPlayer:getPosition()
        -- 
    Интересный моментvec у нас в ООП стиле становится областью класса Vector,
        -- 
    т.е., в отличие от процедурного стиляв стиле ООП метод getPosition
        
    -- возвращает объект вектораа не три координаты (xyz).
        
    outputChatBox("Your position: ".. vec:getX() ..", "..vec:getY()..", "..vec:getZ())
    end
    addCommandHandler
    ("pos"commandPos
    При вводе команды в чат будут выведены ваши координаты, например: «Your position: 2031.8203125, 1523.3330078125, 10.8203125».

    Попробуем провернуть нечто подобное с транспортом. Будем менять цвет машине, в которой мы сидим, для этого создадим еще команду /carcolor
    PHP код:
    local function commandCarColor (pPlayer)
        
    local pVehicle pPlayer:getOccupiedVehicle()
        -- 
    Если pVehicle ~= nilто игрок сидит в машине.
        if 
    pVehicle then
            
    -- Если дато устанавливаем цвет на красный в формате RGB.
            
    pVehicle:setColor(255,0,0)
        else
            -- 
    Если нетто пишем уведомление.
            
    outputChatBox("You're not in a vehicle")
        
    end
    end
    addCommandHandler
    ("carcolor"commandCarColor
    В итоге, если сядем в машину и введем /carcolor то мы сменим цвет нашему транспорту, если транспорт позволяет менять цвета.

    Теперь возьмем пример покруче, нам нужно создать класс. Мы, конечно, можем изучать все эти метатаблицы и шаманить руками, но можно поступить и проще.
    Зайдем на https://github.com/sbx320/lua_utils, скачаем оттуда файл classlib.lua и добавим в наш meta.xml.
    С помощью этого скрипта сделаем базовый класс для дальнейшего удобства, назовём его CObjects. Файл назовём CObjects.lua добавим его в манифест (meta.xml).
    Реализуем в классе функции new и delete, которые также попадут и во все наследуемые от него классы:

    PHP код:
    CObject = {}

    function 
    CObject:new(...)
            return new(
    self, ...)
    end

    function CObject:delete(...)
            return 
    delete(self, ...)
    end 
    Далее мы будем наследоваться от этого класса. Создадим второй класс CNumbers, там мы поиграемся с числами. Назовем файл CNumbers.lua и точно так же добавим его в манифест(meta.xml).

    PHP код:
    -- Наследуем новый класс от ранее созданного CObject.
    CNumbers inherit(CObject);

    -- 
    Задаем параметры num1 и num2 в конструктор,
    -- 
    чтобы при создании экземпляра класса (объектаих записать.
    function 
    CNumbers:constructor(num1num2)
        
    self.m_num1 num1;
        
    self.m_num2 num2;
    end

    -- Реализуем различные арифметические операции над числами.
    function 
    CNumbers:add()
        return 
    self.m_num1 self.m_num2;
    end

    function CNumbers:sub()
        return 
    self.m_num1 self.m_num2;
    end

    function CNumbers:mul()
        return 
    self.m_num1 self.m_num2;
    end

    function CNumbers:div()
        return 
    self.m_num1 self.m_num2;
    end

    function CNumbers:destructor ()
        print(
    "hey! I'm a destructor")
    end
    -- создаем экземпляр класса и задаем числа
    numbers 
    CNumbers:new(1,2)
    -- 
    производим сложение и выводим
    print(numbers:add())
    -- 
    проверяем работу деструктора
    numbers
    :delete() 


    В самом начале урока я думал, что этот урок нужно написать, но я не знал что сюда написать конкретно, поэтому сделал как есть.
    Эту статью я писал для тех, кто знаком с принципом ООП, но не знает как он реализуется в МТА.
    Если вам этот урок показался не полным или у вас есть ещё какие-то замечания, напишите об этом в комментариях и я исправлю недочёты или постараюсь реализовать предложенное в следующих уроках.

    Важное замечание: Файлы в meta.xml стоит добавлять в том же порядке, в котором они будут загружаться в ресурсе, т.е сначала библиотека, родительские классы, дочерние классы.


    Автор: Disinterpreter
    Редактор: Daniel_Cortez


    Эта статья доступна по лицензии Creative Commons «Attribution-ShareAlike » 4.0.
    Если не выходить за границу «объектно-ориентированных» методов, чтобы остаться в рамках «хорошего программирования и проектирования», то в итоге обязательно получается нечто, по большей части не имеющее смысла. (C) Bjarne Stroustrup


    http://www.lua.org/about.html
    Please do not write it as "LUA", which is both ugly and confusing, because then it becomes an acronym with different meanings for different people. So, please, write "Lua" right!

  2. 7 пользователей сказали cпасибо Disinterpreter за это полезное сообщение:

    Folleah (06.02.2016), RastaOrecha (26.02.2016), SDraw (06.02.2016), vasyok28 (06.02.2016), Меша (06.02.2016), Фора (06.02.2016)

  3. #2
    Люблю Окса :3 Аватар для Folleah
    Регистрация
    26.09.2012
    Сообщений
    2,045
    Репутация: 184

    Звание: - весьма и весьма положительная личность
    ООП форева

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •