プラグイン制作/技術|雑談

くらむぼん

モデレーター
スタッフ
モデレーター
ツクールMVでES2015のクラス構文使ってスクリプトを書いていますが、ブラウザの対応状況どうなんでしょう。
これ使うととても書きやすいので、一度使うと手放せないです。
PCはほぼChromeかEdgeでしょうから対応していますが、スマホ側の事情が把握できません。
古い端末は無視した方が楽なんですけども。
Web出力できるが故の問題ですね。
ツクールの動作対象範囲内で言うと、
iOS Safari 8(つまりiOS8)では残念ながらclassは使えないみたいです…
そこをご自分のゲームの動作対象にするかどうかで決めるのがおすすめです!
 

ツミオ

ユーザー
いつもお世話になっております。
マウスを使ったスクロールに関して疑問が出てたので、お力を貸していただければなと思います。

【知りたいこと】
Shiftキーを押しながらマウスホイールをスクロールさせた場合のホイール量を取得したいと思っています。

【調べたこと】
現在マウスのスクロール判定にTouchInput.wheelYを使っているのですが、Shiftキーを押しながらマウスをスクロールさせると、このTouchInput.wheelYの値が常に0になります。
「何かキーを押しながらスクロールさせると0になるのかな?」と思ってShiftキーではなく他のキー(例えばCtrlキーなど)に変更してみたところ、確認できた範囲ではShiftキーだけがこの挙動を示しました。
つまりShiftキー以外を押している場合、マウスのホイールを回転させるとTouchInput.wheelYの値もホイール量に合わせて通常通り変更されました。

【まとめ】
Shiftキーを押しているときのマウスのスクロールを判定したい場合、どのようなコードを書けばよいでしょうか?
また、Shiftキーを押すとなぜTouchInput.wheelYの値が0になるのかも教えていただければ幸いです。

以上、よろしくお願いいたします。
 

トリアコンタン

モデレーター
スタッフ
モデレーター
いつもお世話になっております。
マウスを使ったスクロールに関して疑問が出てたので、お力を貸していただければなと思います。
こんにちは!
onWheelイベントが発生したときに、引数にマウスホイールの変化量が渡されます。(event.deltaY)
このときShiftキーが押下されていると、たとえホイールを回していても渡される値が-0で固定されてしまうようです。

この現象は現行のChrome(もしくはFirefox)では発生しません。おそらくChromeのバグもしくは不適切な実装として修正されたものと思われます。よってコアスクリプト側での対処は難しいです。

唯一の対処法としてNW.js(ローカル実行のエンジン)を最新版に更新する方法があります。(自己責任で下記をご参照ください)
http://b.dlsite.net/RG26890/archives/upgrading_nwjs_within_rpgmakermv

この方法でならShiftキーを押しながらでもホイールの変化量が正しく渡されることを確認しました。
よろしければお試しください。

追記
上に回転させたか、下に回転させたか、および回転速度を意識しなくて良いのなら、onWheelイベント自体は発生しているのでTouchInput._onWheelを再定義してフラグを立てる方法もあります。
 
最後に編集:

ビービー

ユーザー
こんにちは

ブラウザなどでShiftキーを押しながらマウスホイールをスクロールすると
画面が左右にスクロールするのでツクールでもそうなのかなと思い
並列処理のイベントに条件分岐のスクリプトでTouchInput.wheelX > 5とやってみたところ
条件内のイベントコマンドが実行されたのでおそらくShiftキーを押しながらマウスホイールをスクロールした場合
TouchInput.wheelXが変動するのだと思います。

なのでShiftキーを押しているときのマウスのスクロールを判定したい場合は
TouchInput.wheelXで取得できるようです。
なぜこういう仕様なのかはわかりませんがとりあえず参考までにお知らせさせていただきました。
 

ツミオ

ユーザー
トリアコンタンさん、ビービーさん。
お二人ともありがとうございます。

トリアコンタンさんへの返信:
この現象は現行のChrome(もしくはFirefox)では発生しません。おそらくChromeのバグもしくは不適切な実装として修正されたものと思われます。よってコアスクリプト側での対処は難しいです。
環境によって動作が変わってしまうのですね。
勉強になります。
NW.jsの更新はしたことがなかったので、視野に入れてみます。

上に回転させたか、下に回転させたか、および回転速度を意識しなくて良いのなら、onWheelイベント自体は発生しているのでTouchInput._onWheelを再定義してフラグを立てる方法もあります。
こちらも検討してみます。
ありがとうございます。

