3

嘿,

我目前正在为 Windows 8/Metro 开发我的第二款 XNA/Monogame 游戏,但遇到了问题。我们现在需要存储一个附有名称的高分,所以我需要处理屏幕键盘来获取信息。

我搜索了论坛,发现了一些与此相关的主题,但没有包含一些示例代码或描述的帖子可以帮助我完全解决我的问题。我将我的项目更改为 XAML 模板,并且在我的 GamePage 中有一个 TextBox,但现在我需要在我的游戏循环中获取 TextBox 以将其读出,以便我可以将名称保存在我的分数之外,我目前不知道如何做这个。

我当前的 GamePage.cs 代码

    public GamePage(string launchArguments)
    {
        this.InitializeComponent();

        // Create the game.
        _game = XamlGame<Main>.Create(launchArguments, Window.Current.CoreWindow, this);

        txtTest.TextChanged += txtTest_TextChanged;
    }

    void txtTest_TextChanged(object sender, TextChangedEventArgs e)
    {
        Debug.WriteLine(txtTest.Text); //Write content to public string in Main.cs
    }

我发现了如何将 TextBox 的内容写入我的游戏循环中的字符串,但现在我被困在如何从我的游戏循环中控制 TextBox 他的属性,以便我可以设置可见性和焦点。我是否需要创建自己的 EventHandler 来观察我是否设置了布尔值或其他东西?

提前致谢。

问候,

ForT3X

4

3 回答 3

4

免责声明:我只想说,我以前从未使用过 Windows 8 XAML 项目或 GamePage 类,但在做了一点谷歌搜索之后,我认为我理解的足够多,可以提供帮助。

看来您的问题归结为循环依赖。您希望在 GamePage 和 Game 类之间进行双向通信。

从 GamePage 到 Game 类的通信很容易,因为 GamePage 已经负责创建 Game 类并将其存储在 _game 成员变量中。因此,要从 GamePage 向 Game 发送消息,您只需向 Game 类添加一个方法,例如:

void txtTest_TextChanged(object sender, TextChangedEventArgs e)
{
    _game.SetHighscoreName(txtTest.Text);

    Debug.WriteLine(txtTest.Text); //Write content to public string in Main.cs
}

以另一种方式返回通信(从 Game 到 GamePage)有点棘手,但可以使用接口和属性注入来解决。

首先,创建一个属于您的 Game 类的接口。我的意思是;它与 Game 类位于同一个项目和/或命名空间中。它可能看起来像这样:

public interface IGamePageController
{
   void ShowHighscoreTextBox();
}

然后,像这样向您的 Game 类添加一个属性:

public IGamePageController GamePageController { get; set; }

接下来,让 GamePage 类实现接口,如下所示:

public partial class GamePage : PhoneApplicationPage, IGamePageController
{
    //...

    public void ShowHighscoreTextBox()
    {
        txtTest.Visibility = Visibility.Visible;
    }
}

最后,在 GamePage 构造函数中,您需要设置 GamePageController 属性。

// Create the game.
_game = XamlGame<Main>.Create(launchArguments, Window.Current.CoreWindow, this);
_game.GamePageController = this;

一旦你有了这个模式,就很容易通过向接口或 Game 类添加更多方法来为 Game 和 GamePage 类添加新的通信方式。

于 2013-09-02T23:57:55.430 回答
1

您可以在 XAML 页面和您的游戏之间共享视图模型。

XAML 页面 GamePage 创建游戏类的实例。当它发生时,您还可以让游戏类知道您的视图模型。

_game = XamlGame<Game1>.Create(launchArguments, Window.Current.CoreWindow, this);
_game.XamlGameDataViewModel = new GameDataViewModel();
DataContext = _game.XamlGameDataViewModel;

我的帖子在 Monogame 和 Xaml 之间共享您的视图模型中有更多详细信息

于 2013-10-11T14:02:30.823 回答
0

如果您需要存储一些值,您应该尝试使用IsolatedStorage.
正如 MSDN 所说:
“隔离存储不适用于 Windows 应用商店应用程序。相反,使用Windows.StorageWindows 运行时 API 中包含的命名空间中的应用程序数据类来存储本地数据和文件。”

您可以在此处找到更多信息。

使用Windows.Storage你应该做这样的事情:

Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
if (string.IsNullOrEmpty((string)Windows.Storage.ApplicationData.Current.LocalSettings.Values["highscore"]))
{  
    localSettings.Values["highscore"] = highscore;
}
于 2013-09-01T19:41:47.590 回答