IPB

 
>

Курилка программистов

, Флуд на около программерские темы

 
 Молния в вакууме
сообщение 28.08.2016, 23:32
Сообщение #1


Почти Игроман
*********

Группа: Участник
Сообщений: 614
Регистрация: 05.05.2007
Пользователь №: 6215



Цитата(refuse @ 28.08.2016, 22:08) *
суровый код quake на чистом си

Чистый C - это круто.
Однажды я скомпилировал ваш движок на C борландовским компилятором, и он запускался под Windows NT 3.51. Меня это очень впечатлило. Только в этом движке мне не понравились сложные форматы файлов, требование высокой версии OpenGL и ini-конфиги, они конечно подходят для хранения простых настроек, но если в них хранить что-то более сложное всё превращается в нечитабельную кашу. Поэтому я решил сделать свой такой же, только с простыми форматами файлов, OpenGL 1.1, и конфигами с синтаксисом похожим на LUA. Т.к. использовать луа только для конфигов расточительно, я написал свой парсер похожего формата.
В итоге форматом текстур стал TGA, форматом моделей OGF(не то чтобы не очень нравился этот формат, но он вполне простой) а ресурсы хранились в обычном zip-архиве. Минимально необходимая версия OpenGL - 1.0. Так что можно портировать даже под самые древние платформы. Это всё запускалось под Windows, OS/2 и Linux(только через GLUT), и собиралось разными компиляторами.
(BCC, MSVC 5.0, Watcom, GCC)

C С++ такое бы не прокатило. Он плохо портируем между разными компиляторами.
Например новые компиляторы поймут такой код:
Код
for(int i = 0; i < 10; i++) puts("for 1");
for(int i = 0; i < 10; i++) puts("for 2");
for(int i = 0; i < 10; i++) puts("for 3");

Старые будут ругаться на повторное объяление i. Там надо делать так:
Код
for(int i = 0; i < 10; i++) puts("for 1");
for(i = 0; i < 10; i++) puts("for 2");
for(i = 0; i < 10; i++) puts("for 3");

Такой вариант устроит всех:
Код
int i;

for(i = 0; i < 10; i++) puts("for 1");
for(i = 0; i < 10; i++) puts("for 2");
for(i = 0; i < 10; i++) puts("for 3");


Только вот это уже код на С, а не на C++.

Сообщение отредактировал refuse - 29.08.2016, 00:15
Перейти в начало страницы
 
 
 autistic
сообщение 28.08.2016, 23:51
Сообщение #2


Геймер
******

Группа: Участник
Сообщений: 125
Регистрация: 05.05.2012
Пользователь №: 14751



Цитата(saas @ 29.08.2016, 01:30) *
Чистый C - это круто.

Сам Кармак признал, что С++ круче!
Цитата
In some ways, I still think the Quake 3 code is cleaner, as a final evolution of my C style, rather than the first iteration of my C++ style, but it may be more of a factor of the smaller total line count, or the fact that I haven’t really looked at it in a decade. I do think "good C++" is better than "good C" from a readability standpoint, all other things being equal.

http://www.phoronix.com/scan.php?page=news...&px=MTI3NDQ

Сообщение отредактировал refuse - 29.08.2016, 00:15
Перейти в начало страницы
 
 
 1001v
сообщение 29.08.2016, 02:10
Сообщение #3


Кандидат Игровых Наук
******************

Группа: Участник
Сообщений: 3370
Регистрация: 24.08.2010
Пользователь №: 14054



Че пацаны, программисты?
Перейти в начало страницы
 
 
 RayTwitty
сообщение 29.08.2016, 02:29
Сообщение #4


Доктор Игровых Наук
*******************

Группа: Участник
Сообщений: 3723
Регистрация: 24.09.2010
Пользователь №: 14086



Тема кстати с таким же названием уже была.
Перейти в начало страницы
 
 
 OlegatoR
сообщение 29.08.2016, 03:01
Сообщение #5


GAMEINATOR
***********************

Группа: Администратор
Сообщений: 9767
Регистрация: 03.02.2006
Из: Earth
Пользователь №: 2942



Цитата(RayTwitty @ 29.08.2016, 02:27) *
Тема кстати с таким же названием уже была.

то было Писькомерство кулкодеров
Перейти в начало страницы
 
 
 Cossack-HD
