Раз уж начался у меня "словесный понос" про луа, продолжу о полезном и интересном... На этот раз подойду ближе к созданию игр, а именно будем создавать один из элементов игры - инвентарь Движок снова возьму Leadwerks3D, но можно использовать любой другой с небольшими изменениями.
Белый автомобиль - это пустая ячейка (лень было искать другую иконку)
Создадим инвентарь:
Код
inventar={} --таблица инвентаря k=1 --счетчик --укажем каждой ячейке ее место for i=1,kol_row do for j=1,kol_col do local cell={} --таблица ячейки cell.x=size_cell*j cell.y=size_cell*i --cell.status = 0 inventar[k]=cell --загоняем ячейки в таблицу инвентаря k = k + 1 end end
Теперь отрисуем наш инвентарь:
Код
function draw_inventar() for i,cell in ipairs(inventar) do --пробегаемся по массиву инвентаря if cell.object~=nil then --если в ячейке есть объект, то рисуем иконку этого объекта self.context:DrawImage( cell.object.image , cell.x , cell.y , size_cell , size_cell) else self.context:DrawImage( def_image , cell.x , cell.y , size_cell , size_cell) --если в ячейки ничего нет, то рисуем пустую. end end end
проверим:
Код
function App:Start() --эта функция вызывается один раз при запуске
-- функции движка для открытия окна и тд.. self.window=Window:Create(self.title) self.context=Context:Create(self.window,0) self.world=World:Create()
--эта переменная будет хранить координаты курсора мыши mpos = Vec2(1,1)
inventar={} --таблица инвентаря k=1 --счетчик --укажем каждой ячейке ее место for i=1,kol_row do for j=1,kol_col do local cell={} --таблица ячейки cell.x=size_cell*j cell.y=size_cell*i --cell.status = 0 inventar[k]=cell --загоняем ячейки в таблицу инвентаря k = k + 1 end end
--функция рисования инвентаря function draw_inventar() --DrawImage(LoadTexture("abstract::HUDV.dds"), 32,52,300,370) for i,cell in ipairs(inventar) do --пробегаемся по инвентарю if cell.object~=nil then --если в ячейке есть объект, то рисуем иконку этого объекта self.context:DrawImage( cell.object.image , cell.x , cell.y , size_cell , size_cell) else self.context:DrawImage( def_image , cell.x , cell.y , size_cell , size_cell) --если в ячейки ничего нет, то рисуем пустую. end end end
return true end
function App:Loop()
if self.window:Closed() or self.window:KeyDown(Key.Escape) then return false end --для выхода из игры
inventar={} --таблица инвентаря k=1 --счетчик --укажем каждой ячейке ее место for i=1,kol_row do for j=1,kol_col do local cell={} --таблица ячейки cell.x=size_cell*j cell.y=size_cell*i --cell.status = 0 inventar[k]=cell --загоняем ячейки в таблицу инвентаря k = k + 1 end end
--функция рисования инвентаря function draw_inventar() --DrawImage(LoadTexture("abstract::HUDV.dds"), 32,52,300,370) for i,cell in ipairs(inventar) do --пробегаемся по инвентарю if cell.object~=nil then --если в ячейке есть объект, то рисуем иконку этого объекта self.context:DrawImage( cell.object.image , cell.x , cell.y , size_cell , size_cell) else self.context:DrawImage( def_image , cell.x , cell.y , size_cell , size_cell) --если в ячейки ничего нет, то рисуем пустую. end end end
--создадим класс авто class_auto = {} function class_auto:new() local obj = {} obj.image = Texture:Load("auto2.tex") obj.description = "ololo, trololo, blablabla" setmetatable(obj,self) self.__index = self return obj end red = class_auto:new() --создадим красный авто
inventar[1].object=red --запихнем авто в первую ячейку
return true end
function App:Loop()
if self.window:Closed() or self.window:KeyDown(Key.Escape) then return false end --для выхода из игры
--функции движка для обновления и рендера. self.world:Update() self.world:Render() self.context:Clear();
draw_inventar() --рисование инвентаря
self.context:Sync() return true end
Результат
Усовершенствуем инвентарь. По щелчку ЛКМ будем добавлять объект в выбранную ячейку, по челчку ПКМ - удалять, а при нажатии на колесико мыши будем выводить описание объекта. Создадим соответствующие функции:
Код
-- возвращает ячейку на которую указывает курсор мыши function mouse_in_cell() for i,cell in ipairs(inventar) do if mpos.x > (cell.x - size_cell) and mpos.x < (cell.x + size_cell) and mpos.y > (cell.y - size_cell) and mpos.y < (cell.y + size_cell) then return i --возвращаем номер ячейки end end end
-- всплывающая подсказка function help_func() for i=1,kol_cell do if empty_cell_num ~= nil then if inventar[empty_cell_num].object ~= nil and self.window:MouseDown(3) then self.context:SetColor(0,1,1) self.context:DrawText(inventar[empty_cell_num].object.description , mpos.x , mpos.y) end end end end
--функция добавления и удаления объекта function add_dell(obj) -- добавление объекта в инвентарь if empty_cell_num ~= nil then --добавим проверку if self.window:MouseHit(1) then inventar[empty_cell_num].object=obj end end
-- удаление объекта из мнвентаря if empty_cell_num ~= nil then if self.window:MouseHit(2) then inventar[empty_cell_num].object=nil end end end
Если разобраться, то все просто. Первая ф-я возвращает номер ячейки, над которой находится курсор мыши Вторая ф-я выводит описание объекта над ячейкой, на которую указывает курсор мыши Третья ф-я в зависимости от нажатой кнопки, добавляет или удаляет объект, на который указывает курсор мыши
Проверяем... ЛЕВОЙ КНОПКОЙ МЫШИ добавляем объект, ПРАВОЙ -удаляем, а НАЖАТИЕМ НА КОЛЕСИКО - выводим описание объекта. Радуемся!
Код
function App:Start() --эта функция вызывается один раз при запуске
-- функции движка для открытия окна и тд.. self.window=Window:Create(self.title) self.context=Context:Create(self.window,0) self.world=World:Create()
--эта переменная будет хранить координаты курсора мыши mpos = Vec2(1,1)
inventar={} --таблица инвентаря k=1 --счетчик --укажем каждой ячейке ее место for i=1,kol_row do for j=1,kol_col do local cell={} --таблица ячейки cell.x=size_cell*j cell.y=size_cell*i --cell.status = 0 inventar[k]=cell --загоняем ячейки в таблицу инвентаря k = k + 1 end end
--функция рисования инвентаря function draw_inventar() --DrawImage(LoadTexture("abstract::HUDV.dds"), 32,52,300,370) for i,cell in ipairs(inventar) do --пробегаемся по инвентарю if cell.object~=nil then --если в ячейке есть объект, то рисуем иконку этого объекта self.context:DrawImage( cell.object.image , cell.x , cell.y , size_cell , size_cell) else self.context:DrawImage( def_image , cell.x , cell.y , size_cell , size_cell) --если в ячейки ничего нет, то рисуем пустую. end end end
--создадим класс авто class_auto = {} function class_auto:new() local obj = {} obj.image = Texture:Load("auto2.tex") obj.description = "ololo, trololo, blablabla" --описание объекта setmetatable(obj,self) self.__index = self return obj end red = class_auto:new() --создадим красный авто --inventar[empty_cell_num].object=red --запихнем авто во вторую ячейку
-- возвращает ячейку на которую указывает курсор мыши function mouse_in_cell() for i,cell in ipairs(inventar) do if mpos.x > (cell.x - size_cell) and mpos.x < (cell.x + size_cell) and mpos.y > (cell.y - size_cell) and mpos.y < (cell.y + size_cell) then return i --возвращаем номер ячейки end end end
-- всплывающая подсказка function help_func() for i=1,kol_cell do if empty_cell_num ~= nil then if inventar[empty_cell_num].object ~= nil and self.window:MouseDown(3) then self.context:SetColor(0,1,1) self.context:DrawText(inventar[empty_cell_num].object.description , mpos.x , mpos.y) end end end end
--функция добавления и удаления объекта function add_dell(obj) -- добавление объекта в инвентарь if empty_cell_num ~= nil then --добавим проверку if self.window:MouseHit(1) then inventar[empty_cell_num].object=obj end end
-- удаление объекта из мнвентаря if empty_cell_num ~= nil then if self.window:MouseHit(2) then inventar[empty_cell_num].object=nil end end end
return true end
function App:Loop()
if self.window:Closed() or self.window:KeyDown(Key.Escape) then return false end --для выхода из игры
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «LUA: Создание инвентаря», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
беру свои слова обратно строек кода не 20 а 60 а по теме: -растолковано все вполне хорошо; -с учетом того что на код Сталкера вроде не похоже то молодец; -с учетом того что подобных уроков по Луа крайне мало то может тебе стоит продолжить (разумеется если наберется достаточное количество тех кто эти уроки будет читать)ю
кстати, тот инвентарь совершенно иначе сделан, без ООП Да и кода там побольше, в связи с манипулированием игровых объектов спасибо за отзыв! очень приятно
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]