2011-06-13 51 views
0

這裏是我的課我做畫一個HUD: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, 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); 
    } 

我問的問題是如何從一個方法調用一個類?

+0

2行的實際問題和代碼加載!爲什麼不多解釋一下。 – Shoban 2011-06-13 07:01:49

回答

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(); 

從構造並把它添加到一個新的類的方法,例如繪圖()。

UPDATE:

XNA提供了一個遊戲類,這似乎是主類的應用程序。它應該包含對您班級對象的引用。

spritebatch也是Game類的成員,所以它應該作爲參數傳遞給HUD的Draw函數。然後你需要做的就是從遊戲的Draw方法中調用HUD的Draw方法(HUD對象可以從Game對象中獲得)。

+0

這對這一行非常有用:HUD = Content.Load (「HUD」);內容是紅色的低調,並說它不存在於當前的情況下。 – 2011-06-13 08:35:50

+0

@Crash_Override:執行與您爲Draw方法執行的操作類似的操作,這次是爲LoadContent。你不應該在構造函數中這麼做...並且找到一個教程:) – Andrei 2011-06-13 08:40:32

0

你不能調用你創建它的一個實例的類。

Classname class = new Classname(); 
class.method(); 
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類。

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; 
    
  • 最後,在你的遊戲類的初始化方法,添加以下代碼: -

Components.Add(new HudComponent(this));

你的組件現在將成爲主遊戲循環的一部分。

+0

我不知道你是什麼意思的這一行:在Visual Studio 2010中創建一個新的遊戲組件 – 2011-06-13 08:25:31

+0

添加新項目 - >遊戲組件 – 2011-06-13 09:44:28