сообщение 29.08.2016, 07:55
Сообщение #6


TECHNOSLAV 80 уровня
*******************

Группа: Участник
Сообщений: 3566
Регистрация: 26.01.2014
Из: Стокгольм
Пользователь №: 19142



Хочу запилить 2D движок с API OpenGL. Думал пилить на C# ибо знаком с ним, нашёл всё необходимое для привинчивания OpenGL (есть несколько альтернатив), но OpenGL работает нативно только с C++. Насколько сложнее работать с C++, чем C#?
Объекты будут такие: ГГ, 2D платформы с текстурами и вершинами для просчёта коллизий, всякие там партикловые projectlies. Окружающую среду хочу стримить вторым потоком по мере продвижения, из раздельных секторов карты. Нужен файлоый I/O и внутренний редактор уровней с GUI. Где это проще реализовать?

Сообщение отредактировал Cossack-HD - 29.08.2016, 07:55
Перейти в начало страницы
 
 
 autistic
сообщение 29.08.2016, 08:38
Сообщение #7


Геймер
******

Группа: Участник
Сообщений: 125
Регистрация: 05.05.2012
Пользователь №: 14751



Cossack-HD, можно написать низкоуровневые ф-ии отрисовки графики на Си, а всё остальное, включая загрузку ресурсов, обработку пользовательского ввода, логику взаимодействия с игровыми объектами и т.д. реализовать на C#. Для этого используют P/Invoke (Platform Invocation Services), это такой механизм, который позволяет вызывать неуправляемый код из управляемого. У этого подхода есть и минусы - нельзя передавать данные из управляемого кода в неуправляемый привычным способом, для этого придется использовать Маршалинг, что потребует дополнительных усилий, но учитывая, что для 2D графики много ф-ий рендерера не понадобится, то связанными с маршалингом хлопотами можно пренебречь.

Сообщение отредактировал refuse - 29.08.2016, 08:39
Перейти в начало страницы
 
 
 Cossack-HD
сообщение 29.08.2016, 11:11
Сообщение #8


TECHNOSLAV 80 уровня
*******************

Группа: Участник
Сообщений: 3566
Регистрация: 26.01.2014
Из: Стокгольм
Пользователь №: 19142



Цитата(refuse @ 29.08.2016, 10:36) *
Cossack-HD, можно написать низкоуровневые ф-ии отрисовки графики на Си, а всё остальное, включая загрузку ресурсов, обработку пользовательского ввода, логику взаимодействия с игровыми объектами и т.д. реализовать на C#. Для этого используют P/Invoke (Platform Invocation Services), это такой механизм, который позволяет вызывать неуправляемый код из управляемого. У этого подхода есть и минусы - нельзя передавать данные из управляемого кода в неуправляемый привычным способом, для этого придется использовать Маршалинг, что потребует дополнительных усилий, но учитывая, что для 2D графики много ф-ий рендерера не понадобится, то связанными с маршалингом хлопотами можно пренебречь.

Я особо мощного графония не планирую. Я так понимаю, низкоуровневые функции помогают при обработке большого количества объектов в кадре? Это поэтому Кармак писал части движка на ассемблере? Не планирую использовать много объектов, но буду иметь ввиду.
Я могу тупо загрузить "один жыпег" как основу куска уровня и закрепить его с collision map, многослойность картинки можно обеспечить n-количеством "жыпегов" с различной близостью к viewport. Движок всё таки должен работать как 3D.

