Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

  » STG. Космическая тактическая игра. | страница 1
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 1 из 1
 
Поиск в этой теме:
Канал Игры Мечты: «STG. Космическая тактическая игра.»
pommaniulo
 61 EGP


Репутация: -10
Сообщения: 40

Зарегистрирован: 12.07.2011
STG. Космическая тактическая игра.

Общее.
Рабочее название: STG (Space Tactical game).
Основа геймплея: пошаговая тактика в открытом космосе одним или более КА (Космический Аппарат).
Физика: "Ньютон" с не ньютоновскими вращениями на уровне открытого космоса (тактическая часть) без учета тяготения тел(планет и т.п.). Какое либо быстрое перемещение на уровне звездной системы и по галактике.
Фишки: Некая система команд для конфигурации игры. Упор на тактику. Конструктор КА. Возможно экипажи/человечки. Различные режимы сетевой игры в пошаговом режиме (Одновременный ход в онлайн, по очереди оффлайн и т.п.).

Технические подробности.
Среда разработки: MS Visual Studio Express 2010.
Язык разработки: C++.
Графика: Ogre3D.
GUI: MyGUI.
Физика: Bullet (OgreBullet).
Сеть: Winsock.
Звук: пока не прикручен.
Скрипты: не известно.

Подробнее.
Сам по себе движок игры не будет определять цели и основной геймплей игры. Он будет предоставлять базовый функционал, на основе которого системой команд(скриптами) можно будет делать различные "миссии". В эту базу будут входить такие вещи как управление КА в пространстве, конструктор кораблей, физика и т.п.
Система команд.
Это основа всего. Базовый функционал тоже её использует. Например, если серверу нужно переместить КА по неким законам в пространстве, то после расчета он вызывает команду <MoveKA id="123" ToPos="123,456,789">(Команда условна). Эта команда передается по сети на выполнение соответствующим клиентам. Клиент также формирует от пользовательского интерфейса соответствующие команды и шлёт на сервер. Команды имеют проверку на выполнение(например, какие то создаются только сервером), основную часть(выполняется и сервером и клиентом) и части выполняемые только сервером и только лиентом. Скорее всего будет скриптовый язык типа LUA, для нормального скриптинга, из которого можно будет также запускать те самые команды.

Ближайшие планы.
*Определиться с сетевым взаимодействием.
*Закодить первый набросок для проверки общей концепции сетевого взаимодействия.
*Проработать систему команд для первой тэстовой мисси типа "DogFight" в одном отдельно взятом куске космоса.
*Подумать, что делать дальше

Последний раз редактировалось: pommaniulo (11:36 30-11-2012), всего редактировалось 2 раз(а)
    Добавлено: 09:37 30-11-2012   
pommaniulo
 61 EGP


Репутация: -10
Сообщения: 40

Зарегистрирован: 12.07.2011
По сетевому обмену.
 Как я дошёл до жизни такой   (кликните здесь для просмотра)
Как то было несколько раз нужно записывать и считывать данные на диск. Всего Были тройка классов/структур, имеющие списки структур.
Делал просто двумя функциями для чтения и записи:
Запись - в цикле перебирал списки:
fwrite (&arr[i].x , 1 , sizeof(int) , pFile );
fwrite (&arr[i].y , 1 , sizeof(int) , pFile );
fwrite (&arr[i].z , 1 , sizeof(int) , pFile );
+Во вложенном списке такие же команды для списков элементов списков и т.п.
Загрузка - в цикле перебирал списки:
fread(&x, sizeof(float), 1, F);
fread(&y, sizeof(float), 1, F);
fread(&z, sizeof(float), 1, F);
+Во вложенном списке такие же команды для списков элементов списков и т.п.
Вносим изменения в структуры? Вэлкам править функции записи и чтения. При этом они должны быть аналогичными.
В общем запарился я там дэбагить, т.к. всеравно где-то что-то упустишь.
Пришла в голову мысль как-то это автоматизировать. После чего было понаписано кое-чего с макросами, шаблонами для шаблонов (например для std::list) и прочими ужасами.
В результате функция была одна, но своя для каждого класса/структуры - IO(bool IOtype). IOtype значило или запись или чтение.
В результате помимо прочего появился класс, который наследовался для нуждающихся в чтении/записи классов. Править нужно было только одну наследуемую виртуальную функцию и можно было спокойно менять порядок чтений/записи не опасаясь рассогласования. При этом в теле функции было что-то вроде
IO_int(x);
IO_int(y);
IO_int(z);
IO_List(arr);
Которые можно было менять местами не опасаясь, что они запишутся и прочтутся в разной последовательности.
Всё это велосипеды конечно же и как оно относится к сети? Ну это теже данные представленные в виде байтов, так что хоть на диск хоть по сети, хоть в базы данных. Вот.
Но тут меня осенило, что структуру/класс можно представить в виде байт очень просто:
MyClass C1;
char *p = reinterpret_cast<char*>(&C1);
int size = sizeof(C1);
Но были сомнения. И не напрасно. Вся эта сырая память может выглядеть по разному при разных условиях и содержать "мусор". Из за выравниваний, виртуальных классов и вообще стандарт ничего не гарантирует...
Не гарантирует кроме POD'ов, при условии договоренности о выравниваниях.
Wikipedia :
Простая структура данных (англ. plain old data, POD) — в современных языках программирования высокого уровня тип данных, имеющий жёстко определённое расположение полей в памяти, не требующий ограничения доступа и автоматического управления. Переменные такого типа можно копировать простыми процедурами копирования участков памяти наподобие memcpy.
<...>
В C++ POD определяется от противного. Тип данных является POD’ом, если:
у него нет конструктора, деструктора и копирующей операции присваивания (то есть operator=, принимающего на входе тот же тип);
среди нестатических полей нет ссылок C++, не-POD’ов, private и protected;
нет виртуальных методов;
он ни от чего не унаследован.
По стандарту C++ простой тип данных устроен в точности так, как описано. Управляемую же структуру компилятор может реорганизовать так, как он сочтёт наиболее эффективным.

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

