你如何在c#中实例化一个类?

时间:2011-03-04 16:54:01

标签: c# object xna

我正在使用XNA框架C#为Windows Phone制作游戏。

游戏中的主要玩家必须射击。我有一个子弹类,但每次用户点击屏幕时你如何实例化该子弹?

子弹类基本上自我绘制,并有一个名为“射击”的功能,这用于子弹向玩家的方向移动。

我是c#xD

的菜鸟

4 个答案:

答案 0 :(得分:3)

不要对andrey迂腐,但从技术上讲,它是

Bullet mybullet = new Bullet(A, B, C);

答案 1 :(得分:2)

一种常见的方法是在你的游戏循环中添加对被触摸屏幕的检查,如果是,则采取措施。

对于XNA,在Game类(我认为默认情况下称为Game1)创建一个字段来存储是否在上一个循环中触摸了屏幕:

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;  
} 

答案 2 :(得分:1)

如果你在实例化类时遇到问题,我认为你也不熟悉内容管道,所以假设一个基本的子弹结构,我会做这样的事情:

要加载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,特别是此question

答案 3 :(得分:1)

由于这是一款游戏,我建议你不要在Update循环中实例化对象。因为它,你会在游戏过程中遇到非常糟糕的口吃和滞后。

你想要这样做的方法是在游戏初始化时,或者在内容加载阶段,创建一个100比例的子弹队列:

Queue<Bullet> bulletCache;

然后用100个子弹实例填充该列表:

for (int i = 0; i < 100; i++)
    bulletCache.Enqueue(new Bullet());

在你的游戏中,当你需要射击子弹时,只需将其中一个出局,设置它的速度,位置等,然后让它渲染。当它不再可见时(即点击某些内容,超出屏幕界限等),再将它排队。

这样你就不会在游戏循环中实例化任何东西,只是回收相同的对象。如果你在游戏中使用尽可能多的东西,那么你将拥有非常流畅的游戏玩法。如果您养成了在更新循环中创建对象的习惯,Compact Framework的垃圾收集器(电话中的垃圾收集器)将在某个时刻启动以清理它们并将拆除游戏的帧速率。

希望有所帮助:)