嘿,

我目前正在为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的内容写入游戏循环内的字符串,但是现在我陷入了如何从gameloop内控制TextBox的属性的问题,因此可以设置Visibility和Focus。我是否需要创建自己的EventHandler来监视是否设置了布尔值?

提前致谢。

问候,

ForT3X

最佳答案

免责声明:我只能说我以前从未使用过Windows 8 XAML项目或GamePage类,但在进行了一些谷歌搜索之后,我认为我已经足够帮助。

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

从GamePage到Game类的通信很容易,因为GamePage已经负责创建Game类并将其存储在_game成员变量中。因此,要将消息从GamePage发送到游戏,您只需要向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类添加新的通信方式。

10-07 13:18