【问题标题】:SpriteBatch becoming null when passed? / Drawing a sprite in a different class?SpriteBatch 在传递时变为空? / 在不同的类中绘制精灵?
【发布时间】:2023-03-06 13:39:01
【问题描述】:

在将此问题标记为重复问题之前,请先阅读。

由此而来: How can I draw a sprite in it's own class?

关于上述问题,乔纳森帮助我做到了这一点,我解决了我原来的问题。但我想知道其他一些事情,但我没有足够的代表发表评论,所以我开始了一个新问题。


所以我有一个 XNA 游戏,我想在其中添加命中数(命中数是在某物损坏时出现一秒钟的小数字),但我正在努力解决它。我的EnemyTest 类有一个名为Damage 的int。当它们发生碰撞时,它会传递给Player 类,以便玩家知道需要多少生命值。但是我需要再次将它传递给HitNumbers 类以在DrawString 中显示该数字。

我的问题是我在HitNumbers 中有一个Draw() 方法,它采用SpriteBatch spriteBatch(用于显示DrawString()int Damage 的数字。但Player 类发送Damage值传递给主类,然后主类将它传递给SpriteBatchHitNumbers,它会抛出一个 NullReferenceException(显然 Spritebatch 为空,但是当它绘制所有其他精灵时它怎么可能为空呢?强>) 但我有点困惑,我知道有些不正确的东西正盯着我看,但我就是看不到。这就像把你的手指真正靠近你的眼睛并试图专注于它。也许我的大脑情绪不太好,但我希望有人能帮助我。

HitNumbers的相关部分

public void Draw(SpriteBatch spriteBatch, int damage)
{
    // print 'sbnull' to console if received spritebatch is null
    if(spriteBatch == null)
    {
        Console.WriteLine("sbnull");
    }

    spriteBatch.DrawString(RPG.font, EnemyTest.Damage.ToString(), RPG.hn.PlayerPos, Color.Red);  
}

Player的相关部分

public void Damage(int damage)
{
    Health -= damage;

    main.showHitNumber(damage);
}

RPG(主类)的相关部分

public void showHitNumber(int damage)
{
    hn.Draw(spriteBatch, damage);
}

【问题讨论】:

  • 在代码中插入一个断点并单步执行,看看是否一切如你所愿。也许,Player 有一个不同的RPG 实例。您也可以考虑将 sprite 批处理作为游戏服务。
  • 感谢您的回复,我是 XNA 的初学者,所以我什至不确定游戏服务的作用或如何创建游戏服务。我稍后会研究它。我也会通过它。

标签: c# .net xna draw xna-4.0


【解决方案1】:

因为您有两个 spritebatch,而您正在传递未初始化的一个。

在这段代码中:

public void showHitNumber(int damage)
{
    hn.Draw(spriteBatch, damage);
}

将光标放在“spriteBatch”上并单击鼠标右键,然后选择“搜索所有引用”。这将显示您正在使用该 spritebacth 实例。

你会遇到两种情况:

  1. 该 spritebatch 实例从未初始化。
  2. 已初始化,但从未调用初始化它的方法。

【讨论】:

  • 好的,那么我将如何使用我想要的实例呢?
  • 确保您使用的是初始化实例。您可以声明一个全局静态实例,也可以传递用于绘制播放器的 spritebatch 实例 => main.showHitNumber(spritebatch, damage);
猜你喜欢
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多