ビービーさんへの返信:
ブラウザなどでShiftキーを押しながらマウスホイールをスクロールすると
画面が左右にスクロールするのでツクールでもそうなのかなと思い
並列処理のイベントに条件分岐のスクリプトでTouchInput.wheelX > 5とやってみたところ
条件内のイベントコマンドが実行されたのでおそらくShiftキーを押しながらマウスホイールをスクロールした場合
TouchInput.wheelXが変動するのだと思います。
こちらでもTouchInput.wheelXの値が変動していることを確認しました。
ただし値は100か-100かのいずれかでしたが、上のスクロールなのか下のスクロールなのかの判定には使えそうでした。
参考になる情報ありがとうございます。


とりあえず今回は別のキーを割り当てて代用しようかなと思います。
大変勉強になりました。
解決済みといたします。
 
メモ欄を書き間違えたときに「間違っています」という例外を投げて
ゲームを停止させたいです。
プラグインエラーでゲームが停止するのはびっくりするかもしれませんが
間違っていることがはっきりわかるという意味では便利ですし
プログラミングを上達させるコツは「エラーメッセージを恐れないこと」だと聞いたからでもあります。

それはともかく、ダメージ計算系のプラグインを作っているのですが単に例外を投げるだけでは
コンソールに「Uncaught Error(エラーをキャッチできない)」と表示できるだけになってしまいます。

別のところ、例えば「スクリプト」などからエラーを投げると
ちゃんと(?)ゲームが停止します。この違いは、どこにあるのでしょうか?
 

トリアコンタン

モデレーター
スタッフ
モデレーター
こんばんは!
ツクールMVのゲーム中に発生したエラーは次の2種類の方法で捕捉されています。

1. SceneManager.runのtry-catch
2. SceneManager.setupErrorHandlersで登録したSceneManager.onError関数

このうちイベントコマンド「スクリプト」で発生したエラーを含めた大半のエラーが1で捕捉されます。
2は少し難しいですが、非同期処理(ファイル読み込みなど)のコールバック関数で発生したエラーなどを捕捉しています。
これらに捕捉されるとゲームの処理が中断されます。

上記のいずれの場合も捕捉できないのは「上記の1.2.の処理が実行される前に発生したエラー」です。
例えばプラグインを読み込んだ直後に実行する処理でエラーが起きた場合、コンソールに出力されるだけでエラーは捕捉できません。

・捕捉されないエラーの例
PHP:
(function() {
    'use strict';

    SceneManager.requestUpdate = function() {
        throw new Error('このエラーはプラグインを読み込んだ直後に実行されるわけではないので捕捉できます。');
    };

    throw new Error('このエラーはプラグインを読み込んだ直後に実行されるので捕捉できません。');
})();
 

shun

ユーザー
こんばんは!

アクションRPG的なものを作ろうとコモンイベントを駆使していたのですが、
変数の管理の煩雑さやスクリプトの行数制限などでコモンイベントだけで実現するのは限界を感じています。

汎用的に使用したい関数をプラグインとしてまとめて運用しようかと考えているのですが。
javascriptやツクールの作法的に問題ないのかなと気になりました。

例としてプレイヤーの正面1マス先のイベントを設定する関数を作りました。
さらにイベントトリガーを取得して決定キーなら攻撃しないといった処理をするつもりです。

コード:
function setFrontEventID(value) {
'use strict';
var x = $gamePlayer.x;
var y = $gamePlayer.y;

var directionSwitch = {
2: function(){
y += 1;
},
4: function(){
x -= 1;
},
6: function(){
x += 1;
},
8: function(){
y -= 1;
}
}
var func = directionSwitch[$gamePlayer._direction];
func();

$gameVariables.setValue(value, $gameMap.eventIdXy(x, y));
}
アドバイスいただけると嬉しいです!
 
どうも、shunさん。
目の前のイベントIDを取得する関数ですが、
関数の内容自体はこれでいいと思います。
※ただ、関数の引数の value は関数内のどこにも使われていないので省略したほうが
分かりやすいかもしれません。

これをプラグイン化する場合、例えば、Game_Mapの関数にしてはいかがですか。
理由は、Game_Mapが、マップのイベント関係の処理を司っているからです。
つまり、関数名を、Game_Map.prototype.setFrontEventID にして、
呼び出すときは、var eventId = $gameMap.setFrontEventID(); みたいにすれば
いいんじゃないかな、と思います。

