Суббота, 23 Ноября 2024, 00:24

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Как написать свой движок?
SaiteiДата: Четверг, 12 Июля 2012, 00:38 | Сообщение # 1
старожил
Сейчас нет на сайте
Я имею расплывчатое понимание что такое движок. Пока для меня движок - это набор вспомогательных функций. Т.е. написанных кем-то и укорачивающих к-во строк...
Программирую я на С++. Уже писал первый "ком" с инициализацией (GLUT) и споткнулся на многих вещах (долго же я орал, узнав что функцию в функции сделать почти невозможно хд)
Хочу движок. Да, хочу изобрести велосипед. Нравится, хочу попробовать. Да, я мазохист. Нет, движок только для меня
Что читать? Какие граф. движки брать? Акцент на 2д... Что вообще учить\знать???? Есть стремление. Повторюсь - уже что-то вроде двига писал, но споткнулся. Понравилось
AikidosДата: Четверг, 12 Июля 2012, 00:52 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Quote (Saitei)
(долго же я орал, узнав что функцию в функции сделать почти невозможно хд)

типа:

Code
void Test()
{
   void Test2()
   {

   }

}


?

Зачем такое вообще пробовать написать?


Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
根據在黑暗中Дата: Четверг, 12 Июля 2012, 00:54 | Сообщение # 3
Инфантильный C# программист
Сейчас нет на сайте
google в помощь, там много статей написано по этой теме , а если лень искать то думай сам что делать.

Сообщение отредактировал 根據在黑暗中 - Четверг, 12 Июля 2012, 00:55
SaiteiДата: Четверг, 12 Июля 2012, 00:57 | Сообщение # 4
старожил
Сейчас нет на сайте
Quote (根據在黑暗中)
google в помощь, там много статей написано по этой теме , а если лень искать то думай сам что делать.

Предоставьте штуки три. Находил только одну wink
Quote (Aikidos)
Зачем такое вообще пробовать написать?

Просто прёт
Quote (Aikidos)
void Test()
 {
   void Test2()
   {
 
   }
 
 }

разве так можно? Хм... Кхм...
...Блёёё....
AikidosДата: Четверг, 12 Июля 2012, 01:15 | Сообщение # 5
постоянный участник
Сейчас нет на сайте
Quote (Saitei)
разве так можно? Хм... Кхм...

Я вообще-то спросил типа такого кода ты хотел написать?

И нет. Так нельзя.


Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
SaiteiДата: Четверг, 12 Июля 2012, 01:19 | Сообщение # 6
старожил
Сейчас нет на сайте
Quote (Aikidos)
Я вообще-то спросил типа такого кода ты хотел написать?

И нет. Так нельзя.

Да, что-то вроде. Там просто когда двиг писал нужно было функцию engineShowGrid(); забабахать. Обломался
TimKruzДата: Четверг, 12 Июля 2012, 02:00 | Сообщение # 7
старожил
Сейчас нет на сайте
Quote (Saitei)
разве так можно? Хм... Кхм...

Ну в каком-нибудь языке программирования (их тысячи, кто знает...) так может и можно, но я не представляю себе, зачем и кому это может потребоваться...
Если хочешь вызвать функцию из другой функции, опиши вызываемую функцию перед вызывающей. Описывать функцию внутри функции нет смысла.
Найди и почитай самоучители по OpenGL с примерами. Поройся в примерах. Там наверняка будут примеры по созданию windows-окна, правильной инициализации OpenGL, выводу OpenGL-графики на поверхность окна и так далее, по во возрастанию сложности. Разбирайся, пытайся добавить что-то своё в готовых примерах, экспериментируй... Без знания самого OpenGL и основ работы с графикой никакого движка ты не напишешь.
И ещё советую почитать что-нибудь типа этого, так ты разберёшься в структуре игровых программ, что там и как должно быть - без этих знаний ты не поймёшь, что должен делать твой игровой движок.
Ну и вообще... Вот ты в той конференции писал, что написал инициализацию OpenGL и собираешься прикручивать звук... Это неправильный ход. Звук - почти последнее дело. Там много чего сделать нужно. Для начала, стоит проработать внутреннюю структуру движка, описать на бумаге: что он делает, как там всё внутри связано... Начинать программировать нужно потом, хотя тренироваться делать отдельные части нужно уже сейчас, так подкрепишь знания практикой.
Quote (Saitei)
engineShowGrid();

