3

ねえ、

現在、Windows 8/Metro 用の 2 番目の XNA/Monogame ゲームに取り組んでいますが、問題が発生しました。ここで、ハイスコアを名前付きで保存する必要があるので、スクリーン キーボードを操作して情報を取得する必要があります。

フォーラムを検索したところ、これに関連するトピックがいくつか見つかりましたが、問題を完全に解決するのに役立つコード例や説明を含む投稿はありませんでした。プロジェクトを XAML テンプレートに変更し、TextBox を GamePage で動作させましたが、ゲーム ループ内で 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 のプロパティを制御して、Visibility と Focus を設定する方法に行き詰まっています。ブール値などを設定した場合に監視する独自の EventHandler を作成する必要がありますか?

前もって感謝します。

ご挨拶、

T3X用

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 に答える
0

いくつかの値を保存する必要がある場合は、 を試してくださいIsolatedStorage
MSDN が言うよう
に、「Windows ストア アプリでは分離ストレージを使用できません。代わりにWindows.Storage、Windows ランタイム API に含まれる名前空間のアプリケーション データ クラスを使用して、ローカル データとファイルを保存してください。」

詳細については、こちらをご覧ください。

you を使用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 に答える