Энное количество байт я уже успешно посылаю по домашней сети, так что с этим проблем нет.
Для обмена будут использоваться POD структуры с оговоренным выравниванием.
Основа основ - обмен командами. Тут все понятно.
(Все примеры условны и без подробностей)
Код:
struct ActionHead{
   unsigned long int size;
   ActionIDs ID;
};

struct SomeAction{
   ActionHead AHead;
   int var1, var2;
};

Для выполнения комманды функция
void DO(void *p)
{
   ActionHead *AHead = reinterpret_cast<ActionHead*>(p);
   switch(AHead->ID)
   {
   }
}


Отправка по сети(сохранении на диск и т.п.) просто:
Код:
ActionHead *AHead = reinterpret_cast<ActionHead*>(p);
send(p, AHead->size);

При приеме этот кусок памяти просто воспринимается как команда и может отправиться в функцию DO, где определится по AHead->ID и выполнится.

По мимо команд, есть еще игровые объекты.
Собственно теперь главный вопрос: писать отдельные команды для передачи по сети изменений объектов, или написать шаблонный класс для POD объектов, который сам бы регистрировал PODы и следил за передачей их изменений.

В первом случае нужно постоянно добавлять кучу разных команд. И при написании кода постоянно создавать и выполнять команды.

Во втором команда одна - изменить такие то байты такого то POD'a на такие то байты. При чем формируются они самостоятельно, а программирование выглядет более естественно.
что то вроде:

Код:
template<typename T>
class POD
{
ID id;
T pPod;
public:
   T const * Get(){
      return &pPod;}

   void Set(T const *p, T newVal){
      *const_cast<T*>(p) = newVal;
      //создаем команду на изменение POD'a}
}

struct KApos_POD
{
   int x, y, z;
}

class KA
{
   POD<KApos_POD> pos;
}

KA MyKA;
MyKA.pos.set(&MyKA.pos.Get()->x, 10);//немного больше писать конечно, но

Т.е. при добавлении некой структуры к классу KA, все что нужно будет делать, это указать шаблон
POD<NewPODstruc> someNewPod;
И всё.
Но это из кода. Для самописных скриптов команды то всеравно придется добавлять.
И еще нужно продумать как согласовать у каких экземпляров классов какие POD'ы, тоесть всеравно ручками скорее всего. Как этими POD'ами списки организовывать и прочее, прочее. Или еще огород городить... Так что по трудоемкости писания кода как бы оно в конечном итоге не таким же было. или еще больше.

Вот я и думаю... может кто что посоветует?

Последний раз редактировалось: pommaniulo (11:38 30-11-2012), всего редактировалось 1 раз
    Добавлено: 11:35 30-11-2012   
Sh.Tac.
 151 EGP


Рейтинг канала: 5(108)
Репутация: 14
Сообщения: 1426

Зарегистрирован: 27.07.2005
pommaniulo :
Собственно теперь главный вопрос: писать отдельные команды для передачи по сети изменений объектов, или написать шаблонный класс для POD объектов, который сам бы регистрировал PODы и следил за передачей их изменений.
"или" тут неуместно Улыбка
вам яблоко круглое или зелёное?

автоматизация это почти всегда лучче ручной работы, если не боишься шаблонов, то посмотри например boost::serialization и сделай похожим образом

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

следующий шаг это вообще скрыть работу с сетью, вот у тебя есть объект, ты чего-то в логике с ним сделал, а система сама отправила изменения и синхронизировала состояние объекта (на всех клиентах), это называется репликация, и используется в коммерческих движках, например Unreal Engine
_________________
This is what you get ...
(c) Radiohead
    Добавлено: 16:55 01-12-2012   
pommaniulo
 61 EGP


Репутация: -10
Сообщения: 40

Зарегистрирован: 12.07.2011
Sh.Tac. :
автоматизация это почти всегда лучче ручной работы

Ок, псб. Буду думать...
    Добавлено: 13:19 02-12-2012   
Канал Игры Мечты: «STG. Космическая тактическая игра.»
 
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Пилот в оффлайне спокойно валяется в базе и нагрузки на сервер не даёт. (Pegasus)

  » STG. Космическая тактическая игра. | страница 1
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18