XNA C#代码问题

时间:2011-06-13 07:00:04

标签: c# methodology xna-4.0

这是我为绘制HUD所做的课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;

namespace Sleyser1
{

public class Hud
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    Texture2D tempHUD;
    Rectangle viewportRect;

    SpriteFont HUD;
    Vector2 FontPos;
    Vector2 FontPos2;

    public void Hud()
    {
        HUD = Content.Load<SpriteFont>("HUD");
        FontPos = new Vector2(40, 20);
        FontPos2 = new Vector2(150, 20);

        spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null);

        spriteBatch.Draw(tempHUD, viewportRect, Color.White);

        string output = "Health:";
        string output2 = "Magic:";
        Vector2 FontOrigin = HUD.MeasureString(output) / 2;
        spriteBatch.DrawString(HUD, output, FontPos, Color.Red, 0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
        spriteBatch.DrawString(HUD, output2, FontPos2, Color.Blue, 0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);

        spriteBatch.End();

    }
}
}

那么如何从这里调用它以便绘制。

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);


        base.Draw(gameTime);
    }

我问的问题是你如何用方法调用一个类?

4 个答案:

答案 0 :(得分:3)

public void Hud()

实际上是你的类的构造函数,它不应该负责绘图(特别是因为你多次绘制同一个类,构造函数的目的是...构造一个类)

所以,第一步是删除它:

spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null);

spriteBatch.Draw(tempHUD, viewportRect, Color.White);

string output = "Health:";
string output2 = "Magic:";
Vector2 FontOrigin = HUD.MeasureString(output) / 2;
spriteBatch.DrawString(HUD, output, FontPos, Color.Red, 0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
spriteBatch.DrawString(HUD, output2, FontPos2, Color.Blue, 0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);

spriteBatch.End();

从构造函数中将其添加到新的类方法中,例如Draw()。

更新:

XNA提供了一个Game类,它似乎是应用程序的主要类。它应该包含对类的对象的引用。

spritebatch也是Game类的成员,因此它应作为参数传递给HUD的Draw函数。然后你需要做的就是从Game的Draw方法中调用HUD的Draw方法(一个可以从Game对象访问的HUD对象)。

答案 1 :(得分:1)

在这里同意其他答案,但我会更进一步。

将您的Hud类转换为一个组件,特别是实现DrawableGameComponent的组件。这样,您可以将所有Hud逻辑封装到一个位置,顾名思义,组件可以自行绘制。

所以,步骤: -

  • 在LoadContent方法中,添加以下代码: -

    Services.AddService(typeof(SpriteBatch),spriteBatch);

  • 在Visual Studio 2010中创建新的游戏组件

  • 更改组件继承的类。首先,它将是GameComponent。将其更改为DrawableGameComponent
  • 覆盖LoadContent方法。虽然您未在示例中专门加载任何其他内容,但您可能希望稍后添加Hud特定内容。
  • 覆盖Update方法。应在此处对Hud进行任何状态更改(即更改运行状况或魔法值)。
  • 覆盖Draw方法。任何特定于绘图的东西都应该放在这里。请注意,您可以通过在此重写方法中包含以下代码来获取主SpriteBatch服务的句柄(在前面声明): -

    SpriteBatch spriteBatch =
            Game.Services.GetService(typeof(SpriteBatch)) as SpriteBatch;
    
  • 最后,在游戏类的initialize方法中,添加以下代码: -

Components.Add(new HudComponent(this));

您的组件现在将成为主游戏循环的一部分。

答案 2 :(得分:0)

你无法调用你创建它的实例的类。

Classname class = new Classname();
class.method();

答案 3 :(得分:0)

创建一个抽象类,例如GameElement,其中包含方法UpdateDraw

然后创建一个GameElement List<GameElement> Elements的(静态)列表。

让你的班级HUD继承GameElement并实现方法Update(基于游戏时间更新逻辑)和Draw(将游戏元素绘制到表面)。创建HUD时,将其添加到列表Elements

在主Draw方法中调用foreach(var element in Elements) element.Draw()

通过这种方式,您可以处理HUD和任何其他游戏元素(场景,播放器等)的绘制和更新,您无需更改主绘图和更新循环。

您甚至可以将GameElement设置为IGameElement接口,这样您就不会限制继承GameElement类。