游戏循环中的单游戏XAML读出文本框

本文关键字:游戏 XAML 文本 循环 单游戏 | 更新日期: 2023-09-27 18:29:53

Heey,

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

我在论坛上搜索了一下,发现了一些与此相关的主题,但没有一篇文章包含一些示例代码或描述,可以帮助我彻底解决问题。我把我的项目改成了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

游戏循环中的单游戏XAML读出文本框

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

你的问题似乎可以归结为循环依赖。您希望在您的GamePage和您的游戏类之间进行双向通信。

从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();
}

然后,在你的游戏类中添加一个属性,如下所示:

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类添加新的通信方式。

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

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

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

在我的文章中有更多的细节在Monogame和Xaml 之间共享您的视图模型

如果需要存储一些值,应该尝试使用IsolatedStorage
正如MSDN所说:
独立存储不可用于Windows应用商店应用。请使用Windows运行时API中包含的Windows.Storage命名空间中的应用程序数据类来存储本地数据和文件

你可以在这里找到更多信息。

使用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;
}