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论坛上的帖子没有详细说明.
感谢您提供任何帮助.:)
我相信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中 - 在典型的应用程序中都有意义.其他人留下的评论让我相信,在房产中包装一个领域并不是游戏的标准,但是(由于可理解的性能考虑因素); 所以你可以安全地忽略我的最终建议.
尝试添加 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)