Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 1 из 1
  1. #1
    Аватар для Disinterpreter
    Проверенный

    Статус
    Оффлайн
    Регистрация
    02.01.2014
    Сообщений
    88
    Репутация:
    91 ±

    Введение в ООП в MTA

    Я не собираюсь объяснять, что такое ООП и для чего оно нужно так как в википедии это уже описано, я лишь расскажу, как пользоваться предоставляемыми в 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.
    Последний раз редактировалось Disinterpreter; 06.02.2016 в 18:52.

  2. 7 пользователя(ей) сказали cпасибо:
    $continue$ (06.02.2016) Daniel_Cortez (06.02.2016) Desulaid (06.02.2016) L0ndl3m (06.02.2016) Osetin (06.02.2016) Ray_Grand (06.02.2016) [ForD] (06.02.2016)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

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