Oleshe 38 Опубликовано: 30 сентября, 2023 (изменено) Привет! Последние 2 месяца я разрабатывал OE 2. Это проект очень схожий с Unity имея дочерний замысел с OpenGames где после изменения объекта не надо писать draw()... Он еще не готов, я хотел релизнуть после того как я его доделаю, но случилось не предвиденное. Из AppMarket-a была удалена либа opengames, что напрямую убивает весь первый движок т.к. оно в зависимостях, и в зависимостях всех дочерних приложений. Мне удалять это было не зачем, да он был поломанный, там объект кнопки не работал. Но это как-то тупо сносить один элемент из 2-, не так-ли? "Какая вообще разница?" Этот проект остался не доделанным, движок готов, установщик движка тоже. Не готов только редактор. Мне симпатизирует этот проект, но я прекращу (или сильно дестабилизирую) свою собственную поддержку данного проекта т.к. не исключаю случайное исчезновение моих продуктов в макрете. Так-же одна из причин это полу-мёртвое комьюнити. За пол года существования первого OpenGames им увлёкся только один человек. И то всё его творчество (хоть и довольно спорное (вирусы(удаление одной папки\файла))) хоть и было довольно спорное, но было удалено самим им. А зачем удалять свой продукт? Движок не нашел людей, а зачем разрабатывать предложение, если нету спроса. Это репозиторий проекта, в нём есть подробная (имхо) вики которая поясняет как работать в движке из скрипта. Так-же есть 2 примера которые могут перекидываться сообщениями между друг-другом. Там целая куча файлов которая добавляет функций в движок с определённой задачей. Цель этого поста: сказать что уже есть неплохие(имхо) наработки графического движка, если кто-то уже собрался что-то делать. Скриншот первой программы для того что-бы разбавить текст: Скрытый текст Изменено 6 ноября, 2023 пользователем Oleshe Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 155 Опубликовано: 30 сентября, 2023 1 час назад, Oleshe сказал: Цель этого поста: сказать что уже есть неплохие(имхо) наработки графического движка, если кто-то уже собрался что-то делать. Тут есть смыл рассказать о возможностях этого движка, зачем он нужен, кому он может пригодиться, и как им пользоваться. 1 час назад, Oleshe сказал: За пол года существования первого OpenGames им увлёкся только один человек. Кстати, людей как раз и может привлечь хорошее описание. Какой бы хорошей ни была программа, пока ты о ней доходчиво не расскажешь, её даже скачивать, скорее всего, никто не будет. А убедить других программистов пользоваться своей библиотекой или движком будет ещё сложнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Oleshe Автор темы 38 Опубликовано: 1 октября, 2023 (изменено) 18 часов назад, eu_tomat сказал: Тут есть смыл рассказать о возможностях этого движка, зачем он нужен, кому он может пригодиться, и как им пользоваться. А, да, извините. Итак, для того что-бы им вообще можно было воспользоваться нужно загрузить 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 и я не очень разобрался... Я не очень понимаю как находить сильные и слабые стороны в своём-же продукте... Изменено 1 октября, 2023 пользователем Oleshe 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах