无法更改使用类函数在main中创建的int值

本文关键字:main 创建 int 类函数 | 更新日期: 2023-09-27 18:20:41

-我无法更改使用类函数在main中创建的int值-

我正在制作一个游戏,我有一个名为sideCollision的函数,它检查玩家是否正在触摸pictureBox,如果玩家正在触摸pictureBox,则名为Score的整数将增加1。

以下是功能:

public void sideCollision(Control player,Control pointRadius,Control topPipe,Control bottomPipe,Control gameOver,int force,bool timer,int score,int pointRadiusCounter)
{
    if (player.Right > pointRadius.Left && player.Left < pointRadius.Right - player.Width / 2 && player.Bottom > pointRadius.Top)
    {
        if (timer == true && pointRadiusCounter == 0)
        {
            pointRadiusCounter = 1;
            score++;
        }
    }
}

该功能检测到玩家触摸墙壁,但不会将分数增加1。我的主页中还有一条消息,说"分数尚未分配,并且将始终具有默认值0"。

我需要知道如何使用该函数更改分值,因为该函数不会更改Score 的值

无法更改使用类函数在main中创建的int值

在这种情况下不应该使用传递引用。相反,在这种情况下,你可以使用这样的东西。

private void SomeMethod()
{
    var score = 0;
    var pointRadiusCounter = 0;
    if (CollisionOccurred(...))
    {
        score++;
        pointRadiusCounter++;
    }
    ...
    ...
    ...
}
public bool CollisionOccurred(Control player,Control pointRadius,Control topPipe,Control bottomPipe,Control gameOver,int force,bool timer)
{
    if (player.Right > pointRadius.Left && player.Left < pointRadius.Right - player.Width / 2 && player.Bottom > pointRadius.Top)
    {
        if (timer == true && pointRadiusCounter == 0)
        {
            return true;
        }
    }
    return false;
}

请原谅我有点离题,但这可能会帮助您避免目前遇到的问题:

我会考虑将哪些变量作为参数以及哪些变量也可以从您的类,因为无论是否更改,它们的值都将是在代码的任何点都是相同的(例如,玩家的生命点,球员的得分、球员的位置)。

然后您可以将它们转移到自己的类中(对于本例"播放器"类),使这些变量成为该类的属性,以及通过使属性可供其他类访问如果只有1个玩家,则为public staticSingleton-class游戏。

将尽可能多的变量传递给sideCollision(...)可能会在您的项目中造成很多麻烦变得更大。对变量、方法、,类等可以帮助你防止这种情况。所以慢慢来思考关于什么是重要的,你在哪里需要它等等。

int是一种值类型。这意味着它是通过值传递的,在函数内部,您有一个原始变量的副本。您可以通过显式引用传递来解决此问题:

public void sideCollision(Control player,Control pointRadius,Control topPipe,Control bottomPipe,Control gameOver,int force,bool timer, ref int score, ref int pointRadiusCounter)
{
    if (player.Right > pointRadius.Left && player.Left < pointRadius.Right - player.Width / 2 && player.Bottom > pointRadius.Top)
    {
        if (timer == true && pointRadiusCounter == 0)
        {
            pointRadiusCounter = 1;
            score++;
        }
    }
}