无法使用方法跨类更改变量的值

Unable to change the value of a variable across classes using methods

提问人:BlixerCZ 提问时间:3/10/2023 最后编辑:BlixerCZ 更新时间:3/11/2023 访问量:53

问:

我正在尝试创建一个泰拉瑞亚 tModLoader 模组,该模组根据玩家拥有的组合显示战斗等级,但我在更新 UI 的纹理时遇到了问题。计算玩家连击的系统位于一个单独的类中,并将排名值存储在 int 变量(变量 Rank)中。它使用 RankExchange 方法计算此值,该方法在游戏的每个价格变动时调用。然后,此方法调用 UIElement 类中的另一个方法,其中 UI 纹理根据接收到的值(变量 _rankID)进行更改。问题是,在任何情况下,我都无法使用该方法更改 UI 纹理所依赖的变量的值。

当我尝试更改 Update(GameTime gameTime) void 中的 _rankID 值时,一切正常,UI 正确更改(我在 Update void 中使用了 _rankID--; 运算符)。

为什么我不能使用自定义方法跨类更改变量的值?

ModPlayer 类:

public class btPlayer : ModPlayer
{
        //Changing Rank value
        public void RankExchange(int Combo, bool Announcer)
        {
            if (Combo < 170)
            {
                Rank = 0;
            }
            else if (Combo < 300)
            {
                Rank = 1;
            }
            else if (Combo < 500)
            {
                Rank = 2;
            }
            else if (Combo < 1000)
            {
                Rank = 3;
            }
            else if (Combo < 2000)
            {
                Rank = 4;
            }
            else if (Combo < 3500)
            {
                Rank = 5;
            }
            else if (Combo < 5500)
            {
                Rank = 6;
            }
            else if (Combo >= 5500)
            {
                Rank = 7;
            }

            if (Rank != RankState)
            {
                RankState = Rank;
                if(Announcer == true)
                {
                    AnnouncerCall(Rank);
                }
            }

            RankSign.rankInstance.SetValue(Rank); //This is the reference to the UIElement class.
        }
}

UIElement 类:

public class RankSign : UIElement
    {
        public Texture2D _rank;
        public static RankSign rankInstance = new RankSign();
        public int _rankID;

        public RankSign()
        {
            _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/NULL").Value;
            _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/D").Value;
            _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/C").Value;
            _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/B").Value;
            _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/A").Value;
            _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/S").Value;
            _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/SS").Value;
            _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/SSS").Value;
        }


        public override void Update(GameTime gameTime)
        {
            if (_rankID == 0)
            {
                _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/NULL").Value;
            }
            else if (_rankID == 1)
            {
                _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/D").Value;
            }
            else if (_rankID == 2)
            {
                _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/C").Value;
            }
            else if (_rankID == 3)
            {
                _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/B").Value;
            }
            else if (_rankID == 4)
            {
                _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/A").Value;
            }
            else if (_rankID == 5)
            {
                _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/S").Value;
            }
            else if (_rankID == 6)
            {
                _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/SS").Value;
            }
            else if (_rankID == 7)
            {
                _rank = ModContent.Request<Texture2D>("btTheme/Assets/Textures/SSS").Value;
            }
            base.Update(gameTime);
        }

        public override void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(_rank, new Vector2(Main.screenWidth + 20, Main.screenHeight - 20) / 2f, Color.LightGray);
        }

        public void SetValue(int value)
        {
            _rankID = value; //This should change the texture, but it is not doing anything.
        }
    }

编辑:我更改了 btPlayer 类的代码,使其现在使用对 RankSign 类对象的引用而不是实例。我还检查了 Update 方法是否定期调用(它应该在每个游戏滴答时调用,所以没问题)。现在 btPLayer 类看起来像这样(RankSign 类保持不变,唯一的区别是我删除了 ):public static RankSign rankInstance = new RankSign();

public class btPlayer : ModPlayer
{
        RankSign RankSign = new RankSign();

        public void RankExchange(int Combo, bool Announcer)
        {
            if (Combo < 170)
            {
                Rank = 0;
            }
            else if (Combo < 300)
            {
                Rank = 1;
            }
            else if (Combo < 500)
            {
                Rank = 2;
            }
            else if (Combo < 1000)
            {
                Rank = 3;
            }
            else if (Combo < 2000)
            {
                Rank = 4;
            }
            else if (Combo < 3500)
            {
                Rank = 5;
            }
            else if (Combo < 5500)
            {
                Rank = 6;
            }
            else
            {
                Rank = 7;
            }

            if (Rank != RankState)
            {
                RankState = Rank;
                if(Announcer == true)
                {
                    AnnouncerCall(Rank);
                }
            }

            RankSign.SetValue(Rank);
        }
}

但是,我仍然无法更改_rankID的值(即使我尝试直接使用而不是使用 SetValue() 方法更改值)。程序不断将_rankID值打印到游戏聊天中,并且该值不会更改。RankSign._rankID = Rank;

C# 变量方法 游戏开发

评论

0赞 Fildor 3/10/2023
您正在设置 ,但在调用(并在正确的实例上)之前不会受到影响。_rankID_rankUpdate
0赞 user16217248 3/11/2023
else if (Combo >= 5500)是多余的;只要一个就足够了。else

答:

0赞 YungDeiza 3/10/2023 #1

您有一个静态嵌套成员,您可以在其中进行更新。这是程序中的单个副本。无论您创建多少个实例,您始终会更新一个嵌套实例。RankSignRankSignRankSign

我仍然不太清楚你想做什么,但你肯定需要稍微改变一下设计。