C # структура с массивом - PullRequest
1 голос
/ 10 мая 2010

Я делаю игру, используя C # с платформой XNA. Игрок является 2D-солдатом на экране, и пользователь может стрелять пулями. Пули хранятся в массиве. Я рассмотрел использование списков и массивов для этого и пришел к выводу, что массив для меня намного лучше, так как будет много выстрелов и уничтожений пуль, что-то, что я читаю Списки не обрабатывают так хорошо.

После прочтения некоторых сообщений на форумах XNA, это привлекло мое внимание: http://forums.xna.com/forums/p/16037/84353.aspx

Я создал такую ​​структуру:

// Bullets
struct Bullet
{
    Vector2 Position;
    Vector2 Velocity;
    float Rotation;
    Rectangle BoundingRect;
    bool Active;
}

И я сделал массив следующим образом:

Bullet[] bulletCollection = new Bullet[100];

Но когда я пытаюсь сделать код наподобие этого:

    // Fire bullet
    if (mouseState.LeftButton == ButtonState.Pressed)
    {
        for (int i = 0; i < bulletCollection.Length; i++)
        {
            if (!bulletCollection[i].Active)
            {
                // something
            }
        }

Я получаю следующую ошибку:

'Zombie_Apocalypse.Game1.Bullet.Active' недоступен из-за его защиты уровень

Кто-нибудь может протянуть руку? Я понятия не имею, почему эта ошибка появляется, или даже если я объявляю массив должным образом или что-то еще ... поскольку пост на форумах XNA не вдавался в подробности об этом.

Спасибо за любую помощь, которую вы можете оказать. :)

Ответы [ 4 ]

7 голосов
/ 10 мая 2010

Я считаю, что C # делает членов закрытыми по умолчанию, поэтому вам просто нужно сделать Active открытым полем:

public bool Active;

Более целесообразным было бы сделать это свойство общедоступным get аксессором, оставив set приватным:

public bool Active { get; private set; }

Обновление (для тех, кто только сейчас приходит к этому вопросу):

В качестве альтернативы, может быть лучше (будь то для повышения производительности или для того, чтобы меньше интересоваться коллегами-разработчиками игр), для этой цели следует использовать поле readonly:

public readonly bool Active;

В последнем случае вам необходимо установить значение Active в конструкторе вашего типа.

Первоначально я ответил на этот вопрос с точки зрения неигрового разработчика, и поэтому этот ответ (как и все, что вы читаете здесь или в другом месте в Интернете) следует воспринимать с недоверием. Я утверждаю, что использование свойства для скрытия установщика в поле - будь то в структуре или классе - имеет смысл в типичных приложениях. Комментарии, оставленные другими, заставляют меня поверить, что перенос поля в свойство является не нормой для игр, однако (из-за понятных соображений производительности); и поэтому вы, вероятно, можете смело игнорировать мое последнее предложение.

5 голосов
/ 10 мая 2010

Попробуйте добавить public

public struct Bullet
{
    public Vector2 Position;
    public Vector2 Velocity;
    public float Rotation;
    public Rectangle BoundingRect;
    pubilc bool Active;
}
2 голосов
/ 10 мая 2010

C # делает все члены класса закрытыми по умолчанию - вам нужно указать модификаторы доступа:

public struct Bullet
{
  public Vector2 Position;
  public Vector2 Velocity;
  public float Rotation;
  public Rectangle BoundingRect;
  public bool Active;
}
0 голосов
/ 08 июля 2010

Я считаю, что сделать сам struct общедоступным - это все, что нужно, так как для полей структуры по умолчанию установлено значение public, а для полей классов - private. Однако, как полагают другие, явная практика - публичное раскрытие ваших полей: напишите, что вы имеете в виду, вместо того, чтобы позволить языку полагаться на вас! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...