最佳的游戏全局变量存储方法是什么?

4
我有一个选项屏幕,用于设置游戏难度、分辨率、全屏等内容,但我很难找到在游戏运行时存储/获取这些变量的最佳方法。
目前我决定创建一个“常量”类,其中包含所有的GameOption枚举。但是如何为所有这些选项选择默认值,以及如何获取当前选择的枚举?
尤其是分辨率的问题 - 我已经决定存储这些值,但不确定如何获取默认或当前存储的值?
namespace V1.test.RPG
{
    public class GameOptions
    {
        public enum Difficulty
        {
            EASY,
            MEDIUM,
            HARD
        }

        public enum Sound
        {
            ON,
            QUIET,
            OFF
        }

        public enum Music
        {
            ON,
            QUIET,
            OFF
        }

        public enum ResolutionWidth
        {
            SMALL = 1280,
            MEDIUM = 1366,
            LARGE = 1920,
            WIDESCREEN = 2560
        }

        public enum ResolutionHeight
        {
            SMALL = 800,
            MEDIUM = 768,
            LARGE = 1080,
            WIDESCREEN = 1080
        }

        public Boolean fullScreen = false;
    }
}

任何方向都可以,谢谢 :)

1
你可能想创建一个GameOptions类的实例,其中包含每个选项枚举的实例。你可以有一个没有参数的构造函数,在其中自动将它们设置为它们的“默认”值。 - Wilson
1
现在有一个游戏开发的StackExchange网站。你可能想去那里问问。 - Chris Hayes
@ChrisHayes 谢谢,我也在那里提出了这个问题,http://gamedev.stackexchange.com/questions/80210/best-way-to-store-game-wide-variables - R-nold
@Wilson 谢谢您的评论,听起来像是Scott在下面的答案,看起来这似乎是正确的方法 :) - R-nold
1
@ChrisHayes:这个问题不仅限于游戏开发,它是各种应用程序中都会出现的常见问题。在游戏中,全局选项可能是难度分辨率全屏,而在办公应用程序中,同样的问题将涉及其他选项,如工具提示帮助格式工具栏图标大小和... 全屏(最大化可用工作区域)。 - O. R. Mapper
显示剩余2条评论
2个回答

7
枚举类型与类本身类似,它们不是变量。以下是一种更好的布局设置方式。
namespace V1.test.RPG
{
    public class GameOptions
    {
        public GameOptions()
        {
             FullScreen = false;
             DifficultyLevel = Difficulty.Normal;
             SoundSetting = Sound.On;
             // And so on.
        }

        public Boolean FullScreen { get; set; }
        public Difficulty DifficultyLevel { get; set; }
        public Sound SoundSetting { get; set; }
        //And so on...
    }

    public enum Difficulty 
    {
        EASY,
        MEDIUM,
        HARD
    }

    public enum Sound 
    {
        ON,
        QUIET,
        OFF
    }

    public enum Music
    {
        ON,
        QUIET,
        OFF
    }

    public enum ResolutionWidth
    {
        SMALL = 1280,
        MEDIUM = 1366,
        LARGE = 1920,
        WIDESCREEN = 2560
    }

    public enum ResolutionHeight
    {
        SMALL = 800,
        MEDIUM = 768,
        LARGE = 1080,
        WIDESCREEN = 1080
    }

}

现在您可以在GameOptions类的构造函数中设置所有默认值,然后只需将变量的副本传递给需要读取选项的类,它将仅读取所需的设置。

public class GameEngine
{
    private readonly GameOptions _options;
    public GameEngine()
    {
        _options = new GameOptions();    
    }

    public void ShowSetupScreen()
    {
        //If the setup screen modifies the values inside the _gameOptions variable 
        // by passing the variable in it removes the need for "Global variables"
        using(var setupScreen = new SetupScreen(_gameOptions);
        {
            setupScreen.Show();
        }
    }

    public void Enemy CreateEnemy()
    {
        //Creates a new enemy and passes the options in so it can read the settings
        // like the difficulty level.
        return new Enemy(_gameOptions);
    }

    //And so on.

通过使用实例变量而不是静态全局变量,可以更轻松地使用像XmlSerializer这样的工具保存和加载设置,从而使用户在关闭游戏后仍能记住其设置。


谢谢您!
那么我应该将resolutionWidth和Height存储为int吗? public int resolutionWidth { get; set; }
public int resolutionHeight { get; set; }然后像这样从枚举中获取值吗? resolutionWidth = (int)ResolutionWidth.WIDESCREEN;
resolutionHeight = (int) ResolutionHeight.WIDESCREEN;
- R-nold
抱歉,这个格式太糟糕了。我尝试过改进,但没有成功 :/ - R-nold
实际上我会将分辨率存储为自己的类,而不是作为枚举。public class Resolution { public int Width {get; set;} public int Height {get; set; } - Scott Chamberlain

1
我正在使用IsolatedStorageSettings来保存应用程序设置:
IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;

//set value
settings.Add("Difficulty", "EASY");

//get value
object difficulty = settings["Difficulty"];

你可以使用枚举来获取键名:Difficulty.EASY.ToString()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接