C# 发生碰撞时分数不改变

C# 发生碰撞时分数不改变,c#,xna,C#,Xna,我一直在努力让我的分数在玩家与其中一件收藏品发生碰撞时正常工作,但当碰撞发生时,分数似乎没有改变,我不知道为什么会发生这种情况 在我的收藏品中,我有这样一个: class BlueBall : Obj { public BlueBall(Vector2 pos) : base(pos) { position = pos; spriteName = "BlueBall"; solid = false;

我一直在努力让我的分数在玩家与其中一件收藏品发生碰撞时正常工作,但当碰撞发生时,分数似乎没有改变,我不知道为什么会发生这种情况

在我的收藏品中,我有这样一个:

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;
        }
因此,如果球员与蓝球相撞,分数应该增加20,蓝球应该消失,它确实消失了,但分数没有改变,这是为什么


此时,我正在Game1类中声明我的分数,并使用
public int score
Vector2 scorePos
对其进行定位。然后我用
score=0初始化分数然后在更新中加载scorePos值

从您的代码和注释中可以清楚地看出,实际上有两个得分变量。属于游戏所有的人:

public class Game
{
    private int score;

    void Draw(...)
    {
       spriteBatch.DrawString(font, "Score: " + score.ToString(), scorePos, Color.White);
    }
}
还有一个是球的主人:

现在,这两个分数变量之间绝对没有关系。它们被命名为相同的这一事实完全不相关

要快速进行类比,请将编程对象想象为长方体。每个变量都是一个“计数器”。你把一个计数器放在“游戏”框中,称之为“分数”。你把另一个计数器放在“球”框中,也叫它“得分”。显然,修改“球”框中的计数器不会影响“游戏”框中的计数器,反之亦然。通常,这个概念在编程中称为“范围”。每个变量的作用域都是它的框,框可以是类、函数,甚至是using块(作用域由
{}
创建)

现在您已经了解了问题,有几种方法可以解决它:

  • 创建一个全局变量。实际上,在C#中不能这样做,但可以创建其他两个对象都可以访问的另一个对象。两个对象都不引用/修改其“score”属性。一个简单(但实践不佳)的例子是:

    public static class GlobalState
    {
        public static int GameScore { get; set; }
    }
    
  • 所有对分数的引用都将变成
    GlobalState.GameScore
    。同样,这只是为了让您继续,这种代码是非常糟糕的做法,可能会导致错误(特别是在多线程的情况下)

  • 让球在碰撞时升起一个项目。游戏将注册此事件并适当增加其“分数”变量

  • 通过ref将游戏的“score”变量传递给碰撞方法,以便它可以更改它警告:这是为了完整性而包括在内的,并且只能在特定情况下进行,而您的情况可能不是其中之一。

  • 在创建时将代理传递给球,以便在需要增加分数时调用。这实际上是事件方法的一个变体


  • 我肯定还有其他人。考虑到您的经验水平,我将从全局方法开始(因为它最简单,需要最少的知识),然后开始学习事件,并在将来使用这种方法。

    从您的代码和您的评论中,可以清楚地看到实际上有两个得分变量。属于游戏所有的人:

    public class Game
    {
        private int score;
    
        void Draw(...)
        {
           spriteBatch.DrawString(font, "Score: " + score.ToString(), scorePos, Color.White);
        }
    }
    
    还有一个是球的主人:

    现在,这两个分数变量之间绝对没有关系。它们被命名为相同的这一事实完全不相关

    要快速进行类比,请将编程对象想象为长方体。每个变量都是一个“计数器”。你把一个计数器放在“游戏”框中,称之为“分数”。你把另一个计数器放在“球”框中,也叫它“得分”。显然,修改“球”框中的计数器不会影响“游戏”框中的计数器,反之亦然。通常,这个概念在编程中称为“范围”。每个变量的作用域都是它的框,框可以是类、函数,甚至是using块(作用域由
    {}
    创建)

    现在您已经了解了问题,有几种方法可以解决它:

  • 创建一个全局变量。实际上,在C#中不能这样做,但可以创建其他两个对象都可以访问的另一个对象。两个对象都不引用/修改其“score”属性。一个简单(但实践不佳)的例子是:

    public static class GlobalState
    {
        public static int GameScore { get; set; }
    }
    
  • 所有对分数的引用都将变成
    GlobalState.GameScore
    。同样,这只是为了让您继续,这种代码是非常糟糕的做法,可能会导致错误(特别是在多线程的情况下)

  • 让球在碰撞时升起一个项目。游戏将注册此事件并适当增加其“分数”变量

  • 通过ref将游戏的“score”变量传递给碰撞方法,以便它可以更改它警告:这是为了完整性而包括在内的,并且只能在特定情况下进行,而您的情况可能不是其中之一。

  • 在创建时将代理传递给球,以便在需要增加分数时调用。这实际上是事件方法的一个变体


  • 我肯定还有其他人。考虑到您的经验水平,我将从全局方法开始(因为它最简单,需要的知识最少)然后开始学习有关事件的知识,并在将来采用这种方法。

    你能告诉我们分数是多少吗。@deathismyfriend for score我刚刚简单地做了
    int score
    并声明它,然后将分数设置为0,分数在哪里定义?那个变量真的被画出来了吗?它的范围正确吗?代码还不够。@BradleyDotNET我已经编辑了我的原始文章,以包含更多的代码和信息,希望这有助于。。。。画得好吗?听起来绘图代码要么没有执行,要么没有接收更新,你能告诉我们分数是多少吗。@deathismyfriend for score我刚才只做了
    int score
    并声明了它,然后将分数设置为0,分数定义在哪里?那个变量真的被画出来了吗?它的范围正确吗?代码还不够。@BradleyDotNET我已经编辑了我的原始代码