LINUX.ORG.RU

Мой редактор уровней, в разработке

 ,


7

6

Пишу вот редактор уровней, Tiled мне оказалось мало, решил сделать что-то более сложное, чтобы можно было расставлять объекты как угодно, возможность создавать тайловые карты, менять топологию объектов (например чтобы сделать красивый блоб), назначать классы, менять ограничивающие полигоны, настраивать анимацию, ну и базовые деформации (хотя возможно их и не будет), так же хотелось сделать обрезание объектов, если слишком большой, чтобы не рисовать 2 разные текстуры, можно просто обрезать топологию.

Да дизайн похож на блендеровский, и не с проста, я ориентировался на бледеровский интерфейс, иконки тоже от туда взяты, со временем конечно придется их перерисовать. Так же позаимствовал панельку сверху тоже из идею нового UI для блендера. К сожалению толком своего ничего придумать не могу, а программа нужна, ну и интересно было ее поделать и реализовать интерфейс полностью на OpenGL.

Сейчас программа активно используется мною, для создани игры на Haxe, написал простой фреймворк для загрузки карт созданных в этом редакторе для него, в будущем будет еще и C++. Для меня программа оказалась очень даже полезной )

В будущем хочу сделать открытый доступ к программе, но не уверен что буду открывать исходники, т.к. скажу честно, боюсь критики )) И самое наверное элементарное здесь, что я не через makefile сделал, а через башскрипты, и один файл main.cpp инклудит все заголовочные файлы и исходный код! Я до этого много работал на дельфи, и пересел на C++ года 2 назад, и когда уже было очень многое написано, я только понял что я налажал, но уже поздно, а все переписывать не очень хочется.
Еще скриншоты:
http://habrastorage.org/files/7b3/c85/958/7b3c85958c004fafbd1200b9aab3abc7.png
http://habrastorage.org/files/f1b/c5e/62a/f1bc5e62a6ea4967abcb5940d0b9e6c5.png
http://habrastorage.org/files/1bf/504/3a4/1bf5043a42c444ba84f5b4c64614ba1f.png

А раньше он выглядел вот так:
http://habrastorage.org/files/667/d86/820/667d86820eb4476ab90bc2e3fd4895c2.png

Виде игры которую я делаю на Haxe, только приступил к работе:
http://www.youtube.com/watch?x-yt-ts=1421828030&x-yt-cl=84411374&v=CO...

>>> Просмотр (1920x1080, 238 Kb)

★★★

Проверено: JB ()

интересненько. А как редактор уровней 3д использовать можно будет?

OpenMind ★★★ ()
Ответ на: комментарий от OpenMind

тут только 2D, для 3D и так много редакторов есть.

Int64 ★★★ ()

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

идею нового UI для блендера

zezic ★★★★ ()

Прилично. Контролы цельнотянутые из блендера?

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

Контролы сам писал на OpenGL, у блендера смотрел как эти контролы работают )

Int64 ★★★ ()

За UI ставлю 5. На чём он сделан, что использовалось, примеры кода :)

xterro ★★★★★ ()

но не уверен что буду открывать исходники, т.к. скажу честно, боюсь критики ))

Наоборот, заинтересованные люди помогут исправить ошибки и привнести реализации новых идей.

void_ptr ★★★★ ()
Ответ на: комментарий от xterro

Спасибо, все на чистом OpenGL через VBO рисуется интерфейс, по кусочкам кнопка выстраивается и на нее нужный кусочек текстуры накладывается, вот из этой текстуры берутся все элементы:
http://habrastorage.org/files/8b2/c59/698/8b2c5969867b4f3ab7c59a6feaad5431.png

А чего именно пример кода? У меня отдельный файл есть, который для всех элементов рассчитывает предварительно текстурные координаты для элементов, чтобы не на каждом кадре, и весь этот предрасчет на 1000 строк кода растянулся :)

Вот пример стандартных компонентов, к сожалению на тот момент я ленился писать комментарии, потом хочу ко всему коду комментарии сделать
UIStdCtrls.h
https://gist.github.com/anonymous/517f865550500e1b1c0b
UIStdCtrls.cpp
https://gist.github.com/anonymous/33e8c5d0b2e93e9409d6

Int64 ★★★ ()

Срочно в Git

Очень полезная штука. Открывай исходники никто тебя критиковать не станет а вот заинтересованные люди помогут привести код в порядок.

hohhalf ()
Ответ на: комментарий от void_ptr

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

Int64 ★★★ ()
Ответ на: Срочно в Git от hohhalf

У меня репозиторий на bitbucket есть, но он закрытый пока

Int64 ★★★ ()

ничо так, в опен сурсе будет?

