winapi — Динамическая обработка данных для игр в Stack Overflow

Я хотел бы получить данные по имени, идентификатору (случайный идентификатор объекта) или типу.
C # имеет словарь.
но это должен быть чистый c / c ++ … а не что-то вроде Sqlite или чего-то еще в dotnet.

  pSysBuffer = new D3DCOLOR[ winSizeX * winSizeY ]; // 3rd directx buffer
// all my 2d stuf gets rendered herestruct WorldInventory
{
Gameobject gameobject;
// more properties
} worldinventory[ winSizeX * winSizeY ];

struct Gameobject
{
int[] x, y;
unsigned int id;
Wall* wall;
Enemy* enemy;
Bullit bullit;
Mine mine;
// more properties
} gameobject;

Является ли структура GameObject хорошим дизайном?
это может быть стена, враг, буллит или что-то еще и может охватывать несколько координат x, y.

я не хочу использовать вектор, deque … потому что он меняется почти каждый кадр …

как сохранить коллекцию GameObjects, которая когда-либо меняется …. но она не должна быть двойной связью … я думаю.

моя техника точна в пикселях, а не на основе мозаики или математического вектора.

я хочу достичь … что-то вроде … внутренней базы данных для столкновения объектов и / или других вещей.
1 объект, т.е.: может запрашивать и спрашивать, заняты ли координаты, и избегать зацикливания массива.

это занимает меня довольно долго

заранее спасибо

1

Решение

Если вы планируете выполнять поиск по координатам, вы можете индексировать массив по ним и сортировать его, используя деление&Завоевать, который должен обеспечить быстрый метод сортировки и поиска.

Например, если у вас есть максимум 1000×1000 координат, вы можете преобразовать это число в одно целое число, например, это 10001000. 64×33 превратится в 640033. Это немного грубо, но оно должно работать. Пока массив вы сортируете с D&C хорошо рандомизирован, вы должны получать хорошую производительность.

Ex. отсортированного массива

        9720922
8500088
7770951
5300033
450750
3500112
1200015
750099

В этом примере, если вы запрашиваете, что происходит с координатой 64×33, вы сравниваете 640033 с 5300033, затем двигаетесь к 3500112, затем к 1200015, а затем к 750099. Тогда вы поймете, что больше нет записей, поэтому вы можете поместить указатель на это объект в object_750099.lower.

В структуре объекта потребуется еще несколько элементов.

GameObject struct {
...
int greater;
int lower;
}

Надеюсь, вы понимаете, что я пытаюсь сказать, потому что я объясняю это очень плохо.

0

Другие решения

Извините, это не совсем прямой ответ на ваш вопрос, потому что
хорошо я думаю, что вы обдумываете это насчет этого (работа для меня все время):

1. игровые объекты

  • создать список перечислений всех типов GO (игровых объектов)

    enum _go_type_enum
    {
    _go_type_none=0,
    _go_type_wall,
    _go_type_mine,
    _go_type_tree,
    _go_type_hole,
    _go_type_roadNS,
    _go_type_roadWE,
    ...
    _go_type_enum_end
    };
    
  • создать класс / структуру для каждого типа GO

  • включить специфические данные элемента сетки (одни и те же элементы класса могут иметь разные значения), например:
  • точки попадания, пулевые отверстия, пятна крови, взрывное окисление, ориентация для вращающихся объектов …
  • и не забудьте включить мир х, у !!!

Хранение данных 2.GO

  • создать динамические списки всех типов GO, как это:

    List<GO_class1> go1;
    List<GO_class2> go2;
    List<GO_class3> go3;
    List<GO_class4> go4;
    ...
    
  • или используйте вместо этого статические массивы (с достаточно большим максимумом)

    //            array       used GOs
    GO_class1 go1[max]; int go1num=0;
    GO_class2 go2[max]; int go2num=0;
    GO_class3 go3[max]; int go3num=0;
    GO_class4 go4[max]; int go4num=0;
    ...
    
  • создать карту мира

    int world_tp[winSizeX*winSizeY]; // _go_type_enum
    int world_ix[winSizeX*winSizeY]; // index inside go?[];
    
  • любой GO определяется как TP, IX

  • например tp = _go_type_wall; IX = 5; значит идти? [ix]
  • где идти? имя массива для класса стен

Теперь, когда вам нужно пройти через стены только петли, просто через массив стен
если вам нужно увидеть соседнюю область, посмотрите в wolrd (tp, ix) [] Я думаю, что это намного лучше и быстрее, чем какой-то механизм привязки классов / поиска / запросов.
Также вы используете намного меньше памяти (если используются динамические списки), потому что классы GO содержат только данные, специфичные для класса.
Для универсального класса GO он содержит все данные для всех классов, что приводит к потере памяти, а также замедляет обработку.

Надеюсь, поможет

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector