Связывание объектов со списком для последующего редактирования вручную (Game Engine/Framework — часть управления объектами)
-
21-09-2019 - |
Вопрос
Прежде всего здравствуйте, я здесь впервые.Я молодой программист (15 лет), и это моя вторая попытка создать игру (на самом деле целый многоразовый игровой движок И фреймворк, не знаю, как это назвать, может быть, GDK?), но на этот раз я делаю ее гораздо более организованной.
ВАЖНАЯ ЗАМЕТКА:Я использую платформу XNA, поэтому игровой движок — это не просто низкоуровневое управление DirectX!Я пытаюсь расширить XNA предопределенными классами, которые можно будет легко вставить в любую игру и управлять ими в дальнейшем!
Я застрял в поиске способа поместить объект в список WorldManager, позже получить объект для прямых изменений, а затем вернуть его в список (поэтому он используется с методом Update).
Мои идеи (и вопросы):
Лучшим возможным решением было бы каким-то образом связать объект со списком, чтобы, когда я обновляю одиночный объект объекта, он также обновлялся в списке.К сожалению, я не знаю, как это сделать, и это может быть лучшим ответом.
Я также думал о том, чтобы сначала отредактировать созданную мной сущность, а затем использовать find, чтобы найти ее в списке и обновить.Проблема в том, что я не уверен, как ищет метод find.Что, если любое изменение может заставить метод думать, что это совершенно новый объект?(Как найти на самом деле найти?)
Я добавил идентификаторы к объектам в момент их добавления в список, чтобы после редактирования я мог вернуть их на место.Проблема в том, что у меня тоже есть метод удаления, и я не уверен, изменит ли он индексы, потому что в противном случае мне пришлось бы повторно обновлять идентификаторы каждый раз, когда я удаляю объект.Я считаю это совершенно неэффективным.Так будет ли 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, и у него не очень хорошие комментарии, но он должен дать вам базовое представление о том, как структурировать ваш движок.Если вы хотите увидеть игру, которую я создал на этом движке, загляните в раздел загрузок.