发生碰撞时分数不变

Score not changing when collision occurs

我一直在努力让我的分数在玩家与其中一个收藏品发生碰撞时正常工作,但当碰撞发生时分数似乎没有改变,我不确定为什么会这样。

在我的收藏品中我有这个:

class BlueBall : Obj
{
    public BlueBall(Vector2 pos) 
        : base(pos)
    {
        position = pos;
        spriteName = "BlueBall";
        solid = false;
        score = 0;
    }

    public override void Update()
    {
        if (!alive) return;

        Player player = CheckCollisionAgainst<Player>();
        if (player != null)
        {
            score = score + 20;
            alive = false;
        }

我正在 Game1 class 中绘图:

spriteBatch.DrawString(font, "Score: " + score.ToString(), scorePos, Color.White);

所以如果 Player 与 BlueBall 发生碰撞,则应该将 20 添加到分数中并且 BlueBall 应该消失,它确实消失了但分数没有改变,这是为什么?

现在我宣布我在第一场比赛class中的得分,public int scoreVector2 scorePos来定位它。然后我用 score = 0; 初始化分数,然后在更新中加载 scorePos 值。

从您的代码和评论中可以清楚地看出,实际上有 两个 得分变量。游戏拥有的一个:

public class Game
{
    private int score;

    void Draw(...)
    {
       spriteBatch.DrawString(font, "Score: " + score.ToString(), scorePos, Color.White);
    }
}

还有一个属于 :

public class BlueBall : Obj
{
    private int score;

    public void CheckCollisions()
    {
        if (collision)
           score += 20;
    }
}

现在,这两个分数变量彼此完全没有关系。事实上,它们的名称相同 完全无关紧要

做一个简单的类比,将编程对象想象成盒子。每个变量都是一个"counter"。您在 "Game" 框中放置一个计数器并将其命名为 "score"。您将 另一个 计数器放在 "Ball" 框中,并将其命名为 "score"。显然,修改 "Ball" 框中的计数器不会影响 "Game" 框中的计数器,反之亦然。一般来说,这个概念在编程中叫做"scoping"。每个变量的范围都在其框内,可以是 class、函数,甚至是 using 块(范围由 {} 创建)。

既然您了解了问题,有几种方法可以解决它:

  1. 创建一个全局变量。您实际上不能在 C# 中执行此操作,但您可以创建其他两个对象都可以访问的另一个对象。这两个对象都比 reference/modify 它是 "score" 属性。一个简单的(也是糟糕的做法)示例是:

    public static class GlobalState
    {
        public static int GameScore { get; set; }
    }
    

所有对分数的引用都将变为 GlobalState.GameScore。同样,这只是为了让你继续,这种代码 是非常糟糕的做法,并且会导致错误(尤其是在多线程情况下).

  1. 让球在碰撞时引发事件。游戏将注册此事件并适当地增加其 "score" 变量。

  2. 将游戏的"score"变量通过ref传递给collision方法,使其可以改变。 警告:这是为了完整性而包括在内,这应该只在特定情况下进行,您的情况可能不是其中之一。

  3. 创建时将委托传递给球,以便在需要增加分数时调用。这实际上是事件方法的变种。

我确定还有其他人。鉴于您的经验水平,我会开始使用全局方法(因为它最简单并且需要最少的知识),然后转向了解事件并在将来使用该方法.