Сообщение отредактировал Cossack-HD - 29.08.2016, 11:11
Перейти в начало страницы
 
 
 Neo][
сообщение 29.08.2016, 11:30
Сообщение #9


The One
****************

Группа: Участник
Сообщений: 2715
Регистрация: 05.12.2005
Из: Наша Раша
Пользователь №: 2566



Cossack-HD, а почему хочешь пилить сам, спортивный интерес?

Ну и позанудствую, что значит?
Цитата(Cossack-HD @ 29.08.2016, 09:53) *
но OpenGL работает нативно только с C++



Это я к тому, что бери готовый движок или бери готовый байндинг к своему языку и не ищи себе приключений (IMG:style_emoticons/default/smile.gif)
Перейти в начало страницы
 
 
 Cossack-HD
сообщение 29.08.2016, 11:43
Сообщение #10


TECHNOSLAV 80 уровня
*******************

Группа: Участник
Сообщений: 3566
Регистрация: 26.01.2014
Из: Стокгольм
Пользователь №: 19142



Цитата(Neo][ @ 29.08.2016, 13:28) *

Cossack-HD, а почему хочешь пилить сам, спортивный интерес?

Ну и позанудствую, что значит?
Цитата(Cossack-HD @ 29.08.2016, 09:53) *
но OpenGL работает нативно только с C++

Это я к тому, что бери готовый движок или бери готовый байндинг к своему языку и не ищи себе приключений (IMG:style_emoticons/default/smile.gif)

Все байндинги для OpenGL, кроме C++, неофициальные. Я так понимаю, особой разницы между байндингами нет. Просто возьму тот, который тянет более современную GL.

Пилить самостоятельно - да, спортивный интерес. Сейчас у меня начался курс профессиональной подготовки (дизайнер ПО), в колледже выделены отдельные помещения для нашей группы и VIP ключи до 8 вечера, офис для студентов короче, нужно пользоваться возможностью (IMG:style_emoticons/default/biggrin.gif) Насчёт движка ничего особо сложного - один поток для передвижения объекта и проверки коллизий, по началу могу прямо в код вписывать геометрию, I/O файлов и редактор уже потом. Прверку коллизий хочу сделать "лучиками", потом буду прикручивать больше фичей, как пойдёт (IMG:style_emoticons/default/smile.gif)
Насколько сложно сделать радиальную проверку коллизий для окружности, с return на угол столкновения относительно центра/поверхности окружности?

Сообщение отредактировал Cossack-HD - 29.08.2016, 11:44
Перейти в начало страницы
 
 
 autistic
сообщение 29.08.2016, 12:06
Сообщение #11


Геймер
******

Группа: Участник
Сообщений: 125
Регистрация: 05.05.2012
Пользователь №: 14751



Цитата(Cossack-HD @ 29.08.2016, 13:09) *
Я так понимаю, низкоуровневые функции помогают при обработке большого количества объектов в кадре?

Не совсем. Суть заключается в том, что на си пишутся функции, обеспечивающие низкоуровневый вывод графики. В теле этих функций происходит вызов нативных ф-ий OpenGL, а наружу поставляется простой интерфейс из нескольких таких ф-ий, к примеру:
Код
int Init(uint64_t handle);
void Shutdown();
void SetViewport(int x, int y, int w, int h);
int CreatePrimitive(Triangle *triangles);
void DrawPrimitive(int handle);
void DeletePrimitive(int handle);
int CreateTexture(int w, int h, char *pixels);
int BindTexture(int handle);
void DeleteTexture(int handle);
void SetTransforms(float *matrix);
void Render();


Потом эта библиотека цепляется к приложению на С# и вся высокоуровневая работа с графикой (спрайты, анимация, очередь отрисовки и т.д.) реализуется уже там.

В качестве примера реализации такого АПИ советую уроки от NeHe
Перейти в начало страницы
 
 
 Neo][
сообщение 29.08.2016, 12:07
Сообщение #12


The One
****************

Группа: Участник
Сообщений: 2715
Регистрация: 05.12.2005
Из: Наша Раша
Пользователь №: 2566



Цитата(Cossack-HD @ 29.08.2016, 13:41) *
Все байндинги для OpenGL, кроме C++, неофициальные. Я так понимаю, особой разницы между байндингами нет. Просто возьму тот, который тянет более современную GL.

Cossack-HD, ну разрабам не всегда с руки реализовывать API-обёртки под великое множество языков. По поводу разницы между байндингами - всё зависит от того зачем этим занимался автор. Взять например GLScene, числится, как байндинг для pascal-based языков, но я бы не назвал это байндингом, слишком высокоуровнево.

Цитата(Cossack-HD @ 29.08.2016, 13:41) *
Насчёт движка ничего особо сложного - один поток для передвижения объекта и проверки коллизий, по началу могу прямо в код вписывать геометрию, I/O файлов и редактор уже потом. Прверку коллизий хочу сделать "лучиками", потом буду прикручивать больше фичей, как пойдёт

А где цикл отрисовки? А в каком потоке он будет? А как будет обрабатываться ввод? А как будут синхронизироваться результаты расчётов из разных потоков? И т.п. вопросы конечно наигранные, но тем не менее... Поэтому я и предлагал взять готовый движок и на основе его разбираться с тем, как это всё организованно и реализовывать уже саму игру. Но, если реализация какой-либо законченной игры не является целью, тогда можно и понабивать себе шишки (IMG:style_emoticons/default/wink.gif)


Цитата(Cossack-HD @ 29.08.2016, 13:41) *
Насколько сложно сделать радиальную проверку коллизий для окружности, с return на угол столкновения относительно центра/поверхности окружности?

Не совсем понял, что такое "радиальная проверка", "поверхность окружности"... Но в целом в коллизиях нет ничего сложного, все формулы гуглятся на раз )
Перейти в начало страницы
 
 
 Cossack-HD
