10

画面のイメージと画面上にある一連のボタンで構成されるゲームのオーバーレイがあります。

スクリーンショット:

UI コンポーネントを示すスクリーンショット

Screenは 1 つ持っていStageます。にはStage一連のGroupオブジェクトがあり、私はこれをレイヤーと考えています。最初のグループには背景があり、中央のグループにはゲーム要素があり、最前部のグループにはスクリーン オーバーレイがあります。

オーバーレイ レイヤーは、1 つImageの 、画面自体、および 4 つTextButton(各コーナーに 1 つ) で構成されます。

オーバーレイレイヤーの画像がその前にある限り、ゲームレイヤーの何もクリックできないという事実がなければ、これはうまく機能します。画像が透明であっても、ゲーム レイヤーに到達する前にすべてのタッチ イベントを傍受します。

だから私の質問は次のとおりです:ゲームレイヤーがそれらを取得し、実際にゲームをプレイできるように、オーバーレイレイヤーの画像にすべてのタッチイベントを無視させるにはどうすればよいですか?

私は自分で1つのアイデアを試しましたが、これが正しい方法であるかどうかはわかりません.高さ/幅を常に0に設定 するカスタムとして画像を作成しようとしましたActorが、それでも( draw() メソッドをオーバーロードすることにより)画面全体に絵を描きました。これは非常にうまく機能しますが、何らかの理由で画像が下位レイヤーの要素の背後に描画されるという事実を除きます。

スクリーンショット: https://dl.dropboxusercontent.com/u/1545094/Screen2.png

このスクリーンショットでは、ゲーム レイヤーの 1 つ (グループ 6) に追加される指示メッセージ ボックスを開きました。オーバーレイ レイヤー (グループ 7) のすべてのボタンはメッセージ ボックスの前にありますが、スクリーン フレーム (カスタム アクター) は何らかの方法でメッセージ ボックスの後ろに描画されることに注意してください。何故ですか?注: これとまったく同じケースを取り上げて、カスタム アクターを通常の画像に変更すると、すべてが正しく描画されますが、上記のように、下のレイヤーでは何もクリックできなくなります。

誰かがそれを理解できるなら、これは私のカスタム アクターです。

public class ClickThroughImage extends Actor {

    BaseDrawable d;

    public NonexistingImage(BaseDrawable d){
        this.d = d;
        setSize(0, 0);
    }

    @Override
    public void draw(SpriteBatch batch, float parentAlpha) {
        d.draw(batch, 0, 0, 1024, 768); //Yes, I tried swapping these two lines. 
        super.draw(batch, parentAlpha); //It had no effect.
    }
}
4

3 に答える 3

24

他のメソッドに加えて、以下を呼び出すこともできます:

setTouchable(Touchable.disabled);

次のように文書化されています。

アクターまたは子はタッチ入力イベントを受け取りません。

メソッドはActorクラスです。

于 2013-08-31T17:05:01.067 に答える
5

InputMultiplexerを使用します。InputMultiplexer クラスを使用すると、複数の入力プロセッサ間でユーザー入力を共有できます。InputProcessorを拡張する独自のクラスを作成し、それをStageとともに InputMultiplexer に配置します。こうすることで、カスタムの方法でユーザー入力に応答し、ステージを使用することができます。

    InputMultiplexer multiplexer = new InputMultiplexer();
    Array<InputProcessor> processors = new Array<InputProcessor>();
    MyInputProcessor myInputProcessor = new MyInputProcessor(); 
    processors.add(myInputProcessor);
    processors.add(stage);
    this.multiplex.setProcessors(processors);

    //...
    //and in your show method in your Screen class
    Gdx.input.setInputProcessor(this.multiplex);

また、必ずActor.hitから null を返すようにしてください。これにより、アクターはユーザー インタラクションに応答しなくなります。

これが私のゲームでこの問題を解決した方法です。

于 2013-07-05T14:55:12.330 に答える
1

はい、プールは正しいです。

タッチ可能を無効に設定するだけです。

ステージですべてのアクターをタッチ可能にすることがエンジンの「良い」デフォルトであるかどうかは疑問です。なぜなら、私のゲームのほとんどでは、大部分のアクターis _not_ touchableであり、ユーザーが操作できる/操作する要素がほとんどないためです。したがって、私は常に " nonTouchableActor" の基本クラスを作成します。ここからすべてのアクタを派生させ、クリック/タップに反応せず、この基本クラスtouchable(disabled)がコンストラクターに設定されます。そうすれば、もう考える必要はありません。

于 2016-03-12T07:37:14.233 に答える