如何解决XNA C#代码问题
| 这是我绘制平视显示器的班级: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);
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,FontOrigin,1.0f,SpriteEffects.None,0.5f);
spriteBatch.DrawString(HUD,output2,FontPos2,Color.Blue,0.5f);
spriteBatch.End();
}
}
}
因此,我如何从这里调用它以便绘制。
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
base.Draw(gameTime);
}
我要问的问题是如何从方法中调用类?
解决方法
public void Hud()
实际上是类的构造函数,它不应该负责绘制(尤其是因为您多次绘制同一个类,并且构造函数的目的是...构造一个类)
因此,第一步是删除它:
spriteBatch.Begin(SpriteSortMode.Deferred,BlendState.AlphaBlend,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,FontOrigin,1.0f,SpriteEffects.None,0.5f);
spriteBatch.DrawString(HUD,output2,FontPos2,Color.Blue,0.5f);
spriteBatch.End();
从构造函数中添加到一个新的类方法中,例如Draw()。
更新:
XNA提供了Game类,它似乎是应用程序的主要类。它应该包含对您的类的对象的引用。
spritebatch
也是Game类的成员,因此应将其作为参数传递给HUD的Draw函数。然后,您需要做的就是从Game的Draw方法中调用HUD的Draw方法(从游戏对象可以访问的HUD对象)。
, 在这里同意其他答案,但我会再讲一遍。
将您的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(新的HudComponent(this));
您的组件现在将成为游戏主循环的一部分。
, 制作一个抽象类,例如GameElement
,其中包含方法Update
和Draw
。
然后创建GameElementList<GameElement> Elements
的(静态)列表。
使您的类HUD继承GameElement并实现方法Update(基于游戏时间更新逻辑)和Draw(将游戏元素绘制到表面)。创建HUD时,将其添加到列表Elements
在主Draw方法中,调用ѭ15。
这样,您就可以处理HUD和任何其他游戏元素(场景,播放器等)的绘制和更新,而无需更改主绘制和更新循环。
您甚至可以将GameElement设置为IGameElement接口,以使您不仅限于继承GameElement类。
, 您不能调用创建类实例的类。
Classname class = new Classname();
class.method();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。