マウスカーソルがある位置のマップ座標を常に取得したい

返信する
アバター
BumbleB
記事: 28
登録日時: 2017年2月27日(月) 05:28

マウスカーソルがある位置のマップ座標を常に取得したい

投稿記事 by BumbleB »

掲題の通り、マウスカーソルがある位置のマップ座標を常に取得したいと思い、プラグインを作成しました。
※下に添付したプラグイン PF_PointerLock.jsです。本来はポインターロックの機能を実装するプラグインにおまけでつけたのですが、便利なので本実装しようと考えています

プラグインの以下の箇所です
97行目~98行目

コード: 全て選択

    //マウスの移動量を取得する。トリアコンタン氏のツクマテのアドバイスを参照。
    var _TouchInput_onMouseMove = TouchInput._onMouseMove;
    TouchInput._onMouseMove = function(event) {
        _TouchInput_onMouseMove.apply(this, arguments);
        //以下でマウスの画面座標をリアルタイムに取得
        this.mouseX = Graphics.pageToCanvasX(event.pageX);
        this.mouseY = Graphics.pageToCanvasY(event.pageY);
        //以下でポインターロック時のマウス移動量を取得
        this.mouseMovementX = event.movementX;
        this.mouseMovementY = event.movementY;
        //SRD_CameraCoreでマウス移動にカメラを追従させるとき、移動しすぎないように調整
        this.cameraMoverX = Math.floor(TouchInput.mouseMovementX / 2);
        this.cameraMoverY = Math.floor(TouchInput.mouseMovementY / 2);
        //以下でマウスのカーソルがある場所のマップにおける座標を取得
        //木製ペンギン氏のMPP_TouchCommandの処理を借りました
        if(SceneManager._scene ? SceneManager._scene.constructor === Scene_Map : false){
            this.mouseMapX = $gameMap.canvasToMapX(TouchInput.x) || 0; //97行目
            this.mouseMapY = $gameMap.canvasToMapY(TouchInput.y) || 0; //98行目
        }
    };
最初にif節なしの状態で試したところタイトル画面や戦闘画面で下記画像のエラーが出たため、マップシーンのときのみ判定するようにしました。
これで概ね問題なく動作しているのですが、どうもゲームに負荷がかかっているとき(FPSが低下しているタイミング)?などにマップ移動をしたりゲームをリロードしたりすると同様のエラーがおこってしまうようでした。
SceneManager._scene ? SceneManager._scene.constructor === Scene_Map : false
という判定の仕方がそもそも間違っているのではないかというのは感じるのですが、ではどうすればいいかというのがいまいちわからず困っています。何かよい改善案があればご教示いただけると幸いです。
添付ファイル
PF_PointerLock.js
(7.15 KiB) ダウンロード数: 9 回
error.JPG
アバター
WTR
記事: 625
登録日時: 2015年12月22日(火) 19:14

Re: マウスカーソルがある位置のマップ座標を常に取得したい

投稿記事 by WTR »

エラーメッセージしか見てませんが

コード: 全て選択

Game_Map.prototype.isLoopHorizontal = function() {
    return $dataMap.scrollType === 2 || $dataMap.scrollType === 3;
};
'scrollType' of null つまり $dataMap が null だということだと思うので
$dataMap が 存在することをチェックすればよかったりしないでしょうか。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
BumbleB
記事: 28
登録日時: 2017年2月27日(月) 05:28

Re: マウスカーソルがある位置のマップ座標を常に取得したい

投稿記事 by BumbleB »

>$dataMap が 存在することをチェックすればよかったりしないでしょうか。

早速返信いただき、ありがとうございます!
何度かリセットしたりシーン遷移連打したりして試してみたのですが
今のところエラーなしで安定して動いてくれています。
元の処理どうなってるかちゃんと見ないとだめですね…。

これエラーが出たり出なかったりしていたのは、$dataMapが読み込まれる前にTouchInputが呼ばれてしまうことがあるということなんでしょうか…
プラグインはこれで大丈夫だと思うのでひとまずは安心ですが、そういうのも気になりますね…
アバター
Plasma Dark
記事: 731
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: マウスカーソルがある位置のマップ座標を常に取得したい

投稿記事 by Plasma Dark »

少しだけ補足します。
これエラーが出たり出なかったりしていたのは、$dataMapが読み込まれる前にTouchInputが呼ばれてしまうことがあるということなんでしょうか…
$dataMap は、名前の通り、dataフォルダの中にあるMapXX.jsonから読み込んだマップデータです。
これが存在する前提で書いてしまうと、仰るとおりマップデータ読み込み前に実行したときに必ずエラーが出てしまいます。

また、ツクール自体の仕様が少し難しい部分ではあるのですが、イベントテストや戦闘テストではそもそもマップデータが読み込まれません。
イベントテストに関しては砂川さんが対策プラグインを作られていたように記憶していますが、それでもプラグインを書く際は$dataMapがnullである場合も考慮しておくのが安全だと思います。
アバター
BumbleB
記事: 28
登録日時: 2017年2月27日(月) 05:28

Re: マウスカーソルがある位置のマップ座標を常に取得したい

投稿記事 by BumbleB »

また、ツクール自体の仕様が少し難しい部分ではあるのですが、イベントテストや戦闘テストではそもそもマップデータが読み込まれません。
ありがとうございます、確かにif節を抜くと戦闘テストでは処理の重さなどに関係なく、必ずシーンのはじめに落ちていました。存在しないデータを読もうとしているということですね。勉強になります……。

ただ以下は改善法をお聞きしたいというような件ではないのですが
アドバイスを参考に改善した後も、色々テストプレイをしていたら一度だけ同じエラーに遭遇しました。
(エディタのテストプレイから開始しています。ただし現象が起こったのはF5リロードしたとき)
原因はわからないのですが、ルルの教会氏のLL_VariableWindowMV.jsを併用して常にカーソルのマップ座標を変数表示させていたのが相性が良くないようで、断続的にFPSが20あたりまでガクッと落ちていました。

もしかしたら負荷がかかりすぎるとデータの読み込みが遅れることもあるのかなと思いましたが
とりあえず無理のかからないような形に作り直して解決にしようと思います。
返信する

“MV:質問”に戻る