Heey,
我目前正在为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
答案 0 :(得分:4)
免责声明:我只想说我之前从未使用过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和GamePage类添加新的方式来进行交流。
答案 1 :(得分:1)
您可以在XAML页面和游戏之间共享视图模型。
XAML页面GamePage创建游戏类的实例。当它发生时,您也可以让游戏类了解您的视图模型。
_game = XamlGame<Game1>.Create(launchArguments, Window.Current.CoreWindow, this);
_game.XamlGameDataViewModel = new GameDataViewModel();
DataContext = _game.XamlGameDataViewModel;
中有更详细的内容
答案 2 :(得分:0)
如果您需要存储一些值,请尝试使用IsolatedStorage
正如MSDN所说:
“隔离存储不适用于Windows应用商店应用。而是使用Windows运行时API中包含的Windows.Storage
命名空间中的应用程序数据类来存储本地数据和文件。”
您可以找到更多信息here。
使用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;
}