【问题标题】:C# struct with an array带有数组的 C# 结构
【发布时间】:2010-05-10 16:38:55
【问题描述】:

我正在使用带有 XNA 框架的 C# 制作游戏。玩家是屏幕上的 2D 士兵,用户可以发射子弹。项目符号存储在一个数组中。我已经研究过为此使用列表和数组,我得出的结论是,数组对我来说要好得多,因为会有很多子弹同时发射并被摧毁,这是我读过的 Lists don't handle太好了。

在阅读了 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 论坛上的帖子没有详细说明。

感谢您提供的任何帮助。 :)

【问题讨论】:

  • 除了您遇到的问题 - 您可能需要考虑不使用数组(或固定长度数组)。您可能会遇到问题,即:快速枪,需要 100 多发子弹。考虑使用对象集合,其中对象(不再活动时)只会自行销毁。
  • @riffnl,实际上不,在 XNA 中使用固定缓冲区几乎总是最佳选择,因为您希望将垃圾收集尽可能减少到零,甚至为零。

标签: c# arrays struct xna


【解决方案1】:

我相信 C# 默认将成员设为私有,因此您只需将 Active 设为公共字段:

public bool Active;

更可取的做法是使其成为具有公共 get 访问器的属性,同时保持 set 私有:

public bool Active { get; private set; }

更新(针对刚刚提出这个问题的人):

或者,为此目的使用 readonly 字段可能是一个更好的主意(无论是为了获得更好的性能还是减少游戏开发人员同事的关注):

public readonly bool Active;

在后一种情况下,您需要在类型的构造函数中设置 Active 的值。

我最初是从非游戏开发者的角度回答这个问题的,所以这个答案(就像您在此处或互联网上其他地方读到的任何内容一样)应该持保留态度。我认为使用属性来隐藏字段上的设置器(无论是在结构还是类中)在典型应用程序中是有意义的。然而,其他人留下的评论让我相信,将字段包装在属性中并不是游戏的标准(出于可理解的性能考虑);所以你可以放心地忽略我的最后建议。

【讨论】:

  • 哈,那应该很明显 xD 谢谢。我是否正确声明了我的数组? C# 在编译时没有出现任何错误,但我仍然不确定。
  • 另外,我必须等待 9 分钟才能接受您的回答,但我会尽我所能。 :)
  • @Whitey:您正确地声明了您的数组。因为Bullet 是一个结构体,所以数组填充了默认值(就像int[] 将填充零一样);如果你把它变成了一个类,那么数组就会充满空值,你需要实例化每个子弹。
  • 在结构上使用属性不是 XNA 中应遵循的规则(即使类库也不使用它),因为会影响性能。实际上规则是除非需要封装,否则不要使用属性,因此您可以消除数据的冗余复制。
  • 用“标准”属性包装结构字段有什么好处吗?如果有,是什么?
【解决方案2】:

尝试添加public

public struct Bullet
{
    public Vector2 Position;
    public Vector2 Velocity;
    public float Rotation;
    public Rectangle BoundingRect;
    pubilc bool Active;
}

【讨论】:

    【解决方案3】:

    默认情况下,C# 将所有类成员设为私有 - 您需要指定访问修饰符:

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

    【讨论】:

      【解决方案4】:

      我相信将struct 本身公开是所有必要的,因为结构字段默认为public 而类字段默认为private。但是,正如其他人所建议的那样,明确公开您的字段是一种好习惯:写下您的意思,而不是让语言为您假设! :)

      【讨论】:

        猜你喜欢
        • 2018-06-05
        • 2011-04-11
        • 2015-03-29
        • 2023-03-09
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        相关资源
        最近更新 更多