Среда, 08 Февраля 2023, 16:10

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Блоки препроцессора
Блоки препроцессора
SaiteiДата: Вторник, 28 Января 2014, 19:58 | Сообщение # 1
старожил
Сейчас нет на сайте

Почему они оба активны?
Я даже ставил #define ST 0 ... Никаких изменений
OpenGOOДата: Вторник, 28 Января 2014, 20:47 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Может лучше по старинке написать

Код

#define OpenGL

#ifdef OpenGL
..
#endif // OpenGL

#ifdef DirectX
...
#endif // DirectX


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
BellPlayerДата: Вторник, 28 Января 2014, 20:51 | Сообщение # 3
был не раз
Сейчас нет на сайте
Если пораскинуть и ничего дополнительного не инклудится, то в данном случае ST заменится на OpenGL, а OpenGL не определено.
В первом блоке будет примерно так: <ничего> == <ничего>, да и во втором тоже самое будет. Истина тобиш.
RUNGOGET2THECHOPAHДата: Вторник, 28 Января 2014, 21:03 | Сообщение # 4
участник
Сейчас нет на сайте
OpenGL и DirectX в твоем коде - идентификаторы, не являющиеся макросами, поэтому препроцессор принимает их за нули (строки он сравнивать не умеет, выражение условной директивы может содержать лишь числовые константы и ссылки на макросы). Добавь #define OpenGL 1 и #define DirectX 2, и все будет, как надо.
SaiteiДата: Вторник, 28 Января 2014, 21:08 | Сообщение # 5
старожил
Сейчас нет на сайте
OpenGOO, спасибо, так даже элегантней получилось)
Извините что так протупил, я за три года впервые к директивам препроцессора вернулся )))))
С помощью них же по сути делают кроссплатформенные приложения?

Добавлено (28.01.2014, 21:08)
---------------------------------------------
RUNGOGET2THECHOPAH, тогда всё становится на свои места... И Вам спасибо!

vasua99Дата: Вторник, 28 Января 2014, 21:53 | Сообщение # 6
GNU follower
Сейчас нет на сайте
По сути проще реализовать один общий интерфейс для каждого - для OpenGL, и для DirectX. А потом в коде выбирать какой использовать. Ну или с помощью конфигурационного файла. Ну такой интерфейс реализовать тяжелее. Зато потом на стороне клиента поддерживать проще(если например захочешь движок писать)

Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
SaiteiДата: Вторник, 28 Января 2014, 22:54 | Сообщение # 7
старожил
Сейчас нет на сайте
vasua99, извините пожалуйста, а что в данном случае вы называете интерфейсом?
vasua99Дата: Вторник, 28 Января 2014, 23:42 | Сообщение # 8
GNU follower
Сейчас нет на сайте
Ну если не разбирать подробности, то общая оговоренность(спецификация) относительно каких то функций(как я понял, вы на Си пишете). То есть мы можем например вызвать функцию drawPoint(), передать ей нужные координаты и все. А функция сделает все остальное, в зависимости от платформы, и настроек которые вы задали.

Ну допустим пример с "пустышкой"

Код

typedef enum { OPENGL, DIRECTX } Render;

// читаем настройки.
RenderInfo *renderInfo = (RenderInfo *)malloc(sizeof(RenderInfo)
InitializeRender(renderInfo, Render.DIRECTX);
// инициализируем нужный нам рендер, заполняем RenderInfo.
// Который может выглядеть например так(упрощенно конечно):
typedef struct {
      Render renderType;
      void *specificRenderInfo;
} RenderInfo;

...

void drawPoint(RenderInfo *renderInfo, int x, int y, int z)
{
      if(renderInfo->renderType == OPENGL)
      {
          // рисуем по своему, используя нужные нам свойства рендера, преобразовав его к нужному типу
          GLSpecificRenderInfo *render  = (GLSpecificRenderInfo)(renderInfo->specificInfo);
          ...
      }
      else if(renderInfo->renderType == DIRECTX)
      {
          DXSpecificRenderInfo *render = (DXSpecificRenderInfo)(renderInfo->specificInfo);
          ...
      }
}

...

//Рисуем точку)
drawPoint(renderInfo, 10, 20, 30)


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)

Сообщение отредактировал vasua99 - Вторник, 28 Января 2014, 23:43
SaiteiДата: Вторник, 28 Января 2014, 23:47 | Сообщение # 9
старожил
Сейчас нет на сайте
vasua99, а, да, я это сразу же понял, как только наткнулся на эти директивы) Но всё равно спасибо
P.S. нет, С++. К С я немного кошу из-за того что четыре месяца сидел на ассемблере smile
vasua99Дата: Вторник, 28 Января 2014, 23:52 | Сообщение # 10
GNU follower
Сейчас нет на сайте
Ну если вы немного имеете опыт с ООП, то проблем не должно быть.

Создаем общий интерфейс:

Код

interface IRender
{
     void drawPoint(int x, int y, int z);
     void initializeRender(*Params*);
     ...
};


После создаем по классу для каждого рендера и реализуем этот интерфейс.


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
maxxCДата: Среда, 29 Января 2014, 00:03 | Сообщение # 11
был не раз
Сейчас нет на сайте
Цитата
>interface С#\Java головного мозга.

У себя мультирендер организовал именно на интерфейсах, разве что обернуть пришлось много чего.
vasua99Дата: Среда, 29 Января 2014, 00:07 | Сообщение # 12
GNU follower
Сейчас нет на сайте
Ну а есть лучше варианты?

Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
Форум игроделов » Программирование » C/C++ » Блоки препроцессора
  • Страница 1 из 1
  • 1
Поиск:

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