x

#{title}

#{text}

x
error

#{title}

#{text}

x
success

#{title}

#{text}

Гробница Саргераса (7/9 Мифик)

Аддоны WoW: Lua и графика на экране

Sun Nov 2015 22:05, добавлено пользователем admin

Dev

     Всем привет! С вами снова Виетт! В прошлой статье мы с вами поговорили о том что такое аддоны WoW, как они работают и что нужно для того чтобы написать свой собственный простейший аддон. Также мы сделали заготовку нашего будущего аддона. В этой статье мы поговорим о скриптовом языке Lua, о его базовых элементах и как с помощью него, используя WoW API, создать графическое окно в игре и вывести туда тест.

Итак, приступим!

Часть 1: Теория Lua.

     Как вы могли уже видеть, используя готовые аддоны, у почти большинства аддонов есть некий графический интерфейс. У каких-то он состоит всего из одного окна, у других целые группы окон, а у каких-то его и вовсе нет. Графический интерфейс на самом деле очень важная часть аддона потому что именно в ней отображается, в удобном пользователю виде, информация. Что же нам предлагают разработчики Blizzard? В WoW api существует три варианта, которыми можно сделать интерфейс для своего аддона:

  • использовать готовые варианты от разработчиков (стандартные рамочки, кнопочки которые можно видеть в стандартном интерфейсе игры)
  • использовать готовые решения из сторонних библиотек (всякие готовые сборки UI)
  • создать самому, используя данные разработчиками возможности (требуется больше навыков программирования)

     В этой статье мы попробуем создать самостоятельно графическую составляющую нашего аддона, а также выведем туда текст "Hello World".

     С чего же начать? Если вы внимательно читали прошлую статью, то могли заметить что в разработке аддонов используется скриптовый язык Lua. Ни один серьезный язык программирования не обходится без т.н. "переменных", таких специальных штуках в которых хранятся некие данные. Поэтому как и в любой другой программе, при разработке аддона нам потребуются переменные, в которые мы положим различные данные(расположение рамки на экране, расположение текста в рамке, размеры рамок, шрифт и т.д.). В языке lua все переменные не имеют типа(тип данных - специальный параметр, который указывает какого рода данные находятся в переменной), это сильно упрощает работу новичкам в программировании, но также и усложняет жизнь опытным разработчикам, но сейчас не об этом! Ввиду этого мы можем спокойно написать a = 3 или b = "Hello" и будет все хорошо. Обращаю внимание, имена переменных должны состоять только из латинских букв и специального символа _. Например, a, b, test, my_var, hard_rock и т.д.

     Прежде чем приступать к работе нам нужно еще освятить такое понятие как процедура и функция. Процедура - законченный фрагмент кода выполняющий определенные действия и не возвращающий нам результат своей работы. Функция же после выполнения работы всегда возвращает нам какую-либо информацию. WoW API по большей части использует только функции т.е. когда выполнилась какая-то инструкция мы обязательно знаем результат(например, успешно или нет). Использовать функции легко, досточно знать имя функции. Например, у нас есть функция "Создать печеньки", в качестве результата возвращает два возможных значения 0 - безуспешно и 1 - успешно.

     Для использования достаточно завести переменную с любым именем например "gg". Использование функции тогда будет выглядеть следующим образом:

local gg = CreateCookies()

     После выполнения этой функции в переменную gg положится результат. Для просмотра достаточно использовать процедуру print(). Итого получается:

local gg = CreateCookies()
print(gg)

     На экране будет выведен результат 0 или 1.

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

Часть 2: Процедуры и функции WoW API

     В этой части рассмотрим некоторые базовые процедуры и функции, а также механизм их работы, предлагаемые нам API компании Blizzard.

     Для начала хочется сказать о базовой процедуре "print()", данная процедура выводит на экран любой текст и данные из наших переменных. Очень полезная вещь в отладке. В игре вывод информации происходит в главное окно чата, никто не видит эту информацию кроме нас, поэтому если нужно проверить какие-то значения или вычисления в нашем аддоне, то можно смело выводить их таким образом.

     Итак, как же создать рамку в WoW на экране,с помощью аддона? Оказывается все проще чем кажется на первый взгляд!

     Для создания рамки на экране достаточно знать функцию CreateFrame(). У каждой функции может быть список передаваемых параметров(значений для работы функции). Все параметры перечисляются в скобках после имени функции через запятую. Например, базовая версия функции для созданя рамки выглядит так:
