C# 杀敌加分不一致

C# 杀敌加分不一致,c#,xna,monogame,C#,Xna,Monogame,我正在制作一个小行星毁灭者游戏,随着时间的推移,你会得到分数(游戏变得越来越难),但是当你撞上一颗小行星时也是如此。我在Game1类中编写了一个方法来计算Update方法结束时应该添加的分数量 代码如下: private float CountScore(GameTime gameTime, List<Asteroid> asteroids) { float addScore = 0; foreach (Asteroid asteroid in asteroids)

我正在制作一个小行星毁灭者游戏,随着时间的推移,你会得到分数(游戏变得越来越难),但是当你撞上一颗小行星时也是如此。我在
Game1
类中编写了一个方法来计算
Update
方法结束时应该添加的分数量

代码如下:

private float CountScore(GameTime gameTime, List<Asteroid> asteroids)
{
    float addScore = 0;
    foreach (Asteroid asteroid in asteroids)
    {
        if (asteroid.Killed)
        {
            addScore += 100;
        }
    }

    if (spaceship1.Alive)
    {
        addScore += 80 * (float)gameTime.ElapsedGameTime.TotalSeconds;
    }

    return addScore;
}
代码中随着时间推移而增加分数的部分工作正常。问题是,当我摧毁一颗小行星时,不是多得到100分,有时是200分,有时是2000分,有时是5000分。我不明白发生了什么,因为只有被玩家杀死的小行星才能获得属性
killed=true,所以我真的不认为它在屏幕上增加了100颗小行星

有人知道这是什么原因吗?如果需要,我可以发布更多的代码,但为了可读性,我不想在这里写太多

编辑:
添加
asteroid.Killed=false在添加分数后立即生效。然而,我仍然不明白问题出在哪里,因为它似乎不止一次地在同一颗小行星上循环。

我建议在小行星被击毙时增加分数的逻辑与击毙小行星的逻辑同时进行

在处理命中检测时,很可能您已经在遍历小行星列表,因此如果同时执行逻辑,而不是像代码中所示的那样使用另一个foreach循环,则会提高性能


此外,您的addScore+=80*(float)gameTime.ElapsedGameTime.TotalSeconds;不可靠,FPS较高的玩家将拥有不公平的优势。我建议在奥运会进程中增加总分时使用deltaTime。

我建议在杀死小行星时增加分数的逻辑与杀死小行星的逻辑同时进行

在处理命中检测时,很可能您已经在遍历小行星列表,因此如果同时执行逻辑,而不是像代码中所示的那样使用另一个foreach循环,则会提高性能


此外,您的addScore+=80*(float)gameTime.ElapsedGameTime.TotalSeconds;不可靠,FPS较高的玩家将拥有不公平的优势。我建议在奥运会进程中添加总分时使用deltaTime。

我看不到您正在从
小行星
列表中删除已处理的小行星,因此可能您正在为每颗被销毁的小行星添加100分,除非在程序的其他地方删除小行星,看起来被杀死的小行星只是堆积在名单上,每次另一颗小行星被杀死都会得到100分。请注意,如果在该函数中从列表中删除被杀死的小行星,则需要在单独的循环中执行此操作,因为在使用
foreach
循环枚举集合时,不允许修改集合。小行星被杀死时,
bool
属性
killed
将更改为true,所有新小行星都设置为false的属性。此外,我不会将它们从列表中删除,因为我重用了被杀死的小行星(给他们一个新的位置,并再次将
Killed
设置为false。我还应该注意,有时在当前游戏中被杀死的第一颗小行星会得到5000或更多的分数。@Nordellak那么,你可能需要另一种变量,例如int,来表示alive、Killed、Killed和processed。我对此表示怀疑除非多次调用该方法,否则使用此代码杀死的第一颗小行星将得到5000分,并且使用
killed
的int属性也将解决此问题it@Pikoh我试图更改代码,以便在添加分数后,将asteroid.Killed设置为false,并且成功了。我仍然不明白为什么不成功从另一个角度看,它就像是在同一颗小行星上绕了不止一圈。不过,谢谢你的提示;)我看不出您正在从小行星列表中删除处理过的小行星,因此,可能您正在为每颗被销毁的小行星添加100分,除非在程序的其他地方删除小行星,否则被杀死的小行星似乎只是堆积在列表中,并且每次另一颗小行星被杀死时都会得到100分如果在该函数中从列表中删除被杀死的小行星,则需要在单独的循环中执行,因为在使用
foreach
循环枚举集合时,不允许修改集合。当小行星被杀死时,
bool
属性
killed
将更改为true,这是所有新小行星都具有的属性et为false。此外,我不会从列表中删除它们,因为我重用了
杀死的
小行星(给他们一个新的位置,并再次将
Killed
设置为false。我还应该注意,有时在当前游戏中被杀死的第一颗小行星会得到5000或更多的分数。@Nordellak那么,你可能需要另一种变量,例如int,来表示alive、Killed、Killed和processed。我对此表示怀疑除非多次调用该方法,否则使用此代码杀死的第一颗小行星将得到5000分,并且使用
killed
的int属性也将解决此问题it@Pikoh我试图更改代码,以便在添加分数后,将asteroid.Killed设置为false,并且成功了。我仍然不明白为什么不成功换一种方式,就像它不止一次穿过同一颗小行星一样。不过,谢谢你的提示;)在编写此方法之前,分数添加逻辑是在检查小行星死亡后完成的,在同一个foreach循环中,我遇到了同样的问题。我尝试用另一种方法来完成
score += CountScore(gameTime, asteroids);