嘿,
我目前正在为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类添加新的通信方式。