【解決済み】テキストウインドウの強制終了について

返信する
Lucy
記事: 2
登録日時: 2024年5月28日(火) 23:27

【解決済み】テキストウインドウの強制終了について

投稿記事 by Lucy »

①現在、テキストウインドウをスイッチ(ここではスイッチAとします)のONを感知させて表示させています。
②スイッチは「1つがONになっているときはOFFになる」という仕様にしており、例えば「スイッチAがONの状態」から「スイッチBをON」の状態にすると、スイッチAは自動的にOFFになります。

さて、この時に①に書いたようにスイッチのONを感知させてウインドウを表示させているため、理論上は②のように動作させた場合、「スイッチAのテキスト」が表示された後に「スイッチBのテキスト」が表示されると思いますが、「テキストウインドウを表示中でも強制終了させる」などといった仕様を挟んでいないのが原因なのか、思うとおりに表示してくれません。具体的には「森に行く」を選択したときに表示されるテキストが、閉じずに残っている状態です(決定キーで閉じないように設定したため)。

どなたか、よい方法、スクリプトなどご存じの方いましたら、ご教授いただければと思います。

以下に、現在記述しているイベントを2つ記述しておきます。
※一部スクリプトに関しては、いろいろ試行錯誤していたため、不必要なものが残っている場合があります、ご了承ください。
※補足 ちなみに、MessageSkip.jsというのを見つけたため、あらたに生成したスイッチで制御をおこなおうとしましたが、スクリプトが正しくなかったのか、思ったように動作しませんでした。以下詳細のURL
https://plugin.fungamemake.com/archives/1201

コード: 全て選択

メッセージ表示イベント(1例)
出現条件:スイッチ「#0002 森へ行く選択」がONの時
トリガー:自動実行
◆プラグインコマンド:MessageRows 4
◆プラグインコマンド:MessageWidth 400
◆スクリプト:Window_Message.prototype.updatePlacement = function() {
:     :    this._positionType = 0;
:     :    this.y = 50;
:     :    this.x = 50;
:     :};
◆スクリプト:Window_Message.prototype.processNormalCharacter = function(textState) {
:     :    var c = textState.text[textState.index++];
:     :    var w = this.textWidth(c);
:     :    if (this.contents.width - textState.x >= w) {
:     :        this.contents.drawText(c, textState.x, textState.y, w * 2, textState.height);
:     :        textState.x += w;
:     :    } else {
:     :        this.processNewLine(textState);
:     :        textState.index--;
:     :    }
:     :};
◆スクリプト:Window_Message.prototype.isTriggered = function() {
:     :    return false;
:     :};
◆スクリプト:Window_Message.prototype._updatePauseSign = function() {
:     :    this._windowPauseSignSprite.visible = false; // カーソルのスプライトを非表示に設定
:     :};
◆文章:なし, ウィンドウ, 上
:  :テスト用メッセージ

コード: 全て選択

マップチップで生成したボタンを選択(1例)
出現条件:スイッチ「#0002 森へ行く選択」がONの時
トリガー:並列処理
◆ループ
  ◆条件分岐:ボタン[決定]が押されている
    ◆コモンイベント:森へ行く
    ◆ループの中断
    ◆
  :分岐終了
  ◆条件分岐:右ボタン押下がON
    ◆スイッチの操作:#0002 森へ行く選択 = OFF
    ◆スイッチの操作:#0003 装備選択 = ON
    ◆SEの演奏:Cursor1 (90, 100, 0)
    ◆スイッチの操作:#0005 右ボタン押下 = OFF
    ◆スイッチの操作:#0007 待機中 = ON
    ◆変数の操作:#0001 ウェイト = 20
    ◆ループ
      ◆ウェイト:1フレーム
      ◆変数の操作:#0001 ウェイト -= 1
      ◆条件分岐:ボタン[右]が押されている
        ◆
      :それ以外のとき
        ◆条件分岐:ボタン[左]が押されている
          ◆
        :それ以外のとき
          ◆変数の操作:#0001 ウェイト = 0
          ◆
        :分岐終了
        ◆
      :分岐終了
      ◆条件分岐:ウェイト ≤ 0
        ◆ループの中断
        ◆
      :分岐終了
      ◆
    :以上繰り返し
    ◆スイッチの操作:#0007 待機中 = OFF
    ◆ループの中断
    ◆
  :分岐終了
  ◆条件分岐:左ボタン押下がON
    ◆スイッチの操作:#0002 森へ行く選択 = OFF
    ◆スイッチの操作:#0004 買い物選択 = ON
    ◆SEの演奏:Cursor1 (90, 100, 0)
    ◆スイッチの操作:#0006 左ボタン押下 = OFF
    ◆スイッチの操作:#0007 待機中 = ON
    ◆変数の操作:#0001 ウェイト = 20
    ◆ループ
      ◆ウェイト:1フレーム
      ◆変数の操作:#0001 ウェイト -= 1
      ◆条件分岐:ボタン[左]が押されている
        ◆
      :それ以外のとき
        ◆条件分岐:ボタン[右]が押されている
          ◆
        :それ以外のとき
          ◆変数の操作:#0001 ウェイト = 0
          ◆
        :分岐終了
        ◆
      :分岐終了
      ◆条件分岐:ウェイト ≤ 0
        ◆ループの中断
        ◆
      :分岐終了
      ◆
    :以上繰り返し
    ◆スイッチの操作:#0007 待機中 = OFF
    ◆ループの中断
    ◆
  :分岐終了
  ◆条件分岐:上ボタン押下がON
    ◆スイッチの操作:#0002 森へ行く選択 = OFF
    ◆スイッチの操作:#0010 会話選択 = ON
    ◆SEの演奏:Cursor1 (90, 100, 0)
    ◆スイッチの操作:#0011 上ボタン押下 = OFF
    ◆スイッチの操作:#0007 待機中 = ON
    ◆変数の操作:#0001 ウェイト = 20
    ◆ループ
      ◆ウェイト:1フレーム
      ◆変数の操作:#0001 ウェイト -= 1
      ◆条件分岐:ボタン[上]が押されている
        ◆
      :それ以外のとき
        ◆条件分岐:ボタン[下]が押されている
          ◆
        :それ以外のとき
          ◆変数の操作:#0001 ウェイト = 0
          ◆
        :分岐終了
        ◆
      :分岐終了
      ◆条件分岐:ウェイト ≤ 0
        ◆ループの中断
        ◆
      :分岐終了
      ◆
    :以上繰り返し
    ◆スイッチの操作:#0007 待機中 = OFF
    ◆ループの中断
    ◆
  :分岐終了
  ◆ウェイト:1フレーム
  ◆
