带有数组的C#struct

Jos*_*hua 1 c# arrays xna struct

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

我做了这样的数组:

Bullet[] bulletCollection = new Bullet[100];
Run Code Online (Sandbox Code Playgroud)

但是当我尝试做这样的代码时:

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

我收到以下错误:

'Zombie_Apocalypse.Game1.Bullet.Active'由于其防护等级而无法访问

任何人都可以伸出援手吗?我不知道为什么会出现这个错误,或者即使我正确地声明数组或其他任何东西......因为XNA论坛上的帖子没有详细说明.

感谢您提供任何帮助.:)

Dan*_*Tao 7

我相信C#默认会将成员设为私有,所以你只需要创建Active一个公共字段:

public bool Active;
Run Code Online (Sandbox Code Playgroud)

更可取的做法是使其成为具有公共get访问者的财产,保持set私有:

public bool Active { get; private set; }
Run Code Online (Sandbox Code Playgroud)

更新(刚才那些到达这个问题的人):

或者,readonly为了这个目的,使用字段可能是一个更好的想法(无论是为了更好的性能还是在游戏开发人员中减少更少的头脑):

public readonly bool Active;
Run Code Online (Sandbox Code Playgroud)

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

我最初是从一个非游戏开发者的角度回答这个问题的,所以这个答案(就像你在这里或在互联网上的其他地方读过的那些内容)应该带着一丝一毫.我坚持认为使用属性隐藏字段上的setter - 无论是在struct还是class中 - 在典型的应用程序中都有意义.其他人留下的评论让我相信,在房产中包装一个领域并不是游戏的标准,但是(由于可理解的性能考虑因素); 所以你可以安全地忽略我的最终建议.


bri*_*ner 5

尝试添加 public

public struct Bullet
{
    public Vector2 Position;
    public Vector2 Velocity;
    public float Rotation;
    public Rectangle BoundingRect;
    pubilc bool Active;
}
Run Code Online (Sandbox Code Playgroud)