сообщение 29.08.2016, 13:13
Сообщение #13


TECHNOSLAV 80 уровня
*******************

Группа: Участник
Сообщений: 3566
Регистрация: 26.01.2014
Из: Стокгольм
Пользователь №: 19142



refuse, если запилить такую прослойку, то можно пользоваться нативным байндингом C++/OpenGL, а основная разработка может быть на C#? Удобно.

Neo][, я перечислил список базовых функций. Такую игрульку можно хоть на простом canvas рисовать, без использования текстур, даже FPS будет играбельный. Не вижу особого смысла разбивать игру на много потоков, сайдскроллер можно делать секвентивно. Подгрузку ресурсов "на лету" можно вынести на второй поток, и до кучи звук и ИИ на свои потоки.
Перейти в начало страницы
 
 
 Neo][
сообщение 29.08.2016, 13:31
Сообщение #14


The One
****************

Группа: Участник
Сообщений: 2715
Регистрация: 05.12.2005
Из: Наша Раша
Пользователь №: 2566



Cossack-HD, что-то ты меня совсем запутал. Зачем opengl, если можно и на обычной канве рисовать? Не видишь смысла в разбиении на потоки, но ресурсы, звук, ии можно вынести в отдельные потоки. Звучит противоречиво.

Я же писал про готовые движки и задавал надуманные вопросы потому что OpenGL - это не на канве рисовать. Посмотри любой урок, показывающий как нарисовать кубик с текстурой на ogl, возможно удивишься количеству кода.
Перейти в начало страницы
 
 
 Cossack-HD
сообщение 29.08.2016, 13:43
Сообщение #15


TECHNOSLAV 80 уровня
*******************

Группа: Участник
Сообщений: 3566
Регистрация: 26.01.2014
Из: Стокгольм
Пользователь №: 19142



Цитата(Neo][ @ 29.08.2016, 15:29) *

Cossack-HD, что-то ты меня совсем запутал. Зачем opengl, если можно и на обычной канве рисовать? Не видишь смысла в разбиении на потоки, но ресурсы, звук, ии можно вынести в отдельные потоки. Звучит противоречиво.

Я же писал про готовые движки и задавал надуманные вопросы потому что OpenGL - это не на канве рисовать. Посмотри любой урок, показывающий как нарисовать кубик с текстурой на ogl, возможно удивишься количеству кода.

На канве без текстур и без шейдеров, можно просто сделать однопоточный гейм-дизайн прототип. На OpenGL да, инициализация рендера, стирание буфера вывода, установка view port, установка вершин и групп, назначение текстур, отрисовка по z-буферу (или как там) и прочее прочее. Годный туториал уже нашёл - он настолько для чайников, что начинается с Hello World в Windows Forms Application ;)
Что я имел ввиду - игра вполне может работать в одном потоке и с GL рендером, а разбить на потоки можно те вещи, которые между собой связаны минимально. Глубокая оптимизация в планах не стоит.

Сообщение отредактировал Cossack-HD - 29.08.2016, 13:45
Перейти в начало страницы
 
 
 Молния в вакууме
сообщение 29.08.2016, 14:06
Сообщение #16


Почти Игроман
*********

Группа: Участник
Сообщений: 614
Регистрация: 05.05.2007
Пользователь №: 6215



На мой взгляд испоьзовать OpenGL для 2D графики это overkill. Если только для кросспатформенности.
Под виндой есть аж три специальных API для 2D графики. Это GDI, DirectDraw и Direct2D. Но использовать их имеет смысл только если не устраивает в плане производительности этот ваш canvas. (IMG:style_emoticons/default/smile.gif)