CreateFrame("frameType"[, "frameName"[, parentFrame[, "inheritsFrame"]]]).
Все что заключено в "[ ]" являются необязательными параметрами т.е. параметрами которые если не указать, то все не сломается, но если не указан "frameType", то никакой рамки на экране не отобразится. Мы будем использовать frameType = "Frame" и больше ничего. Поэтому наша рамка будет создаваться так:

my_frame = CreateFrame("Frame")

     На этом всё! Мы сделали рамку, но ее не видно на экране. Для того чтобы рамка показалась и перестала прятаться на нужно указать для нее размеры, фон и задать позиционирование.

     Допустим, я хочу видеть рамку по центру экрана с размерами 300*300 и полупрозначным темным фоном. Для задания размера используется функция SetSize(width, height), где width - ширина рамки, height - высота. Оба параметра являются обязательными. За позиционирование отвечает функция SetPoint(point, ofsx, ofsy), где point - точка куда крепится рамка на экране(нам нужно в центре, используем "CENTER") ofsx, ofsy - сдвиг по осям от точки крепления.

     Мы задали размеры и выровняли нашу рамку, но ее все равно не видно на экране. Почему? Потому что она полностью прозрачна! Для того чтобы увидеть наше творение нужно задать рамке текстуру, выше мы договорились сделать полупрозрачную текстуру темного цвета. Для создания текстуры нам нужна функция

texture = Frame:CreateTexture(["name" [, "layer" [, "inherits" [, sublevel]]]])
Параметры:

  • name - глобальное имя для текстуры(для дальнейшего использования в коде)
  • layer - слой в игре(фоновая текстура, основная и т.д.)

     Последние параметры нас не интересуют, они не важны для создания простейшей текстуры поэтому их значения в этой функции будет равно nil т.е. пусто или фиксированные значения. Текстура создана, остается задать ей значения цвета. Сделать это можно функцией SetTexture(r, g, b, a) где r,g,b - цветовые компоненты красный, синий, синий; a - alpha значение прозрачности для данной текстуры, у нас будет 0.5 т.е. полупрозрачной.

     После нехитрых манипуляций мы увидим по центру экрана черный полупрозрачный квадратик. Поздравляю! Вы только что создали свою первую рамку в игре WoW.

Часть 3: От теории к практике

     Что ж с теорией пока все, приступим к практике. Нам понадобится наша заготовка с прошлого раза. Открываем файл core.lua удаляем оттуда все содержимое и начинаем создавать нашу рамку!

local my_frame = CreateFrame("Frame", "my_frame", UIParent) -- создание рамки

my_frame:SetSize(300, 300) -- задаем размеры
my_frame:SetPoint("CENTER",0,0) -- задаем позиционирование по центру без сдвига по осям

my_frame.back = my_frame:CreateTexture(nil, "BACKGROUND",nil,-7) -- создаем текстуру
my_frame.back:SetAllPoints() -- блокируем все точки крепления рамки, чтобы ничего не поломалось
my_frame.back:SetTexture(0, 0, 0, 0.5) -- задаем черный цвет и прозрачность 0.5

     Сохраняем файл и запускаем игру(либо /reload в игре). Видим результат - рамку по центру экрана. Для отображения текста дописиваем в конце:

my_frame.text = my_frame:CreateFontString(nil, "BACKGROUND", "PVPInfoTextFont"); -- создаем шрифт
my_frame.text:SetAllPoints(); -- блокируем все точки крепления рамки, чтобы ничего не поломалось
my_frame.text:SetText("Hello World") -- задаем текст

     Сохраняем файл и запускаем игру(либо /reload в игре). Видим результат - рамку по центру экрана а по центру текст "Hello World".

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

     Удачи в обучении!

Комментарии

Нет комментариев
Рейтинг
Набор игроков
class 6 Жрец
    Тьма высокий
class 7 Разбойник
    Скрытность средний
class 9 Чернокнижник высокий
Подать заявку