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

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

ВАЖНОЕ ПРИМЕЧАНИЕ: я использую платформу XNA, поэтому игровой движок не является чисто низкоуровневым управлением DirectX! Я пытаюсь расширить XNA с помощью предопределенных классов, которые можно будет легко вставить в любую игру и управлять ими позже!

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

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

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

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

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

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

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

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 ]

1 голос
/ 16 января 2010

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

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

Итак, 3 подсказки с моей стороны: - Поместите в движок только код, не связанный с игрой (Графика, Звук, Ввод) - Из движка вызывайте только 2 метода в своей игре, например, updateGame () и renderGame (), которые затем позаботятся об остальном - И последнее, но не менее важное: держите компоненты своей игры отдельно от других, позволяйте им взаимодействовать только там, где это действительно необходимо.

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

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

0 голосов
/ 17 января 2010

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

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

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

...