А, да, извините.
Итак, для того что-бы им вообще можно было воспользоваться нужно загрузить Main.lua как библиотеку. Это делается примерно так:
local OE = loadfile("/OpenGames 2/Main.lua")()
Поскольку он "модульный" можно менять расположение главной папки. Оно будет записано в System.getUserSettings.OpenGames2EnginePath (Если вы устанавливали с установщика).
Сделаем для примера радужный квадрат который по клику переместиться к курсору.
Создадим наш квадрат, это панель. Существует множество разных объектов которые подвластны нам, такие как ComboBox, Button, Input, Switch и т.д.
local obj = OE.createObject() -- Создаём объект которые сам добавляется в сцену.
obj:setRenderMode(OE.Render.renderTypes.PANEL) -- Рендерить как панель.
local matID = obj:addComponent(OE.Component.componentTypes.MATERIAL) -- Что-бы у нашего квадрата был цвет
obj.Transform.Scale.Width = 10 -- Размер длинны
obj.Transform.Scale.Height = 5 -- Размер высоты, в два раза меньше длинны
После сделаем окно и покажем пользователю:
OE.Project.Window.Color = 0x505050
OE.Project.Window.Width = 160
OE.Project.Window.Height = 50
OE.Project.Window.Title = "Это куб"
OE.initWindow() -- Принять нынешние значения и пересоздать окно с ними
Создадим файл для нашего скрипта и добавим его к нашему объекту:
local function update(...)
local args = {...}
args[1].Components[matID].Color.First = math.random(0x0,0xFFFFFF) -- Именение цвета. Поскольку update вызываеться asap оно бует менять его довольно выстро. Что нам вроде-бы и надо.
if args[2].lastEvent[1] == "drag" or args[2].lastEvent[1] == "drop" or args[2].lastEvent[1] == "touch" then -- lastEvent это буквально последнее событие
args[1].Transform.Position.x = args[2].lastEvent[3]-math.ceil(args[1].Transform.Scale.Width/2)-args[2].Render.Window.x -- args[1] Это объект от имени которого запустился скрипт. args[2] это OE для вызываемых скриптов. То-есть мы находим середину для x относительно того куда мы кликнули, ..
args[1].Transform.Position.y = args[2].lastEvent[4]-math.ceil(args[1].Transform.Scale.Height/2)-args[2].Render.Window.y -- .. как и для y
end
end
OE.Storage.createFile(OE.CurrentScene.Storage,'Script.lua',{Update=update})
obj.Components[obj:addComponent(OE.Component.componentTypes.SCRIPT)].file = "Script.lua" -- addComponent вернёт номер компонента в obj.Components, а мы его сразу подхватываем и изменяем значение file для скриптa на наш файл. Оно найдёт его везде, в файлах сцены или файлах проекта.
OE.Script.Reload() -- Перезагружаем все наши скрипты добовляя наш.
Добавим нашу милашку к рендеру и готово
obj:addToRender()
Итог:
local OE = loadfile("/OpenGames 2/Main.lua")()
local obj = OE.createObject()
obj:setRenderMode(OE.Render.renderTypes.PANEL)
local matID = obj:addComponent(OE.Component.componentTypes.MATERIAL)
obj.Transform.Scale.Width = 10
obj.Transform.Scale.Height = 5
OE.Project.Window.Color = 0x505050
OE.Project.Window.Width = 160
OE.Project.Window.Height = 50
OE.Project.Window.Title = "Это куб"
OE.initWindow()
local function update(...)
local args = {...}
args[1].Components[matID].Color.First = math.random(0x0,0xFFFFFF)
if args[2].lastEvent[1] == "drag" or args[2].lastEvent[1] == "drop" or args[2].lastEvent[1] == "touch" then
args[1].Transform.Position.x = args[2].lastEvent[3]-math.ceil(args[1].Transform.Scale.Width/2)-args[2].Render.Window.x
args[1].Transform.Position.y = args[2].lastEvent[4]-math.ceil(args[1].Transform.Scale.Height/2)-args[2].Render.Window.y
end
end
OE.Storage.createFile(OE.CurrentScene.Storage,'Script.lua',{Update=update})
obj.Components[obj:addComponent(OE.Component.componentTypes.SCRIPT)].file = "Script.lua"
OE.Script.Reload()
obj:addToRender()
Теперь давайте сделаем тоже самое в сырую...
Итог:
local GUI = require("GUI")
local System = require('System')
local wk,win = System.addWindow(GUI.titledWindow(1,1,160,50,'Это куб',true))
win.backgroundPanel.colors.background = 0x505050
win.titlePanel.colors.background = 0x505050
local panel = win:addChild(GUI.panel(1,1,10,5,0x0))
wk.eventHandler = function(_,_,...)
local args = {...}
panel.colors.background = math.random(0,0xFFFFFF)
if args[1] == 'touch' or args[1] == 'drop' or args[1] == 'drag' then
panel.localX = args[3]-math.ceil(panel.width/2)-win.localX
panel.localY = args[4]-math.ceil(panel.height/2)-win.localY
end
end
win:draw()
По символам он меньше.
В обоих OE есть редактор в котором можно наглядно отредактировать расположение объектов, а в сыром запускай кучу раз.
Минусы и плюсы использование движка:
+ Просто для освоения
+ Наглядно
- Грамоздко (большие файлы)
- События медленные (Разница между сырым и движком видна, причём очень сильно. Не знаю с чем это связано.)
Можно еще сравнить Unity и какой ни-будь pygame. Разница размера файлов колоссальная, но большинство используют юнити т.к. в pygame и я не очень разобрался...
Я не очень понимаю как находить сильные и слабые стороны в своём-же продукте...