Перейти в начало страницы

Здравствуйте, гость ( Авторизация | Регистрация )

Gameru.net останавливает работу в связи с вторжением армии РФ в Украину. Следите за дальнейшими анонсами.
Support Gameru!
22 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Курилка программистов, Флуд на около программерские темы
Молния в вакууме
сообщение 28.08.2016, 23:32
Сообщение #1


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

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(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


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

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(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


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


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

Репутация:   1084  
Группа: Участник
Сообщений: 3950
Награды: 6
Регистрация: 24.08.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Че пацаны, программисты?


--------------------

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


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Тема кстати с таким же названием уже была.


--------------------
Перейти в начало страницы
 
OlegatoR
сообщение 29.08.2016, 03:01
Сообщение #5


Gameru DA
************************

Репутация:   3704  
Группа: Администратор
Сообщений: 10206
Награды: 4
Регистрация: 03.02.2006




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

то было Писькомерство кулкодеров


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


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

Репутация:   379  
Группа: Участник
Сообщений: 5758
Награды: 6
Регистрация: 26.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

Сообщение отредактировал Cossack-HD - 29.08.2016, 07:55


--------------------
Ryzen 3700X
Arctic Freezer 33 eSports Duo
16GB DDR4 3600MHz
Strix GTX 1080 TI
Перейти в начало страницы
 
autistic
сообщение 29.08.2016, 08:38
Сообщение #7


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

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

Сообщение отредактировал refuse - 29.08.2016, 08:39


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


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

Репутация:   379  
Группа: Участник
Сообщений: 5758
Награды: 6
Регистрация: 26.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(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


--------------------
Ryzen 3700X
Arctic Freezer 33 eSports Duo
16GB DDR4 3600MHz
Strix GTX 1080 TI
Перейти в начало страницы
 
Neo][
сообщение 29.08.2016, 11:30
Сообщение #9


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

Репутация:   744  
Группа: Участник
Сообщений: 2715
Награды: 5
Регистрация: 05.12.2005




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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



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


--------------------
Перейти в начало страницы
 
Cossack-HD
сообщение 29.08.2016, 11:43
Сообщение #10


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

Репутация:   379  
Группа: Участник
Сообщений: 5758
Награды: 6
Регистрация: 26.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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

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

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

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

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

Сообщение отредактировал Cossack-HD - 29.08.2016, 11:44


--------------------
Ryzen 3700X
Arctic Freezer 33 eSports Duo
16GB DDR4 3600MHz
Strix GTX 1080 TI
Перейти в начало страницы
 
autistic
сообщение 29.08.2016, 12:06
Сообщение #11


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

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(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


--------------------
nop
Перейти в начало страницы
 
Neo][
сообщение 29.08.2016, 12:07
Сообщение #12


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

Репутация:   744  
Группа: Участник
Сообщений: 2715
Награды: 5
Регистрация: 05.12.2005




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(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 файлов и редактор уже потом. Прверку коллизий хочу сделать "лучиками", потом буду прикручивать больше фичей, как пойдёт

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


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

Не совсем понял, что такое "радиальная проверка", "поверхность окружности"... Но в целом в коллизиях нет ничего сложного, все формулы гуглятся на раз )


--------------------
Перейти в начало страницы
 
Cossack-HD
сообщение 29.08.2016, 13:13
Сообщение #13


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

Репутация:   379  
Группа: Участник
Сообщений: 5758
Награды: 6
Регистрация: 26.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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


--------------------
Ryzen 3700X
Arctic Freezer 33 eSports Duo
16GB DDR4 3600MHz
Strix GTX 1080 TI
Перейти в начало страницы
 
Neo][
сообщение 29.08.2016, 13:31
Сообщение #14


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

Репутация:   744  
Группа: Участник
Сообщений: 2715
Награды: 5
Регистрация: 05.12.2005




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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


--------------------
Перейти в начало страницы
 
Cossack-HD
сообщение 29.08.2016, 13:43
Сообщение #15


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

Репутация:   379  
Группа: Участник
Сообщений: 5758
Награды: 6
Регистрация: 26.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(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


--------------------
Ryzen 3700X
Arctic Freezer 33 eSports Duo
16GB DDR4 3600MHz
Strix GTX 1080 TI
Перейти в начало страницы
 
Молния в вакууме
сообщение 29.08.2016, 14:06
Сообщение #16


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

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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

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


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

Репутация:   744  
Группа: Участник
Сообщений: 2715
Награды: 5
Регистрация: 05.12.2005




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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

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

abramcumner, воу воу полегче, видел многое, но вот этот трюк 2guns.gif


--------------------
Перейти в начало страницы
 
Cossack-HD
сообщение 29.08.2016, 18:07
Сообщение #19


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

Репутация:   379  
Группа: Участник
Сообщений: 5758
Награды: 6
Регистрация: 26.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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

Сообщение отредактировал Cossack-HD - 29.08.2016, 18:11


--------------------
Ryzen 3700X
Arctic Freezer 33 eSports Duo
16GB DDR4 3600MHz
Strix GTX 1080 TI
Перейти в начало страницы
 
Молния в вакууме
сообщение 04.09.2016, 01:05
Сообщение #20


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

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

Что-то я опять про него вспомнил. И добавил Direct3D 7 рендер. laugh.gif Just for lulz.

Только архив с Припятью побился, с родным рендером вообще не запускается. (С другой картой всё ОК)
Перейти в начало страницы
 

22 страниц V   1 2 3 > » 
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28.03.2024, 16:37