ピクチャを追従させる手段と、指定座標範囲のイベント起動方法について

なかと
記事: 7
登録日時: 2021年5月07日(金) 14:53

ピクチャを追従させる手段と、指定座標範囲のイベント起動方法について

投稿記事by なかと » 2021年5月12日(水) 10:41

トリアコンタン様のピクチャのボタン化プラグインを利用しています。

ピクチャ3に画像を表示し、
ピクチャはマウスカーソルまたはタッチのドラッグ操作に追従し
ドラッグしている間のみ、ピクチャの左下96px×96pxの範囲にあるものの
イベントを起動させたいと思っています。
できたら、左上右上左下右下など、48pxごと場所によってイベント内容を変えたいと思っています。

ピクチャの座標

コード: 全て選択

$gameScreen.picture(3).x()
$gameScreen.picture(3).y()


ピクチャのサイズ

コード: 全て選択

SceneManager._scene._spriteset._pictureContainer.children[2].width
SceneManager._scene._spriteset._pictureContainer.children[2].height


ピクチャの座標が10,10だったとして、
ピクチャのサイズ240,240から、
xs=座標+ピクチャサイズ-96
xe=座標+ピクチャサイズ
ys=座標+ピクチャサイズ-96
ye=座標+ピクチャサイズ
これが起動したいイベントの範囲。

左上は
xs=座標+ピクチャサイズ-96
xe=座標+ピクチャサイズ-48
ys=座標+ピクチャサイズ-96
ye=座標+ピクチャサイズ-48
のようになると思います。


ただ、以下の内容が分かりません。
・ピクチャをマウスまたはドラッグに追従させる方法
・ピクチャドラッグ時に、指定位置座標範囲にあるイベントを起動させる方法

マウスカーソルにピクチャを指定する方法も考えたのですが、
クリックまたはタッチしている間でないとピクチャは表示されないですし
求めている物とは少々違います。

いい方法は無いでしょうか。
回答よろしくお願いいたします。

論理イヌ
記事: 186
登録日時: 2020年3月13日(金) 13:05

Re: ピクチャを追従させる手段と、指定座標範囲のイベント起動方法について

投稿記事by 論理イヌ » 2021年5月12日(水) 22:27

いまいち何を質問されているのか掴めず、とんちんかんな回答かもしれませんがご容赦ください。

・ピクチャをマウスまたはドラッグに追従させる方法

ツクール ピクチャ カーソル」で検索上位にでてきたやつ。

MousePointerExtend.js
viewtopic.php?t=1640

こちらは使ったことがないので操作感はわかりません。

・ピクチャドラッグ時に、指定位置座標範囲にあるイベントを起動させる方法

ツクール ピクチャ ドラッグ」で一番上に出てきたやつ。

ピクチャのドラッグ移動(PictureDrag.js)
https://forum.tkool.jp/index.php?thread ... 8B%95.579/
↓ダウンロード先
https://plugin.fungamemake.com/archives/13557

こちらは使ったことありますが、かなり自由度の高いプラグインですので、やりたいことは実現できると思います。
なかと
記事: 7
登録日時: 2021年5月07日(金) 14:53

Re: ピクチャを追従させる手段と、指定座標範囲のイベント起動方法について

投稿記事by なかと » 2021年5月19日(水) 08:50

論理イヌさん、回答ありがとうございます。

ピクチャーカーソルは32pxで作成する必要があり
利用は出来ませんでした。

ピクチャドラッグのプラグインを使おうかと思いましたが
少々組み方が複雑のため、断念しました。
ありがとうございます。
ecf5DTTzl6h6lJj02
記事: 455
登録日時: 2018年12月23日(日) 13:55

Re: ピクチャを追従させる手段と、指定座標範囲のイベント起動方法について

投稿記事by ecf5DTTzl6h6lJj02 » 2021年5月19日(水) 14:06

こんにちは。
ピクチャをマウスカーソルに追従させる方法について、

