ウィンドウをたくさん出すプラグイン

ウィンドウを画面にたくさん出したら何かに使えるかなぁと思い、作ったけど、何の用途に使えるか不明だった。
せっかく作ったので公開。こういう機能があったら使えるよーというのがあれば教えてください。

ウィンドウたくさん出す

ダウンロードは↓から
https://raw.githubusercontent.com/kido0617/rpgmakerMV-plugin/master/WindowManager/WindowManager.js

使用方法

プラグインを追加したら、スクリプトコマンドで以下のようにします。

1
2
WindowManager.show(0, 10, 10,180, 80); //0番目のウィンドウを x=10,y=10の座標で 180の幅、80の高さで表示
WindowManager.drawText(0, "あいうえお"); //0番目のウィンドウに あいうえお と表示

スクリプト例

画像出したいときは以下のような感じ

1
2
WindowManager.show(3, 400, 200, 300, 300);
WindowManager.drawPicture(3, 'cat'); //Pictureの名前がcatの画像を表示

制御文字使いたい場合は、\を2つ重ねて使う。

1
WindowManager.drawText(0, "\\I[1]あいうえお");

ライセンス

MIT ご自由にどうぞ

マスクを使ってゲージを作る

変わったゲージ

今回はPIXIのマスクの機能を使って変わったゲージを作りたいと思います。
こういうゲージです。

完成図

デザインはともかく、ちょっと特殊な形のゲージです。

画像の用意

画像を2つ用意します。まず、ゲージの枠。
ゲージの枠

そして、ゲージの中身
ゲージの中身

想像のとおり、この2つを重ねるゲージが満タンの状態になります。

マスクを作る

扇形のマスクを使って、ゲージの中身を部分的に描画します。
例えば下図のようにするとマスクをすると下半分の白い部分だけが描画されます。
マスク
なので、ゲージが100%のときは360度の円、ゲージが50%なら180度の円のマスクを設定すれば、パーセンテージに応じたゲージが出来上がります。
ソースコードはこんな感じになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//ウィンドウとしてゲージを作ります
Window_Gauge.prototype.initialize = function() {
Window_Base.prototype.initialize.call(this, 0, 0, 300, 300);
this.opacity = 0; //ウィンドウ部分を消すため
//ゲージの枠を読み込み
var base = new Sprite(ImageManager.loadPicture('Base'));
//ゲージの中身を読み込み
var gauge = new Sprite(ImageManager.loadPicture('Gauge'));
//マスクを作る
var mask = new PIXI.Graphics();
mask.beginFill(0xffffff, 1); //白画像で塗りつぶす設定
//扇を描く。(144, 151)を中心に半径150で0度の角度からπ[rad]の角度で描画
//ここで角度を変数などに格納して描画するようにすれば、値に応じたゲージが出来ます
mask.arc(144, 151, 150, 0, 3.14);
mask.endFill();
gauge.mask = mask; //ゲージの中身にマスクを設定
base.addChild(gauge); //ゲージの枠にゲージの中身をaddChild
this.addChild(base); //できたゲージをウィンドウにaddChild
};

複雑な計算式はプラグインで記述する

ダメージ計算式のプラグイン化

ダメージの計算式は基本的に直接テキストボックスに書けば良い。
しかし、何行にも渡るような複雑な計算式を実現したい場合、狭すぎて記載しにくい。
そこで、そういった場合はプラグインとして記述する方法がある。

例えば、以下のようなプラグインを作る。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(function(global){
global.Calc = {
SpecialAtk: function(a, b){
//a b は計算式で使っているのと同様
//ここでは例として生きているメンバーのatkの合計をダメージとする
var members = $gameParty.aliveMembers();
var atk = 0;
for(var i = 0; i < members.length; i++){
atk += members[i].atk;
}
return atk - b.def; //returnした数値が計算式の結果となる
}
};
})(this);

そして、計算式を記述する際に、Calc.SpecialAtk(a, b); のように記載すればOK。

こんな感じ

応用

これと同様に条件分岐のスクリプトの箇所もプラグイン化すると複雑な条件分岐を書きやすくなる。

こんな感じ

シーンに引数を渡す

シーンを切り替える際、SceneManager.goto とか SceneManager.push を使うが、このとき引数を次のシーンに渡すことができる。それがprepareNextSceneだ。
例えば、Scene_Testに遷移するとき、以下のような感じで渡せる。

1
2
SceneManager.push(Scene_Test);
SceneManager.prepareNextScene(123, "abc");

遷移先のシーンでは、以下のprepareメソッドで受け取れる。

1
2
3
Scene_Test.prototype.prepare = function(a, b) {
console.log(a, b); //123, "abc"
};

シーンからマップに場所移動

reserveTransferを使う

独自に作ったシーンからあるマップのある位置に移動するには$gamePlayer.reserveTransferを使う。
このメソッドの詳しい説明は以下のサイトが詳しい。
ツクールMVのスクリプトで場所移動を行う方法
ただ、Scene_MapからScene_Mapへの移動なら$gamePlayer.reserveTransferを呼び出すだけで移動できるが、
Scene_Map以外のシーンからの移動の場合は、reserveTransferに加えて、SceneManager.goto(Scene_Map)が必要。

1
2
$gamePlayer.reserveTransfer(6, 1, 1, 8, 0);
SceneManager.goto(Scene_Map);

Map IDの特定方法

ところで、$gamePlayer.reserveTransferの第一引数にMapのIDを渡さなければいけないが、これをどこで確認するか。
2つ方法があり、1つはエディタのマップの編集画面の以下の箇所。

もう1つは data/MapInfos.json を開くとidがわかる。

Map IDを名前から検索

私はよく使うのだが、マップ名からMAP IDを検索する方法を載せておく。

1
2
3
4
5
6
function getMapId(mapName){
for(var i = 0; i < $dataMapInfos.length; i++){
if($dataMapInfos[i] && $dataMapInfos[i].name == mapName) return $dataMapInfos[i].id;
}
return null;
}