なお、その場合、1行目は、
Game_Map.prototype.setFrontEventID = function() {
最後は、
};
のように、セミコロンを付ける形式にしてください。
(無名関数を、グローバル変数に代入する形式。コアスクリプトのイディオム)
 

shun

ユーザー
神無月サスケさん
お返事ありがとうございます!

なんとなーくではありますがjavascriptにも慣れてきたような気がしています。
Game_Mapを拡張する形で実装を進めようと思います。

またよろしくお願いします。
 
FTKR_ExBattleCommandを使って自作戦闘システムでスキルをアクターコマンドに直接して魔法(本来のスキルタイプではなく魔法という名前のスキル)を選択して、イベント発動するスキルでスキルの表示をONOFFによって変更。
ここまではよかったが、キャンセルボタン押してスキルの表示をONOFFにする方法がない。
111_PartyCommandSkipで、ふと「キャンセルボタン押したとき(戦う・逃げる)にコモンイベント発動と、キャンセルボタン押したときに戦う・逃げるにならずアクターコマンドに戻る」というものがあればと調べたけど、

var _Scene_Battle_endCommandSelection =
Scene_Battle.prototype.endCommandSelection;
Scene_Battle.prototype.endCommandSelection = function() {
_Scene_Battle_endCommandSelection.call(this);
this.hasAlreadyInputStart = false;
};

})();

なんとなく、ここを改変できれば可能だと思うけど、どう改変すればいいか分からない。
 
var _Scene_Battle_endCommandSelection =
Scene_Battle.prototype.endCommandSelection;
Scene_Battle.prototype.endCommandSelection = function() {
_Scene_Battle_endCommandSelection.call(this);
this.hasAlreadyInputStart = false;
};

})();

なんとなく、ここを改変できれば可能だと思うけど、どう改変すればいいか分からない。
間違っていたのか・・・。
コメントアウト(//)を使って調べたら
this.hasAlreadyInputStart = true;
が、キャンセルボタン押すと戦う・逃げるに戻る仕様だった。YEP_BattleEngineCoreの方が優先的に働くから別の方法を探さないといけない。
で、YEP_BattleEngineCoreで戦う・逃げるを表示しないようにするには

Yanfly.BEC.Scene_Battle_selectPreviousCommand =
Scene_Battle.prototype.selectPreviousCommand;
Scene_Battle.prototype.selectPreviousCommand = function() {
if (this.isStartActorCommand()) {
BattleManager.selectPreviousCommand();
if (BattleManager.isInputting() && BattleManager.actor()) {
this.startActorCommandSelection();
} else {
// Yanfly.BEC.Scene_Battle_startPartyCommandSelection.call(this);
}
} else {
Yanfly.BEC.Scene_Battle_selectPreviousCommand.call(this);
}
};

になっていた。
ここのどこかにキャンセルボタン押したときにコモンイベント発動するものを組み込めばいいけど、どうすればいいかだよな。
 

kuro

フォーラムスタッフ
おつかれさまです。
ピンポイントな相談で恐縮です。

CharacterGraphicExtend.js 1.10.2
MOG_CharPoses.js v2.1
MOG_CharPoses_Customize.js

上記の組み合わせの場合、CharacterGraphicExtend.jsの機能CGピクチャが機能しないことを確認しました。

記述例<CGピクチャ:A,test>
1.jpg

正常な場合
2.jpg

こちらを解決頂くことは可能でしょうか。

以下に新規プロジェクトをベースにした再現環境を用意しました。
https://drive.google.com/open?id=1tGifSCH_fUi9CmRqY4FOr2NMi-hViVsc

お力添え頂けますと幸いです。
 
> kuroさん
こんばんは。
取り急ぎプラグイン登録の順番を以下に変更することで、正常に動作するようです。
MOG_CharPoses.js v2.1
CharacterGraphicExtend.js 1.10.2

追記
どうやら原因は、characters画像として表示されたため、画像幅が通常のイベント画像と同じく1/12サイズ幅になっていました。
他のイベント画像変更プラグインと併用する場合も、CharacterGraphicExtend.jsを下にした方が良さそうです。
下にしたものが新しく、同一メソッドの場合最初に実行されていくためです。
 
最後に編集:

kuro

フォーラムスタッフ
>アストラルさん
こんばんは。
早速ありがとうございました。

ご指摘の順序で解決することができました。
他の画像描画系にも影響を与えうるとのこと、注意してみます。

以前ご提供くださったプラグインやスクリプトのコードも大変助かっております。
いつも本当にありがとうございます。
 
トップ