:以上繰り返し
最後に編集したユーザー Lucy [ 2024年5月29日(水) 18:24 ], 累計 1 回
アバター
Plasma Dark
記事: 736
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: テキストウインドウの強制終了について

投稿記事 by Plasma Dark »

何がしたいかよりも、したいことのために何をしようとしているか、という説明になっているので、前提が読み取りにくくなっています。
はじめに、どういうシステムを実現したいのかを説明して、それからそのために採ろうとしている方法の説明をしていただくほうが伝わりやすそうです。
画面上に複数の行き先を表すボタン画像を表示して、ボタン画像をクリック(あるいは、タップ)した際にそれぞれの行き先に対応したメッセージを表示したい
ボタン画像をクリックした際に、別のボタンをクリックして表示していたメッセージは消去して、新しいメッセージを表示したい
ということでしょうか。

メッセージ(文章の表示)で実現しなければならないのかどうかから検討しても良い気はします。
例えば、アイテムシーンでアイテムにカーソルを合わせると説明文がヘルプウィンドウに表示されますが、それと同じ仕組みを作ってしまうのも手であるように思います。

メッセージとその中断で対応したい場合は、中断したいタイミングでterminateMessageメソッドを呼び出してあげるとなんとかなるかもしれません。

前者の場合はシーンにウィンドウを表示する方法について知る必要があり、
後者の場合はWindow_Messageの更新の仕組みを知る必要があります。
どちらにせよ、プラグインを書くことになるんではないかと思います。
スクリプトコマンドでも、SceneManager経由でWindow_Messageのインスタンスにアクセスする方法で強引に後者の方法を実現できるかもしれませんが、カプセル化を無視する邪悪な手法であるため、そのデメリットを理解した上でやるかどうか判断してください。
カプセル化を無視する手法は多用すると誰も理解できないプロジェクトが出来上がり、ゲームとしてリリースするところまでたどり着けずに頓挫するか、リリースできても不具合に対応できず、プレイヤーを苦しめるおそれがあります。

個人的には、本来想定されない経路でメッセージを強制中断するより、前者の方法で別のウィンドウを出してしまうほうがバグりにくくて良いのではないかと思います。
それぞれ実装例を置いておきますので、プラグインを書かれる場合は参考にしてみてください。

マップにヘルプウィンドウを表示するプラグインコマンドの例
メッセージを強制中断するプラグインコマンドの例

なお、どちらも実装サンプルであり、今後わたしはこれらをメンテナンスしませんし、これらサンプルを直接利用することについてサポートも行いません。
Lucy
記事: 2
登録日時: 2024年5月28日(火) 23:27

Re: テキストウインドウの強制終了について

投稿記事 by Lucy »

アドバイスありがとうございます。
アイテム表示は、確かにカーソルを動かすとその時点で表示が中断される仕様がありますね、盲点でした。そちらを採用できるように取り組んでみます。

また、質問の仕方についても、今後の参考にさせていただきたいと思います、有難うございました。
返信する

“MV:質問”に戻る