提问人:BlixerCZ 提问时间:3/10/2023 最后编辑:BlixerCZ 更新时间:3/11/2023 访问量:53
无法使用方法跨类更改变量的值
Unable to change the value of a variable across classes using methods
问:
我正在尝试创建一个泰拉瑞亚 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;
答:
您有一个静态嵌套成员,您可以在其中进行更新。这是程序中的单个副本。无论您创建多少个实例,您始终会更新一个嵌套实例。RankSign
RankSign
RankSign
我仍然不太清楚你想做什么,但你肯定需要稍微改变一下设计。
评论
_rankID
_rank
Update
else if (Combo >= 5500)
是多余的;只要一个就足够了。else