まず、下記プラグインをダウンロードし、導入してください。

神無月サスケ様 作 TouchInputDispatcher.js
https://plugin.fungamemake.com/archives/2614
(ツクマテの紹介ページに飛びます)

次に、マップイベントとして以下のようなイベントを作成してください。

1ページ目 トリガ: 自動実行

コード: 全て選択

◆ピクチャの表示:#1, FollowTheCursor, 中央 (0,0), (100%,100%), 0, 通常
◆プラグインコマンド:SetCoordOnHover sp 51 52
◆セルフスイッチの操作:A = ON

2ページ目: 出現条件: セルフスイッチA, トリガ: 並列処理

コード: 全て選択

◆ピクチャの移動:#1, 中央 ({マウス スクリーンX},{マウス スクリーンY}), (100%,100%), 255, 通常, 1フレーム

この例では、変数ID:0051 マウス スクリーンX と 変数ID:0052 マウス スクリーンY に、
マウスのスクリーン座標を代入するよう設定し、ピクチャの中央がこの位置に来るようにしています。
プラグインコマンドの細かい内容等は、 TouchInputDispatcher の ヘルプをご確認ください。
なかと
記事: 7
登録日時: 2021年5月07日(金) 14:53

Re: ピクチャを追従させる手段と、指定座標範囲のイベント起動方法について

投稿記事by なかと » 2021年5月19日(水) 16:51

ecf5DTTzl6h6lJj02様

こんにちは、回答ありがとうございます。
コードまでありがとうございます。今週実施してみます。

ecf5DTTzl6h6lJj02様がご存じでしたら教えてほしいのですが
指定座標範囲にあるイベントを動作させるようなコマンド(スクリプト)みたいなものは
あるのでしょうか。

コード: 全て選択