Могу набросать примерную структуру. GridShow() меняет режим отображения сетки (булеву или целочисленную переменную GridMode, второе для нескольких режимов). В принципе, можно обойтись без неё (менять режим присваиванием значений, но безопаснее использовать функцию, в которой делать проверки, а переменную заблокировать). Далее, GridDraw() непосредственно рисует сетку на экране. Она должна выполняться в цикле прорисовки, при этом в цикле или в самой функции проверяется переменная, отвечающая за режим отображения сетки. GridDraw() либо рисует сетку просто (проводит линии на экране), либо вызывает заранее заготовленный дисплейный список, который нужно приготовить при запуске движка функцией GridInit() - использование дисплейных списков, это как использование функций, только в дисплейном списке сохраняются исключительно OpenGL-функции, как бы сразу результат. Вроде бы это увеличивает производительность.
Ну а вообще, я бы все эти функции и переменные инкапсулировал в объект Grid, который при инициализации готовит дисплейный список, а при уничтожении - удаляет. И вызов функций выглядит удобнее, типа Grid.Draw(), Grid.Show() и так далее.
На всякий случай, сразу советую включить двойную буферизацию (это включается специальным флагом PFD_DOUBLEBUFFER при задании формата пиксела для контекста устройства). Прорисовка сразу на экран подходит разве что для построения статичных картинок. Для постоянно обновляющегося изображения (как в играх) нужна двойная буферизация (иначе изображение будет мерцать). В конце прорисовки кадра сцены придётся вызывать SwapBuffers(контекст устройства), это winapi-функция, меняет местами видимый и задний буферы.


ArchidoДата: Четверг, 12 Июля 2012, 06:41 | Сообщение # 8
Сэнсэй
Сейчас нет на сайте
Вроде уже кучу раз писали же об этом. Пишется толковая более ли менее, доведенная до ума, игра на любом открытом движке (HGE, например. Не важно это) и большая часть вопросов отпадает сама собой, все остальное - от лукавого.
Ты хочешь сделать то, незная что оно вообще из себя представляет... для этого надо попользоваться сторонним инструментом и смотреть как это у других сделано.
Заодно, в процессе написания игры и язык подучишь. Т.к. с поверхностными знаниями С++ заниматься этим - только на грабли наступать.

Мм и да, как выше писали - надо еще OpenGL'ом научиться пользоваться, желательно после того о чем я писал выше. Т.е. ты просто учишься рисовать квадрат, рисовать его с текстурой, вращать его и перемещать, загружать текстуры, разбираться с форматом и устройством вершин, текстур и так далее. О движке речи вообще пока не идет biggrin .

Да и еще существует такая, мм, штука: Нужно не просто писать движок, а писать игру вместе с ним, иначе существует вероятность, что движок будет писаться вечность biggrin . Это статистика.

P.S. Я все это не с потолка пишу, сам в свое время проходил подобный путь: игра на чужом -> OpenGL -> своя игра + свой движок. В таком порядке действия в последующих этапах вполне очевидны и не возникает пачка глупых вопросов.
Ну а так удачи cool


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
НохчиДата: Четверг, 12 Июля 2012, 07:04 | Сообщение # 9
заслуженный участник
Сейчас нет на сайте
Вложенные функции очень крутая фича на самом деле, вроде в js такое будет работать, жаль что С не позволяет так писать.

Многие вопросы по Windows отпадут, если посмотреть тут
GavolotДата: Четверг, 12 Июля 2012, 07:43 | Сообщение # 10
Последователь Тени
Сейчас нет на сайте
Нохчи, в ac3 проверено работает) Только я пока так и не понял где такое можно в полной мере использовать.

В общем что-то делаю, но пока не пойму ни как :)
Тень - выражение основной сущности человека.
-=WarChief=-Дата: Четверг, 12 Июля 2012, 10:44 | Сообщение # 11
почетный гость
Сейчас нет на сайте
Тяжелее всего найти грань между игровым движком и уже игрой. В свое время я тоже писал свой игровой движок и мне помогли эти статьи. Еще сайт с туториалами по SDL, так как писал под SDL. А лучше всего зайди на GitHub или Sourceforge, скачай какой-то простенький 2D движок, и на основе его пиши свой.
KnifePartyДата: Четверг, 12 Июля 2012, 10:55 | Сообщение # 12
частый гость
Сейчас нет на сайте
Зачем тебе это нужно?) лучше игру делай....

SaiteiДата: Четверг, 12 Июля 2012, 11:35 | Сообщение # 13
старожил
Сейчас нет на сайте
Quote (TimKruz)
Ну в каком-нибудь языке программирования (их тысячи, кто знает...) так может и можно, но я не представляю себе, зачем и кому это может потребоваться...
Если хочешь вызвать функцию из другой функции, опиши вызываемую функцию перед вызывающей. Описывать функцию внутри функции нет смысла.

