使用c#/ xna框架如何使用多个类在屏幕上绘制重叠的游戏分数?

时间:2012-11-10 21:08:41

标签: c# xna

(我尝试发布图片,但不能b / c我的stackoverflow声誉不够高,所以我试图画一个单词图片:)“

我当前的分数输出是'SCORE:0'在屏幕的左上角写了两次(一个用红色字母,另一个用黄色),但是位置略有不同,给字母/数字一个复古的重叠外观。只有一个分数,但两个分数相同。

问题是当黄色图层保持为0时,只有红色图层会更新。

我在FontManager类(见下文)中使用不同的颜色/位置创建了我的ScoreFont类的两个对象,以使用以下代码给出重叠的感觉(黄色为红色);

fontList.Add(new ScoreFont(Game.Content.Load<SpriteFont>(@"Fonts\Score"), scoreText, new Vector2 (5, -5), Color.Yellow, 1f, 0f));
//Adding this to make the score font stick out more by layering it
fontList.Add(new ScoreFont(Game.Content.Load<SpriteFont>(@"Fonts\Score"), scoreText, new Vector2(9, -5), Color.Red, 1f, 0.1f));

你会注意到创建的第一个ScoreFont对象是黄色的(我试图修复的那个),第二个是红色(显示正确分数的那个)。如果我颠倒了这些,那么黄色会起作用但红色不会。

我正在使用for循环更新/绘制FontManager类中的列表;

for (int i = 0; i < fontList.Count; i++)
        {
            Font f = fontList[i];
            f.Draw/Update(gameTime, sB);
        }

从Font.cs类派生的ScoreFont.cs类包含;

class ScoreFont : Font
{
public string scoreText;
public int totalScore = 0;

public static ScoreFont sF;
//Constructor
public ScoreFont(parameters)
:base (parameters)
{sF = this;}

//Add score
public void AddScore(int score)
{
    totalScore += score;
}
//Draw
public override void Draw(GameTime g, SpriteBatch s)
{
scoreText = "Score: " + totalScore;
s.DrawString(scoreText,blah, blah, ...);
}

当精灵通过屏幕离开时,我通过在另一个类中调用AddScore方法来更新分数;

ScoreFont.sF.AddScore(spriteList[i].score);

如果我只创建一个得分层,但是当我尝试创建两个时,这个效果很好,最顶层(黄色层)不会更新。

我该如何解决这个问题?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

除了非常笨拙地使用Font类之外,您的问题还在于:

ScoreFont.sF.AddScore(spriteList[i].score);

为什么不循环使用所有fontList项目来设置每个新的得分值?

foreach(ScoreFont font in fontList)
    font.AddScore(myScore);

您使用静态字段名sF实现单例模式,但不知何故,您有多个要更新的实例。

或者,如果您的计划只有一个分数,那么AddScoretotalScore字段也应该是静态的。