//イベントIDの取得
$gameMap.eventIdXy(x座標, y座標)
[/code
[code]
   $dataMap.events[イベントID].pages[ページ数-1].trigger

もう少し調べてみます。
ecf5DTTzl6h6lJj02
記事: 455
登録日時: 2018年12月23日(日) 13:55

Re: ピクチャを追従させる手段と、指定座標範囲のイベント起動方法について

投稿記事by ecf5DTTzl6h6lJj02 » 2021年5月20日(木) 00:27

こんばんは。
なかと さんが書きました:指定座標範囲にあるイベントを動作させるようなコマンド(スクリプト)みたいなものは
あるのでしょうか。

指定座標範囲にイベントが存在するかをチェックして、範囲内のイベントを起動させることは可能ですが、
判定がかなり複雑になります。
サンプルを出しますが、適当に作っているので、出来がよくないです。(変な動きをする可能性もあります)
また、スクリプトを多用するので、なにをやっているのか理解できない可能性が高いです。
ご了承ください。

以下は 144×144 のピクチャにマウスカーソルを追従させ、
9分割した左下の(48×48の)矩形部分にイベントの矩形が存在した場合、そのイベントを起動するものです。
※イベントのサイズが 48×48 であること($で始まる画像ファイル名を使用しているイベントがいないこと)を
想定して作成しています。


  1. 前回の1ページ目の内容を以下に変更する。

    コード: 全て選択

    ◆ピクチャの表示:#1, FollowTheCursor, 中央 (0,0), (100%,100%), 0, 通常
    ◆プラグインコマンド:SetCoordOnHover sp 51 52
    ◆プラグインコマンド:SetCommonOnHover 12
    ◆セルフスイッチの操作:A = ON

    ※SetCommonOnHover は マウスカーソルが画面内にある時に、 指定した番号のコモンイベントを呼び出します。
    この例では 12 番のコモンイベントを呼び出しています。

  2. 前回のものに3ページ目をついかし以下に設定する。
    出現条件: セルフスイッチB, トリガ: 並列処理

    コード: 全て選択

    ◆条件分岐:スクリプト:!$gameMap._interpreter.isRunning() && !$gameMessage.isBusy();
      ◆セルフスイッチの操作:B = OFF
      ◆
    :分岐終了

    ※イベント実行時に隠したピクチャを再表示するためのものです。

  3. SetCommonOnHover が呼び出すコモンイベントとして以下のイベントを作成する。

    コード: 全て選択

    ◆注釈:衝突判定。
    :  :指定した範囲内に存在するイベントを取得して、
    :  :変数ID:0053 今回のイベント に代入する。
    :  :複数存在する場合、最初にヒットしたイベントを代入。
    :  :存在しない時は undefined が入るが気にしない。
    ◆スクリプト:$gameVariables.setValue(53, $gameMap.events().find(event =>
    :     :(event.screenX() - 24 <= $gameVariables.value(51) - 72 && $gameVariables.value(51) - 72 <= event.screenX() + 24 &&
    :     : event.screenY() - 48 <= $gameVariables.value(52) + 72 && $gameVariables.value(52) + 72 <= event.screenY()) ||
    :     :(event.screenX() - 24 <= $gameVariables.value(51) - 24 && $gameVariables.value(51) - 72 <= event.screenX() + 24 &&
    :     : event.screenY() - 48 <= $gameVariables.value(52) + 72 && $gameVariables.value(52) + 72 <= event.screenY()) ||
    :     :(event.screenX() - 24 <= $gameVariables.value(51) - 24 && $gameVariables.value(51) - 24 <= event.screenX() + 24 &&
    :     : event.screenY() - 48 <= $gameVariables.value(52) + 24 && $gameVariables.value(52) + 24 <= event.screenY()) ||
    :     :(event.screenX() - 24 <= $gameVariables.value(51) - 72 && $gameVariables.value(51) - 72 <= event.screenX() + 24 &&
    :     : event.screenY() - 48 <= $gameVariables.value(52) + 24 && $gameVariables.value(52) + 24 <= event.screenY())));
    ◆注釈:変数ID:0053 今回の範囲内のイベント に
    :  :イベント(Game_Event オブジェクト)が
    :  :代入されているかチェックし、
    :  :代入されていれば中の処理を実行する。
    ◆条件分岐:スクリプト:$gameVariables.value(53).constructor === Game_Event
      ◆注釈:前回の衝突判定の結果と今回の衝突判定の結果が違う場合は、
      :  :中の処理を実行。
      ◆条件分岐:今回の範囲内のイベント ≠ 前回の範囲内のイベント
        ◆注釈:メッセージウィンドウが表示されていなければ、
        :  :中の処理を実行する。
        ◆条件分岐:スクリプト:!$gameMessage.isBusy()
          ◆注釈:イベント実行時にピクチャが邪魔にならないように、
          :  :一時的に、ピクチャを透明にしておく。
          ◆ピクチャの移動:#1, 左上 ({マウス スクリーンX},{マウス スクリーンY}), (100%,100%), 0, 通常, 1フレーム
          ◆注釈:ピクチャの再描画をストップさせるために、
          :  :ピクチャの再描画を行なっているイベントのセルフスイッチBを
          :  :オンにしてからイベントを起動させる。
          ◆スクリプト:let mapId = $gameMap.mapId();
          :     :let stopEventId = $gameMap.event(10).eventId();
          :     :$gameSelfSwitches.setValue(`${mapId},${stopEventId},B`, true);
          :     :let event = $gameVariables.value(53);
          :     :event.start();
          ◆
        :分岐終了
        ◆
      :分岐終了
      ◆
    :分岐終了
    ◆注釈:今回の衝突判定の結果を 変数ID: 0054 前回の範囲内のイベント
    :  :に代入しておく。
    :  :(イベントの連続起動防止用)
    ◆変数の操作:#0054 前回の範囲内のイベント = 今回の範囲内のイベント
以上、ご参考まで。

“MV:質問” へ戻る