Связывание объектов со списком для последующего редактирования вручную (Game Engine/Framework — часть управления объектами)

StackOverflow https://stackoverflow.com/questions/2077340

  •  21-09-2019
  •  | 
  •  

Вопрос

Прежде всего здравствуйте, я здесь впервые.Я молодой программист (15 лет), и это моя вторая попытка создать игру (на самом деле целый многоразовый игровой движок И фреймворк, не знаю, как это назвать, может быть, GDK?), но на этот раз я делаю ее гораздо более организованной.

ВАЖНАЯ ЗАМЕТКА:Я использую платформу XNA, поэтому игровой движок — это не просто низкоуровневое управление DirectX!Я пытаюсь расширить XNA предопределенными классами, которые можно будет легко вставить в любую игру и управлять ими в дальнейшем!

Я застрял в поиске способа поместить объект в список WorldManager, позже получить объект для прямых изменений, а затем вернуть его в список (поэтому он используется с методом Update).

Мои идеи (и вопросы):

  1. Лучшим возможным решением было бы каким-то образом связать объект со списком, чтобы, когда я обновляю одиночный объект объекта, он также обновлялся в списке.К сожалению, я не знаю, как это сделать, и это может быть лучшим ответом.

  2. Я также думал о том, чтобы сначала отредактировать созданную мной сущность, а затем использовать find, чтобы найти ее в списке и обновить.Проблема в том, что я не уверен, как ищет метод find.Что, если любое изменение может заставить метод думать, что это совершенно новый объект?(Как найти на самом деле найти?)

  3. Я добавил идентификаторы к объектам в момент их добавления в список, чтобы после редактирования я мог вернуть их на место.Проблема в том, что у меня тоже есть метод удаления, и я не уверен, изменит ли он индексы, потому что в противном случае мне пришлось бы повторно обновлять идентификаторы каждый раз, когда я удаляю объект.Я считаю это совершенно неэффективным.Так будет ли List<>.Remove изменять индексы?(Я думаю, это было бы)

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

Кусок кода, чтобы понять, как все это работает:

public class WorldManager
{
    List<Entity> Entities = new List<Entity>();
    List<Entity> ToAdd_Entities = new List<Entity>();
    List<Entity> ToRemove_Entities = new List<Entity>();
...
    public void Update()
    {
        for(int count = 0; count < ToAdd_Entities.Count; count++)
        {
            Entities.Add(ToAdd_Entities[count]);
            int index = Entities.IndexOf(ToAdd_Entities[count]);
            Entities[index].ID = index;

            ToAdd_Entities.Remove(ToAdd_Entities[count]);
        }

        for (int count = 0; count < ToRemove_Entities.Count; count++)
        {
            Entities.Remove(ToRemove_Entities[count]);
            ToAdd_Entities.Remove(ToAdd_Entities[count]);

            //index update is required here too, I just didn't implement it yet.
        }
    ...
   }
}

Как мне получить к нему доступ:

List<Entity> bots = WorldManager.GetEntitiesByName("bot");
bots[1].Location = new Vector2(x,y);
WorldManager.UpdateEntities(bots);

Я не использую этот фрагмент кода, это просто пример моей идеи.

Пожалуйста, простите меня за мой запутанный английский (если он вам кажется запутанным), я серб.

Заранее спасибо.

Это было полезно?

Решение 2

Что ж, у меня есть ответ на мое самое лучшее решение!Получил это из другого моего вопроса и подумал, что мне тоже следует разместить здесь решение.

Ответ в том, что, как только я добавил его в список, он уже связан, потому что Entity — это класс, а его объекты являются «ссылочными типами», поэтому, когда я назначаю их какому-то другому объекту или в данном случае списку, они связаны с этим.Любые изменения, которые я вношу в этот объект, автоматически обновляются на другой стороне!

(Кто-нибудь поправит меня, если я ошибаюсь.Я проверю это, как только протестирую свой фреймворк/движок, и сообщу, является ли это «правильным» решением.)

Другие советы

Я предлагаю не использовать подход «один большой список, в котором находится каждый объект».Лучше сосредоточьтесь на вводе, графике и других базовых вещах движка, а остальное оставьте классам, специфичным для игры.

Представьте, что у вас есть 2D-мир с множеством деревьев, но все они в основном статичны.Теперь у вас есть 5 тыс. из них, сидящих в вашем списке сущностей и ничего не делающих, вместо того, чтобы помещать их туда, вам лучше поместить их в список где-нибудь в вашем классе карты, чтобы к ним было легче получить доступ (вы не придется просмотреть весь список, чтобы найти их), и дизайн тоже станет намного чище.Таким образом, вам не придется кодировать целый класс общего кода обработчика, который, в конечном итоге, все равно не подходит для каждого возможного объекта, который вы можете добавить в свой мир.

Итак, 3 совета с моей стороны:- Поместите только не игровой код в двигатель (графика, звук, вход) - из двигателя только вызовите 2 методы в вашей игре, например, например,Updategame () и rendergame (), которые затем позаботятся об остальных - и, наконец, не менее важны:Держите компоненты вашей игры отдельно друг от друга, позволяйте им взаимодействовать только там, где это действительно необходимо.

Также важно создать несколько игр, затем посмотреть, какой код они действительно разделяют, и из этого кода сформировать свой движок.

Если вам нужен пример того, как это можно сделать (хотя я не гарантирую, что это идеально), вы можете взглянуть на мой небольшой движок. здесь.Это Java, и у него не очень хорошие комментарии, но он должен дать вам базовое представление о том, как структурировать ваш движок.Если вы хотите увидеть игру, которую я создал на этом движке, загляните в раздел загрузок.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top