umren ★★★★★ ()

Вы молодец! Мне бы так писать.

karmich ()
Ответ на: комментарий от Int64

А, понял, весь UI это по сути OpenGL окно, на котором отрисовываются все эти «кнопки», так? Осталось понять как оно позиционируется(в коде не увидел координат, или позиционируется каким-то «менеджером раскладки»), как добавляются и как обрабатываются события. Интересно же :)

xterro ★★★★★ ()

Приятный редактор. Качества кода я не стал-бы стесняться и смело выложил-бы на github. Скрипты для сборки народ тебе поможет поправить.

Я сам сначала побаивался свои быдлоподелки выкладывать, но потом переборол себя. Не везде народ такой как на LOR: все баги конструктивные, люди благодарят за труды.

jekader ★★★★★ ()

для создани игры на Haxe

:)

yoghurt ★★★★★ ()

Молодец. Тоже недавно был интерес по разработке UI на чистом openGl, как у blender, но как-то времени нет. Используешь openGL 4 ? Т.е. шейдеры и вся отрисовка на них или по старинке 2.x c glBegin и glEnd ?

SergikXP ()
Последнее исправление: SergikXP (всего исправлений: 1)

Выглядит круто и фичи судя по описанию крутые.

Tark ★★ ()

Код практически у всех критикуют. Это ещё не повод :)

AP ★★★★★ ()
Ответ на: комментарий от SergikXP

Через OpenGL 3.3 вообще отрисовываю все, через шейдеры, а вот сетку и всякие линии по старинке рисую через glBegin/glEnd

Int64 ★★★ ()
Ответ на: комментарий от jekader

Уговорили выложить )) скоро весь код тогда перенесу на гитхаб

Int64 ★★★ ()
Последнее исправление: Int64 (всего исправлений: 1)
Ответ на: комментарий от xterro

в методе Draw там есть примерно такой вот код, им и позиционируется:

	glUniformMatrix4fv (Shader->Locations->GetData("MVP"), 1, GL_FALSE, &(MiddleElement->MVPMatrix[0][0]));
	glUniform2f (Shader->Locations->GetData("Size")  , Widths  [n+1], Heights [n+1]);
	glUniform2f (Shader->Locations->GetData("Offset"), OffsetsX[n+1], OffsetsY[n+1]);
	//
	if (dynamic_cast<UICheckButton*> (this) && Parent != 0)
		poffset = 1;
	//
	MiddleElement->SetPosition (glm::vec2(Left+iWidths[n+1]-poffset, WindowHeight-iHeights[n+1]-Top));
	MiddleElement->SetSize (glm::vec2(cWidth-iWidths[n+2]+poffset, iHeights[n+1]));
	MiddleElement->BaseRender();

События через указатели на функцию. Все же сам UI еще сыроват, не доработан, когда менюшка выпадает, при клике на пункт меню не исчезает, и если под кнопочкой есть еще кнопочка, то она и ее нажмет ))

Int64 ★★★ ()
Ответ на: комментарий от Int64

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

Если у кода отсутствует какое-либо обременение — смело выкладывай. Критикунов сразу посылай по направлению «сперва добейся».

Гит (и гитхаб) хороши исключительно тем что кто угодно может творить чего угодно, но в то же время кто угодно может скомпилировать рабочую версию.

P.S.: А вообще «вот доделаю до рабочей версии» — самое унылое заблуждение от программирования. Факт.

Macil ★★★★★ ()
Ответ на: комментарий от Int64

Ты автор, тебе и выбирать лицензию :) GPL вполне нормально для софта такого класса. Ну и если есть заимствования из других проектов - правильней будет сохранить их лицензию (у Blender это GPL2+)

jekader ★★★★★ ()

делаю на Haxe

я год назад активно тыкал его, сделал примитивный платформер на OpenFL и Haxeflixel, там сейчас все так же OpenFL рулит и педалит или что то новое появилось?

umren ★★★★★ ()
Ответ на: комментарий от umren

ну да в основном OpenFL, я с его помощью использую OpenGL и удачно скомпилировал на Android. Есть еще snowkit, но его я не пробовал.

Int64 ★★★ ()

А интеграция глобального меню Unity будет поддержена? :)

false13 ()

но не уверен что буду открывать исходники, т.к. скажу честно, боюсь критики

Если не откроешь исходники, обязательно раскритикую и назову копирастом. Лучше прямо сейчас на github залить.

Сначала решил, что интерфейс скопипасчен из блендера, выдали только прямые углы у кнопок.

Klymedy ★★★★★ ()
Ответ на: комментарий от Klymedy

Я выше уже писал, что сегодня и выложу исходники. Ну и с блендера срисовывал интерфейс )

