2011-10-01 3 views
1

나는 나의 HUD에 SpriteFont을 추가하고이 내가 무엇을 얻을 수 있습니다 :XNA C#을 HUD SpriteFont

http://i557.photobucket.com/albums/ss13/KookehMonsters/Dev/Untitled-1.png

그 모든 흰색 반점이 내 카메라 패닝에서하고 텍스트를 따라 다음과 같습니다. 무슨 일 이니? GamePlayScreen.cs

의 GamePlayScreen.cs

에서

 Label displayName = new Label(); 

     displayName.Text = "DisplayName"; 
     displayName.Size = displayName.SpriteFont.MeasureString(displayName.Text); 
     displayName.Position = new Vector2((int)player.Camera.Position.X, (int)player.Camera.Position.Y); 

     ControlManager.Add(displayName); 

     ControlManager.Draw(GameRef.SpriteBatch); 

Label.cs

public class Label : Control 
{ 
    public Label() 
    { 
     tabStop = false; 
    } 

    public override void Update(GameTime gameTime) 
    { 
    } 

    public override void Draw(SpriteBatch spriteBatch) 
    { 
     spriteBatch.DrawString(SpriteFont, Text, Position, Color); 
    } 

    public override void HandleInput() 
    { 
    } 
} 

업데이트 방법

public override void Update(GameTime gameTime) 
    { 
     player.Update(gameTime); 
     sprite.Update(gameTime); 
     hud.Update(gameTime); 

     if (InputHandler.KeyReleased(Keys.Add)) 
     { 
      player.Camera.ZoomIn(); 
      if (player.Camera.CameraMode == CameraMode.Follow) 
       player.Camera.LockToSprite(sprite); 
     } 
     else if (InputHandler.KeyReleased(Keys.Subtract)) 
     { 
      player.Camera.ZoomOut(); 
      if (player.Camera.CameraMode == CameraMode.Follow) 
       player.Camera.LockToSprite(sprite); 
     } 

     Vector2 motion = new Vector2(); 

     if (InputHandler.KeyDown(Keys.W)) 
     { 
      sprite.CurrentAnimation = AnimationKey.Up; 
      motion.Y = -1; 
     } 
     else if (InputHandler.KeyDown(Keys.S)) 
     { 
      sprite.CurrentAnimation = AnimationKey.Down; 
      motion.Y = 1; 
     } 

     if (InputHandler.KeyDown(Keys.A)) 
     { 
      sprite.CurrentAnimation = AnimationKey.Up; 
      motion.X = -1; 
     } 
     else if (InputHandler.KeyDown(Keys.D)) 
     { 
      sprite.CurrentAnimation = AnimationKey.Down; 
      motion.X = 1; 
     } 

     if (motion != Vector2.Zero) 
     { 
      sprite.IsAnimating = true; 
      motion.Normalize(); 

      sprite.Position += motion * sprite.Speed; 
      sprite.LockToMap(); 

      if (player.Camera.CameraMode == CameraMode.Follow) 
       player.Camera.LockToSprite(sprite); 
     } 
     else 
     { 
      sprite.IsAnimating = false; 
     } 

     if (InputHandler.KeyReleased(Keys.F)) 
     { 
      player.Camera.ToggleCameraMode(); 
      if (player.Camera.CameraMode == CameraMode.Follow) 
       player.Camera.LockToSprite(sprite); 
     } 

     if (player.Camera.CameraMode != CameraMode.Follow) 
     { 
      if (InputHandler.KeyReleased(Keys.C)) 
      { 
       player.Camera.LockToSprite(sprite); 
      } 
     } 

     base.Update(gameTime); 
    } 

그리기 방법

public override void Draw(GameTime gameTime) 
    { 
     GameRef.SpriteBatch.Begin(
      SpriteSortMode.Deferred, 
      BlendState.AlphaBlend, 
      SamplerState.PointClamp, 
      null, 
      null, 
      null, 
      player.Camera.Transformation); 

     map.Draw(GameRef.SpriteBatch, player.Camera); 

     sprite.Draw(gameTime, GameRef.SpriteBatch, player.Camera); 

     hud.Draw(gameTime); 

     base.Draw(gameTime); 

     GameRef.SpriteBatch.End(); 
    } 
+1

처음 기록 된 코드 블록은 어디에 있습니까? ControlManager.Draw (GameRef.SpriteBatch); 새 위치에서 매 프레임마다 많은 수의 레이블을 다시 만들거나 이전 레이블 그리기 화면을 지우지 않습니다. 확신하기 위해 더 많은 코드가 필요합니다. – Benjamin

+0

원래 게시물에 코드를 추가했습니다. – KeyHeart

답변

2

으로 HUD를 그릴하지 마십시오 카메라 변환, 그리고 물론 할 이제 카메라가 고정되어 있기 때문에 카메라로 허리 위치를 업데이트하지 마십시오.

public override void Draw(GameTime gameTime) 
{ 
    GameRef.SpriteBatch.Begin(
     SpriteSortMode.Deferred, 
     BlendState.AlphaBlend, 
     SamplerState.PointClamp, 
     null, 
     null, 
     null, 
     player.Camera.Transformation); 

    map.Draw(GameRef.SpriteBatch, player.Camera); 

    sprite.Draw(gameTime, GameRef.SpriteBatch, player.Camera); 

    base.Draw(gameTime); 

    GameRef.SpriteBatch.End(); 

    GameRef.SpriteBatch.Begin(); 
    hud.Draw(gameTime); 
    GameRef.SpriteBatch.End(); 
}