[英]C# struct with an array
我正在使用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”
谁能伸出援手? 我不知道为什么会弹出此错误,或者即使我正确声明了数组还是其他任何内容……也因为XNA论坛上的帖子没有对此进行详细介绍。
感谢您提供任何帮助。 :)
我相信C#默认将成员设为私有,因此您只需要将Active
为公共字段即可:
public bool Active;
更为可取的是将其设置为具有公共get
访问者的属性,并将set
私有:
public bool Active { get; private set; }
更新 (对于那些刚刚遇到此问题的人):
或者,使用readonly
字段来达到此目的可能是一个更好的主意(无论是为了获得更好的性能还是在游戏开发人员的同事中少打招呼):
public readonly bool Active;
在后一种情况下,您需要在类型的构造函数中设置Active
的值。
我最初是从非游戏开发者的角度回答这个问题的,所以这个答案(就像您在此处或在互联网上其他地方所读到的任何内容)都应引起关注。 我坚持认为,使用属性在字段上隐藏设置器(无论是在结构还是在类中)在典型应用程序中都是有意义的。 其他人留下的评论使我相信,将属性包装在属性中并不是游戏的规范(出于可理解的性能考虑); 因此您可以放心地忽略我的最终建议。
尝试添加public
public struct Bullet
{
public Vector2 Position;
public Vector2 Velocity;
public float Rotation;
public Rectangle BoundingRect;
pubilc bool Active;
}
默认情况下,C#将所有类成员设为私有-您需要指定访问修饰符:
public struct Bullet
{
public Vector2 Position;
public Vector2 Velocity;
public float Rotation;
public Rectangle BoundingRect;
public bool Active;
}
我相信将struct
本身公开是必要的,因为结构字段默认为public
而类字段默认为private
。 但是,正如其他人所建议的那样,明确地将您的字段公开是一种好习惯:写下您的意思,而不是让语言为您假设! :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.