[英]how do you instanciate a class in c#?
我正在使用XNA框架C#为Windows Phone制作游戏。
游戏中的主要玩家必须射击。 我有一个项目符号类,但是如何在用户每次单击屏幕时实例化该项目符号?
子弹类基本上是自己绘制的,并具有称为“射击”的功能,该功能用于子弹沿玩家的方向移动。
我是C#xD的菜鸟
并不是对Andrey的痴迷,但从技术上讲,它是
Bullet mybullet = new Bullet(A, B, C);
一种常见的方法是在游戏循环中添加对被触摸屏幕的检查,如果有,请采取措施。
对于XNA,在Game类(我认为默认情况下称为Game1
)上创建一个字段来存储是否在先前的Loop上触摸了屏幕:
bool screenBeingTouched = false;
这是为了防止一次触摸即可创建多个项目符号(除非您要这样做)。
然后在Game类的Update
方法中检查当前是否正在触摸屏幕并采取措施:
TouchCollection newScreenTouches = TouchPanel.GetState();
if (!screenBeingTouched && newScreenTouches.Count > 0)
{
screenBeingTouched = true;
Bullet myBullet = new Bullet();
myBullet.DoSomething(); // Such as render on the screen and move around.
}
else if (newScreenTouches.Count == 0)
{
screenBeingTouched = false;
}
如果您在实例化类时遇到麻烦,我想您也不熟悉Content Pipeline,因此假设基本的项目符号结构,我将执行以下操作:
要加载Texture2D,请使用如下代码:
var tx = this.Content.LoadContent<Texture2D>("TextureYouAddedAsContent");
我假设您的Bullet类具有一个接受Texture2D和其他参数的构造函数,请使用如下代码实例化它:
int speed = 500;
Vector2 pos = new Vector2(50, 50); // start at 50, 50, top left
Vector2 dir = new Vector2(1, 0); // direction is in positive X direction
Bullet bullet = new Bullet(tx, pos, dir, speed);
另外,请检出http://GameDev.StackExchange.com ,尤其是这个问题 。
由于这是一个游戏,因此建议您不要在Update循环期间实例化对象。 因此,您会在游戏过程中遇到非常严重的口吃和滞后现象。
您要做的方法是在游戏初始化时或在内容加载阶段中,创建一个包含100个子弹的队列:
Queue<Bullet> bulletCache;
然后在列表中填充100个bullet实例:
for (int i = 0; i < 100; i++)
bulletCache.Enqueue(new Bullet());
在您的游戏中,当您需要发射子弹时,只需使其中之一出队,设置其速度,位置等,然后进行渲染即可。 当它不再可见时(例如,撞到某物,超出屏幕范围等),再次使其入队。
这样,您无需实例化游戏循环中的任何内容,而只是回收相同的对象。 如果您在游戏中尽可能多地进行此操作,您将拥有非常流畅的游戏玩法。 如果您习惯在更新循环中创建对象,那么紧凑框架(电话上的那个)的垃圾收集器将在某个时候启动以清理它们,并破坏游戏的帧速率。
希望有帮助:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.