Есть смысл. Например в engineShowGrid(); нужно было запустить функцию рисования, которая должна была находиться в теле данной функции
Quote (TimKruz)
Найди и почитай самоучители по OpenGL с примерами.

какие, например? Находил пока что только две книжонки... Буду благодарен, если книжку\самоучитель посоветуешь
Quote (Archido)
Вроде уже кучу раз писали же об этом. Пишется толковая более ли менее, доведенная до ума, игра на любом открытом движке (HGE, например. Не важно это) и большая часть вопросов отпадает сама собой, все остальное - от лукавого.
Ты хочешь сделать то, незная что оно вообще из себя представляет... для этого надо попользоваться сторонним инструментом и смотреть как это у других сделано.
Заодно, в процессе написания игры и язык подучишь. Т.к. с поверхностными знаниями С++ заниматься этим - только на грабли наступать.

Почему? Представляю. Просто неуверен правильное ли это "понимание". Сейчас у меня движок, который инициализирует окошко (код с ошибкой, знаю)) без ошибки лень искать):
Code
void engineStart(unsigned int StartParam, unsigned short WindowX, unsigned short WindowY, int winposx, int winposy, char* windowtitle)  
  {  
  glutInit(0,0); //Инициализация OpenGL  
  glutInitDisplayMode(StartParam);  
  glutInitWindowSize(WindowX, WindowY);  
  glutInitWindowPosition(winposx, winposy);  
  glutCreateWindow(windowtitle);  
  glutMainLoop();  
  };  

  void drawEngineStart(void (*drawFunc)())  
  {  
  glutDisplayFunc(drawFunc);  
  };  

  void Draw()  
  {  

  };  

  void Init()  
  {  

  };  

  int main(int argc, char** argv)  
  //argc - к-во аргументов в команде  
  //argv - их описание  
  {  
  engineStart(GLUT_SINGLE|GLUT_RGB,800,600,1,1, "TEST");  
  drawEngineStart(Draw);  
  Init();  
  return 0;  
  }

Как видишь... Есть 2 моих функции:
Code
engineStart(GLUT_SINGLE|GLUT_RGB,800,600,1,1, "TEST");  
  drawEngineStart(Draw);

smile
Quote (Archido)
OpenGL'ом научиться пользоваться

Ну дык учиться буду. Книжечку-то дайте с примерами smile
Quote (-=WarChief=-)
помогли эти статьи.

о, это чудо я видел. Жесть, мозг тек)) И там структура немного странновата. Я читал, но все равно спасибо
Quote (-=WarChief=-)
скачай какой-то простенький 2D движок

например?
noTformaTДата: Четверг, 12 Июля 2012, 11:36 | Сообщение # 14
Ukrainian independent game developer
Сейчас нет на сайте
Автор, не мучайся и просто почитай нужную литературу...

@noTformaT
SaiteiДата: Четверг, 12 Июля 2012, 11:38 | Сообщение # 15
старожил
Сейчас нет на сайте
Quote (noTformaT)
Автор, не мучайся и просто почитай нужную литературу...

На русском такого добра не найти?
RUNGOGET2THECHOPAHДата: Четверг, 12 Июля 2012, 12:21 | Сообщение # 16
участник
Сейчас нет на сайте
Лол, автор окончательно поехал со своей идеей создания ДВИЖКА.
SaiteiДата: Четверг, 12 Июля 2012, 12:26 | Сообщение # 17
старожил
Сейчас нет на сайте
RUNGOGET2THECHOPAH, Вам какое дело? Просто проходите мимо smile
BASSДата: Четверг, 12 Июля 2012, 12:37 | Сообщение # 18
independent developer
Сейчас нет на сайте
Saitei, а какие у Вас проблемы возникли?

Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
SaiteiДата: Четверг, 12 Июля 2012, 12:39 | Сообщение # 19
старожил
Сейчас нет на сайте
BASS, у glut чтобы отобразить сетку, нужно запускать функцию рисования. А она должна быть закрыта, чтоб её НИКТО не видел. Это же движок. Хотел чтобы функция рисования была заперта в функции сетки, а так нельзя
MrAkakuyДата: Четверг, 12 Июля 2012, 12:40 | Сообщение # 20
участник
Сейчас нет на сайте
Saitei, я бы советовал использовать библиотеку glfw заместо glut. она новее, развивается, в ней больше функций, с ней легче работать + она кросплатформенна.

И там нет указателей на функции типа glutDisplayFunc(ук на функцию) там все делается в одной функции.





Сообщение отредактировал MrAkakuy - Четверг, 12 Июля 2012, 12:41
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг