2017-02-21 13 views
1

私はゲームで作業しており、メインメニューを開発中です。そこには設定シーンがあります。このシーンにはいくつかのタブがあり、ビデオタブでは解像度の切り替えが可能なドロップダウンメニューが必要です。今、後半の部分で私はロジックを理解していますが、XNAフレームワークを使用すると、ドロップダウンメニューのロジックを理解できません。助けをありがとう:)Monogame/XNAのドロップダウンメニュー

答えて

2

私は実際に私のゲームのドロップダウンをしたあなたはそれについて考えるとき、それは本当に難しいことではありません。まず、DropDownContainerクラスとDropDownElementクラスが必要です。 DropDownContainerは、現在選択されているオプションが表示されるドロップダウンの上部です。 DropDownElementは、ユーザーがDropDownContainerをクリックしたときに表示される選択可能なオプションです。

  1. があなたのDropDownContainerクラスでDropDownElementの配列を作成します。ここでは

    は、コードがどのように動作するかです。

  2. DropDownContainerのコンストラクタでは、DropDownElementの数と各文字列が特定のDropDownElementのテキストである文字列の配列を渡します。
  3. DropDownElementのコンストラクタを文字列にし、Draw(spriteBatch)メソッドで、その文字列をDropDownElementのテクスチャに描画します。
  4. コンテナの位置としてVector2を渡すと、要素を配置するためのベースとしても使用されます。 DropDownContainerのコンストラクタでの例のループ:

    for (int i = 0; i < elements.Count; i++) 
    { 
        elements[i] = new DropDownElement(spriteFont, textArray[i], new Vector2(containerPosition.X, (containerPosition.Y + (34 * (i + 1))) + 2), this.textColor, content); // 34 = DropDownElement's Texture height 
    } 
    
  5. はあなたの資産をロードできるように、両方のクラスのコンストラクタでContentManager contentに渡していることを確認します。
  6. それはXYだこれらのクラスの両方のためのバウンディングRectangleを持って(int)containerPosition.X, (int)containerPosition.YWidthHeightTexture2Dの寸法されています。 DropDownContainer
  7. Update(gameTime)方法は、カーソルがbounds内であれば、チェックを持ち、ユーザーがクリックこのようなフラグを変更する場合:DropDownContainerclicked = !clicked;
  8. Draw(spriteBatch)方法、if (clicked)をチェックによってelements配列を描きますそれをループします。
  9. DropDownをprivate DropDownContainer dropDown = new DropDownContainer(...);のようにインスタンス化し、対応するメソッドを呼び出します。
  10. どのオプションが選択されているかを確認するには、DropDownElementTextプロパティを公開してください。
  11. 完了したら、線形補間を使用してマウスのホバー効果やテキストの色のフェードイン/アウトを追加できます。

私はXNAゲーム用のTextBoxを作成しましたが、重いP/Invokeを扱っています。基本的なドロップダウンの仕方がわからないので説明が複雑すぎます。あなたのロジックを持ついくつかの問題があります

が、私はそれらをハイライトします:

編集は以下のコメントに対処するために取得しますstringプロパティなし

  1. を/のテキストを設定しますどの要素が選択されたかをチェックするには?例えば。 if (container.Text == "text of first element") { /* user chose the lowest resolution */ }
  2. Textプロパティがない場合、テキストをコンストラクタに渡さない限り、のテキストを設定する方法はありません。
  3. enumにどのように値1600x900を直接追加しますか?

    enum resOptions 
    { 
        _800x600 = 0, 
        _1280x1024 = 1, 
        _1920x1080 = 2, 
        // etc. 
    } 
    

    そして多分:私はあなたを誤解していない限り、あなたはこのような何かをしたとしてもenum ...

で(1600x900が文字列である)stringを置くことができる方法はありません彼らはDropDownElement配列で同じ方法で注文してもらえますが、ユーザーがクリックしたオプションを確認するために独自の方法を実装する必要があります... DropDownContainerTextプロパティの確認につながります。

enumを使用することに対する強硬なアドバイスは、すでに複雑なDropDownアルゴリズムを複雑にしすぎているためです。どのオプションが選択されたかを確認する方法を書くのに、はるかに時間がかかります。

私は、ユーザーのクリックにContainer秒のクリックElementText 'がTextを設定しますし、それは私が選択したオプションをチェックします方法です。 enumでこれをやってもよければ、簡単なやり方についてのヒントを教えてくれたので、あまり助けになることはないでしょう。別の方法でやりたければ、コードを自分で書く必要があります。このサイトのアイデアはすべて「自分のコードを書いてください」ではなく「適切に書き込む方法を教えてください」自分自身 "です。

少ない労力と少ないコードでそれをやり遂げることができれば、複雑なことはプログラミングの面で悪いことです。 DropDownの機能を拡張する予定がある場合にのみ、それを複雑にするのは良いことです。しかし、あなたの場合、私は正直なところ、Textをこのように設定する点はありません。シンプルで効果的なソリューションを破棄し、あなたが確信していないものを追求するのはなぜですか?

ご不明な点がございましたら、お気軽にコメントしてください。

+0

私はここで少し考えています。ドロップダウン要素のTextプロパティを使用する代わりに、デフォルトの解像度スケール(たとえば1600x900)の列​​挙子を作成し、その値に設定できますか?もちろん、必要に応じてユーザーが独自のカスタム解像度を入力できるようにします。 – Matttheawesome1

+0

@ Matttheawesome1、私はあなたの質問に答えるための答えを編集しました。さらなるご質問がある場合は、お気軽にコメントしてください。 – PowerUser

+0

ああ、私は今、愚かな気がします。列挙型は文字列を使用できないことを忘れてしまいました。それは誰でも知っていればなぜですか?他の質問にリンクすることもできます。 – Matttheawesome1

1

私は既存のUIライブラリを使用することをお勧めします。高度なUIシステムをゼロから実装しようとするのではなく、

ニースのUIライブラリー:Empty Keys

+0

私は教室環境にいるため、このことを教えていただきありがとうございます。残念ながら、管理者なしでこのマシンにサードパーティライブラリをダウンロードすることはできません。 – Matttheawesome1

0

私はこれをドロップダウンメニューとしてはしません。

これはマウス/キーボード中心のUI要素です。コントローラを操作している場合、ユーザーがこれとやりとりする方法を検討してください。

このゲームをコントローラでプレイする予定がない場合でも、ドロップダウンメニューのような複雑なUI要素を避けると、UIに気を散らすのではなく、プロトタイピングを簡単に続けることができます。

提案されたソリューション: 「NxMから解像度を変更する」を表すメニュー項目を選択すると、垂直リストから特定の解像度を選択するための新しいサブメニューで現在のメニューを置換またはオーバーレイします。終了すると、前のメニューに戻ります。

関連する問題