Сообщение отредактировал saas - 29.08.2016, 14:07
Перейти в начало страницы
 
 
 abramcumner
сообщение 29.08.2016, 14:11
Сообщение #17


Доктор Игровых Наук
*******************

Группа: Участник
Сообщений: 3933
Регистрация: 27.04.2011
Из: Россия
Пользователь №: 14366



Цитата(saas @ 28.08.2016, 23:30) *
Старые будут ругаться на повторное объяление i. Там надо делать так:

Это же с++. Для старых компиляторов пишется костыль:
Код
#define for if (false);else for

И вот уже ругани на повторные объявления нет (IMG:style_emoticons/default/biggrin.gif)
Перейти в начало страницы
 
 
 Neo][
сообщение 29.08.2016, 14:14
Сообщение #18


The One
****************

Группа: Участник
Сообщений: 2715
Регистрация: 05.12.2005
Из: Наша Раша
Пользователь №: 2566



Цитата(Cossack-HD @ 29.08.2016, 15:41) *
Что я имел ввиду - игра вполне может работать в одном потоке и с GL рендером, а разбить на потоки можно те вещи, которые между собой связаны минимально. Глубокая оптимизация в планах не стоит.

Cossack-HD, вот только всё тобой перечисленное связанно максимально (IMG:style_emoticons/default/wink.gif)
Без ресурсов нечего рисовать. На экране происходит столкновение, а из колонок тишина. Тяжёлый алгоритм ИИ или коллизии не успел отработать, а рендер уже рисует следующий кадр. Движок - это комплексная система в которой всё взаимосвязано и это очень не тривиальная задача написать многопоточную риалтайм систему. Уж лучше не заморачивайся с потоками и делай всё в одном.

Цитата(abramcumner @ 29.08.2016, 16:09) *
Это же с++. Для старых компиляторов пишется костыль:
Код
#define for if (false);else for
И вот уже ругани на повторные объявления нет

abramcumner, воу воу полегче, видел многое, но вот этот трюк (IMG:style_emoticons/default/2guns.gif)
Перейти в начало страницы
 
 
 Cossack-HD
сообщение 29.08.2016, 18:07
Сообщение #19


TECHNOSLAV 80 уровня
*******************

Группа: Участник
Сообщений: 3566
Регистрация: 26.01.2014
Из: Стокгольм
Пользователь №: 19142



Цитата(saas @ 29.08.2016, 16:04) *
На мой взгляд испоьзовать OpenGL для 2D графики это overkill. Если только для кросспатформенности.
Под виндой есть аж три специальных API для 2D графики. Это GDI, DirectDraw и Direct2D. Но использовать их имеет смысл только если не устраивает в плане производительности этот ваш canvas. (IMG:style_emoticons/default/smile.gif)

OpenGL нужен, чтобы учиться основам 3D графона, да и кросс-платформенность тоже интересует, да и "всякие там Vulkan'ы", которые растут из GL. Я подумал, что лучше начинать с "2D" игр, с редким использованием 3D объектов. Я по AutoCAD знаю, как мозг ломается и перегревается при работе в 3D. В сайдскроллерах хорошо смотрятся 3D объекты для фона (горизонтальная поверхность с перспективой) - это очень актуально для открытых пространств, когда хочется показать глубину мира: тыц. В противном случае, придётся насаживать десятки линий кустиков "друг за другом" - тогда можно даже не думать об уходящей вдаль водной поверхности.

Сообщение отредактировал Cossack-HD - 29.08.2016, 18:11
Перейти в начало страницы
 
 
 Молния в вакууме
сообщение 04.09.2016, 01:05
Сообщение #20


Почти Игроман
*********

Группа: Участник
Сообщений: 614
Регистрация: 05.05.2007
Пользователь №: 6215



Цитата(saas @ 29.08.2016, 00:30) *
Однажды я скомпилировал ваш движок на C борландовским компилятором

Что-то я опять про него вспомнил. И добавил Direct3D 7 рендер. (IMG:style_emoticons/default/laugh.gif) Just for lulz.
(IMG:http://images.gameru.net/thumb/7a2ab927d0.jpg)
Только архив с Припятью побился, с родным рендером вообще не запускается. (С другой картой всё ОК)
Перейти в начало страницы
 
 
 
 

 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 15.10.2019, 20:01