Создание массива игровых объектов - PullRequest
1 голос
/ 09 января 2012

G'day All,

Если у меня есть несколько объектов, называемых врагами на экране, как я могу поместить их в массив?Моей первоначальной мыслью было сделать это во время их создания.Я поместил объявление в начало моего файла Game.cs:

public enemy[] enemiesArray = new enemy[5];

Затем, когда я создал врагов, я попытался добавить их в массив:

for (int i = 0; i < 2; ++i) // This will create 2 sprites
        {
            Vector2 position = new Vector2((i+1) * 300, (i+1) * 200);
            Vector2 direction = new Vector2(10, 10);
            float velocity = 10;
            int ID = i;

            Components.Add(new skull(this, position, direction, velocity, ID));
            skullsArray[i] = skull; // This line is wrong
        }

У меня также естьпопытался сделать это в методе update (), используя код, подобный следующему:

foreach (GameComponent component1 in Components)
        {
            int index = component1.ID;
            if (component1.ToString() == "enemy")
            {
                enemiesArray[index] = component1
            }
         }

Но это падает, потому что component1 не имеет идентификатора.Я должен предположить, что, поскольку программа перечисляет через каждый GameComponent, она может получить доступ только к ограниченному диапазону данных для компонента.

В конце я хочу иметь возможность называть своих врагов врагами [1],враг [2] и т. д.

Спасибо, Андрей.

Ответы [ 2 ]

2 голосов
/ 11 января 2012

при условии, что вы поместили строку public enemy[] enemiesArray = new enemy[5]; внутри своего игрового класса, тогда ваши враги Array - это просто поле вашего игрового класса, а не игровой компонент, вы должны иметь возможность ссылаться на него как

myGameClass.enemiesArray[1]

Предполагая, что ваш игровой класс находится в области видимости.

также, как @annonymously говорит, что списки легче изменять размер во время выполнения, чем массивы, поэтому рассмотрите возможность использования 'List (5) врагаМассив;' вместо

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

простой способ - создать абстрактный класс, подобный

public abstract class GameThing
{
     public Vector2 Position {get; set;}
     //some other props...
}

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

public class Enemy : GameThing
{
    //some props
}

и вместо public enemy[] enemiesArray = new enemy[5]; вы бы использовали public GameThing[] gameItemsArray= new GameThing[5]; добавить элементы, как это

gameItemsArray[1] = new Enemy();
2 голосов
/ 11 января 2012

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

List<Enemy> EnemyList;

//You have to initalize it somewhere in Initalize or LoadContent (or the constructor)

Вы можете добавлять врагов так же, как добавляли бы компоненты (потому что Компоненты - это List<GameComponent>

EnemyList.Add(enemy);

Тогда вы можете получить доступ к врагу:

EnemyList[index].DoSomething();

РЕДАКТИРОВАТЬ: просто снова посмотрел на ваш код, и я заметил, что череп не существует. Вы имели в виду

new skull(this, position, direction, velocity, ID);

Потому что в противном случае вы пытаетесь добавить класс в массив, а не экземпляр класса:)

...