我正在使用 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/