带有数组的 C# 结构

标签 c# arrays struct xna

我正在使用 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' is inaccessible due to its protection level

有人可以帮忙吗?我不知道为什么会弹出这个错误,或者即使我正确地声明了数组或任何...因为 XNA 论坛上的帖子没有详细说明。

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

最佳答案

我相信 C# 默认将成员设为私有(private),因此您只需将 Active 设置为公共(public)字段即可:

public bool Active;

更明智的做法是使它成为具有公共(public) get 访问器的属性,同时保持 set 私有(private):

public bool Active { get; private set; }

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

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

public readonly bool Active;

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

我最初是从非游戏开发者的角度回答这个问题的,所以这个答案(就像你在这里或互联网上其他地方读到的任何东西一样)应该有所保留。我坚持认为,使用属性来隐藏字段上的 setter——无论是在结构中还是在类中——在典型的应用程序中都是有意义的。其他人留下的评论让我相信,在属性中包装一个字段不是游戏的规范,但是(出于可以理解的性能考虑);因此,您可以安全地忽略我的最终建议。

关于带有数组的 C# 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2804480/

相关文章:

c# - 现在学习 C# 还是先学习 Java,然后再学习 C#?

arrays - 找到恰好出现三次的元素

c - scanf 加载 struct -> char[] 的问题

python - numpy 独特的奇怪行为

javascript - 使用 .map 将对象添加到数组时出现意外标记 {

c - scanf() 函数不起作用?

c++ - 访问在 C++ 函数内部的结构中定义的枚举类属性

c# - 避免在c#中对一段代码进行调试和调用堆栈

c# - Linq 在列表的每个项目中包含属性

c# - 从字符串获取枚举类型