Int64 ★★★ ()
Ответ на: комментарий от false13

Была такая идея, но пока не планирую, сначала основной функционал уж сделаю, а потом можно будет о таком подумать.

Int64 ★★★ ()
Ответ на: комментарий от Int64

Хорошо, правда я не понимаю, зачем выкладывать под второй, когда вышла третья, неужели так хочется тивоизации или использован код под второй? И еще: проект GNU рекомендует называть файл не LICENSE, а COPING, и хорошо-бы добавить уведомление во все файлы:

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Klymedy ★★★★★ ()
Ответ на: комментарий от Klymedy

Я в лицензиях не разбираюсь, поменяю на третью

Int64 ★★★ ()
Ответ на: комментарий от Klymedy

А вот на гитхабе есть такая вкалдка: issues, туда можно создавать темы с текущими заданиями, т.е. нужно доработать или добавть основной функционал итд, в принципе у меня есть odt файл со всем этим.

Int64 ★★★ ()
Ответ на: комментарий от Int64

Odt лучше, чем doc(x), но это формат документов, не надо его использовать в качестве баг-трекера.

Klymedy ★★★★★ ()
Ответ на: комментарий от Klymedy

Понятно, спасибо, кстати вот список библиотек которые я использовал:

soil
glew32
sfwml-2.1
ftgl
freetype2
glm
tinyxml

Int64 ★★★ ()
Ответ на: комментарий от Int64

Бросилось в глаза.

1. Тут объявлена структура:

struct Color { float r,g,b; };

А тут просто массив флоатов:

float TextColor [3]; float ShadowColor [3];

2. В UIEdit виртуальные методы есть, а виртуального конструктора нет.

3. Рендерер стоит вынести как отдельную сущность.

4. В конструкторе стоит использовать список инициализации.

5. В деструкторе есть такое:

delete LeftElement;
delete RightElement;
delete MiddleElement;
delete IconElement;
delete IconElement2;
но в конструкторе эти мемберы не инициализируются. Что будет, если создать объект, но не вызвать init(), а потом разрушить объект?

6. Тут можно и без goto обойтись. Будет красивее:

if (Transparent) goto DrawContent;

7. А тут стоит использовать else:

if (DrawAlign == alLeft)   Left   += iWidths[n]+iWidths[n+2];
//if (DrawAlign == alLeft)   cWidth += iWidths[n]+iWidths[n+2];
if (DrawAlign == alCenter) cWidth -= iWidths[n]-iWidths[n]-iWidths[n+2]-iWidths[n+2];
//
if (DrawAlign == alLeft || DrawAlign == alAll) {

8. Ну и частые bindtexture не лучшее решение. Лучше биндить только при смене текстуры.

9. Может стоит разнести виджеты по разным h/cpp?

Это так, стимул для запуска vim и мелкого рефакторинга.

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

Посмотрите файл UI/src/UIPreComputed.cpp
там конструкторы, и объявление некоторых методов.
Разделить на виджеты хорошая идея, надо будет этим заняться, но думаю потом, сейчас хочу документацию кода сделать, т.е. в самом коде пока нормальные комментарии написать к коду.

Int64 ★★★ ()
Последнее исправление: Int64 (всего исправлений: 2)
Ответ на: комментарий от andreyu

А можете примерно написать как хорошо было бы сделать структуру? на простом примере.

Int64 ★★★ ()
Ответ на: комментарий от Int64

Посмотрите файл UI/src/UIPreComputed.cpp
там конструкторы, и объявление некоторых методов.

Нету там конструкторов, только метод init().

Что будет, если сделать так:

{
    UIButton btn;
}
Правильно, в деструкторе будут сделаны delete неинициализированных мемберов.

andreyu ★★★★★ ()
Последнее исправление: andreyu (всего исправлений: 1)
Ответ на: комментарий от Int64

А можете примерно написать как хорошо было бы сделать структуру? на простом примере.

Ну тут вкусовщина в чистом виде, просто разделите все. Я бы сделал как-то так:

src/
   ui/{*.h,*.cpp}
   core/{*.h,*.cpp}
   renderer/{*.h,*.cpp}
   math/{*.h,*.cpp}
projects/
   linux/
   osx/
   windows/
res/
   ui/
   sound/
   strings/
andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

Конструктор UIButton находится в UIStdCtrls.cpp, выше вы писали про delete LeftElement; итд - это просто элементы для отрисовки класса BaseObject, они создаются в методах Init.

Int64 ★★★ ()
Ответ на: комментарий от andreyu

а получается заголовочные файлы и файлы с исходным кодом лучше в одной папке держать?

Int64 ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.