読者です 読者をやめる 読者になる 読者になる

ANOS-SOFT

Salesforce、RPGツクール、Unity、そんな雑記

【ツクールMV】自作メニューを作りたい 第6回

ソースって書くといまだにウスターが出てくる。
どうも、のすです。


今回の記事は多分難しいです。
だけど、ツクールってこんな感じで動いてるんだ!ということを理解する足掛かりになるはずなので

是非読んでください、一生懸命書くんで…( ノД`)

分かるところを読む

Scene_Menu.prototype.create = function() {
    Scene_MenuBase.prototype.create.call(this);
    this.createCommandWindow();
    this.createGoldWindow();
    this.createStatusWindow();
};

頭の方にあるprototypeとかinitializeとか、
その辺りは初期化したりとか準備をしている部分なので、理解は不要と判断。
もし理解が必要なら後で詰まるので、その時に考えることにします。

てなわけで、一番最初に重要そうな部分はここ!
createとか書かれてるし、多分メニュー画面を表示する処理です。

確信が持てない? それじゃあ・・・

一部消して実行してみましょうね

this.createStatusWindow();をコメントアウトして保存、そしてテストプレイ!

f:id:anos-soft:20161116211923p:plain

うん、知ってた。

そりゃあ、もしかして一部だけウィンドウが表示されないとかになるんじゃないかなとか期待したけど

しかしまだ諦めてはいけない。

次なるコメントアウトはここだ!

Scene_Menu.prototype.createStatusWindow = function() {
    this._statusWindow = new Window_MenuStatus(this._commandWindow.width, 0);
    this.addWindow(this._statusWindow);
};

この中の、this.addwindow();の行をまるまるコメントアウト!
これでおそらく、ステータスを表示しているウィンドウが表示されなくなるはず・・・!

f:id:anos-soft:20161116212436p:plain

出来ちゃったよ

線が入っているのは相変わらずうちのPCの環境のせいなので無視してください。

これでわかったことは

this.addWindow(~~~);という処理はウィンドウを表示する処理ということ

なんとなくだけど、読み解けましたね!

短いけど今回はここまで、この後はプラグインの作り方とかその辺を調べてからの更新になります!

【ツクールMV】自作メニューを作りたい 第5回

調子が乗ってる日はたくさん書ける、のすです。

早速、Scene_Menuを探しましょう。
プロジェクトのフォルダを開くと

  • audio
  • data
  • fonts
  • icon
  • img
  • js
  • movies
  • save

という感じでフォルダが並んでるかと思いますが、
RPGツクールMVの本体はdataとjsです。

それ以外は素材です。imgには画像(image)が、audioには音楽ファイルが格納されています。
dataはキャラクターの設定やシステム設定、イベントなんかが入っているのですが
これらの動作をつかさどっているのがjsフォルダです。

では、この中からScene_Menuの処理が書いてあるjsファイルを見つけましょう★

特定の処理の見つけ方

見つけましょうったって、簡単に見つけられないですよね
jsファイルは一番長いrpg_objects.jsだと1万行を超えるほどの処理が書かれています。
こんなにたくさんある中から探せなんて言う方が無理なので、簡単な探し方を紹介します。

サクラエディタ Download

こちらのサクラエディタを使いましょう。
ゲームに限らず、色々な開発現場で使われているフリーのエディタです。
インストール方法やなんかは難しくないので各自で調べてください…。

はてさて、サクラエディタを開くと何も書かれていないテキストが開くかと思います。

f:id:anos-soft:20161116205104p:plain

この子はいったん置いといて、プロジェクトフォルダを開いてください。
その中のjsフォルダをキーボードのShiftを押しながら右クリックして、「パスのコピー(A)」をしてください。
f:id:anos-soft:20161116205209p:plain

パスのコピーとは、クリックしているファイルがパソコンのどの位置に保存されているかという情報をコピーする。ということです
パスという言葉は情報系の技術者にでもならない限り必要ないかもしれません。
説明を続けます。

先ほどの何も書かれていないサクラエディタを開いてキーボードのCtrlを押しながらGを押してください。

f:id:anos-soft:20161116205659p:plain

こんなウィンドウが出ましたよね?

条件に「Scene_Menu」、ファイルに「*.js」、そしてフォルダに先ほどコピーしたパスを貼り付けてください。
貼り付けたら「検索」をクリック!

f:id:anos-soft:20161116205918p:plain

どどどどっと、Scene_Menuと書かれた部分が検索されました。
これはGrepという機能で、先ほど指定したパス以下にあるjsファイルから「Scene_Menu」と書かれた行を探してくれたのです。
この中でどれがScene_Menuについて書かれた部分なのかを見極めるには、ずばり文頭をチェックしてください。

// Scene_Menu

このように、//から始まっている文は当たりの可能性が非常に高いです。
//というのは、JavaScriptでコメントとして扱われる行に記載するものであり、
//の後に書かれた内容はすべて処理に関係ないものだからです。

この辺は、プログラミング コメント とかでぐぐってもらえれば色々解説が出るかと思うので、調べてみてください。

ではさっそく、この//Scene_Menuが書かれた部分をダブルクリックしましょう!

f:id:anos-soft:20161116210337p:plain

こうなりました?なったら成功です!よく似た// Scene_MenuBaseがあるので気を付けてください!

ということで、以下にScene_Menuの処理全文を載せて今回は終わります。

//-----------------------------------------------------------------------------
// Scene_Menu
//
// The scene class of the menu screen.

function Scene_Menu() {
    this.initialize.apply(this, arguments);
}

Scene_Menu.prototype = Object.create(Scene_MenuBase.prototype);
Scene_Menu.prototype.constructor = Scene_Menu;

Scene_Menu.prototype.initialize = function() {
    Scene_MenuBase.prototype.initialize.call(this);
};

Scene_Menu.prototype.create = function() {
    Scene_MenuBase.prototype.create.call(this);
    this.createCommandWindow();
    this.createGoldWindow();
    this.createStatusWindow();
};

Scene_Menu.prototype.start = function() {
    Scene_MenuBase.prototype.start.call(this);
    this._statusWindow.refresh();
};

Scene_Menu.prototype.createCommandWindow = function() {
    this._commandWindow = new Window_MenuCommand(0, 0);
    this._commandWindow.setHandler('item',      this.commandItem.bind(this));
    this._commandWindow.setHandler('skill',     this.commandPersonal.bind(this));
    this._commandWindow.setHandler('equip',     this.commandPersonal.bind(this));
    this._commandWindow.setHandler('status',    this.commandPersonal.bind(this));
    this._commandWindow.setHandler('formation', this.commandFormation.bind(this));
    this._commandWindow.setHandler('options',   this.commandOptions.bind(this));
    this._commandWindow.setHandler('save',      this.commandSave.bind(this));
    this._commandWindow.setHandler('gameEnd',   this.commandGameEnd.bind(this));
    this._commandWindow.setHandler('cancel',    this.popScene.bind(this));
    this.addWindow(this._commandWindow);
};

Scene_Menu.prototype.createGoldWindow = function() {
    this._goldWindow = new Window_Gold(0, 0);
    this._goldWindow.y = Graphics.boxHeight - this._goldWindow.height;
    this.addWindow(this._goldWindow);
};

Scene_Menu.prototype.createStatusWindow = function() {
    this._statusWindow = new Window_MenuStatus(this._commandWindow.width, 0);
    this.addWindow(this._statusWindow);
};

Scene_Menu.prototype.commandItem = function() {
    SceneManager.push(Scene_Item);
};

Scene_Menu.prototype.commandPersonal = function() {
    this._statusWindow.setFormationMode(false);
    this._statusWindow.selectLast();
    this._statusWindow.activate();
    this._statusWindow.setHandler('ok',     this.onPersonalOk.bind(this));
    this._statusWindow.setHandler('cancel', this.onPersonalCancel.bind(this));
};

Scene_Menu.prototype.commandFormation = function() {
    this._statusWindow.setFormationMode(true);
    this._statusWindow.selectLast();
    this._statusWindow.activate();
    this._statusWindow.setHandler('ok',     this.onFormationOk.bind(this));
    this._statusWindow.setHandler('cancel', this.onFormationCancel.bind(this));
};

Scene_Menu.prototype.commandOptions = function() {
    SceneManager.push(Scene_Options);
};

Scene_Menu.prototype.commandSave = function() {
    SceneManager.push(Scene_Save);
};

Scene_Menu.prototype.commandGameEnd = function() {
    SceneManager.push(Scene_GameEnd);
};

Scene_Menu.prototype.onPersonalOk = function() {
    switch (this._commandWindow.currentSymbol()) {
    case 'skill':
        SceneManager.push(Scene_Skill);
        break;
    case 'equip':
        SceneManager.push(Scene_Equip);
        break;
    case 'status':
        SceneManager.push(Scene_Status);
        break;
    }
};

Scene_Menu.prototype.onPersonalCancel = function() {
    this._statusWindow.deselect();
    this._commandWindow.activate();
};

Scene_Menu.prototype.onFormationOk = function() {
    var index = this._statusWindow.index();
    var actor = $gameParty.members()[index];
    var pendingIndex = this._statusWindow.pendingIndex();
    if (pendingIndex >= 0) {
        $gameParty.swapOrder(index, pendingIndex);
        this._statusWindow.setPendingIndex(-1);
        this._statusWindow.redrawItem(index);
    } else {
        this._statusWindow.setPendingIndex(index);
    }
    this._statusWindow.activate();
};

Scene_Menu.prototype.onFormationCancel = function() {
    if (this._statusWindow.pendingIndex() >= 0) {
        this._statusWindow.setPendingIndex(-1);
        this._statusWindow.activate();
    } else {
        this._statusWindow.deselect();
        this._commandWindow.activate();
    }
};

www.anos-soft.com

【ツクールMV】自作メニューを作りたい 第4回

まごころを、のすに

どうも、ツクールMVで自作メニューを作りたい講座はじめていきます。
作りたいとか言ってる当たり完璧に自分も作ってないのバレバレなんですけどね


ではでは、JavaScriptに詳しくない人間がどうやって自作メニューを完成させるかの軌跡とでも思って読んでください。

公式のプラグインを読んでみる

ツクールMVには最初からAltMenuScreenというプラグインが付属しています。

■標準のメニュー画面
f:id:anos-soft:20161116162829p:plain

■AltMenuScreen適用状態
f:id:anos-soft:20161116162837p:plain

このプラグインを適用するだけで、簡単に普通と違うメニューに変更することが可能です。

つまり、このAltMenuScreenの中身をちょろっと変えれば簡単に自分でメニューが作れるのでは?
という発想で自作メニューを作っていこうと思います。

メニューは変わった、でもその後は?

上に掲載した画像、たしかにメニューのレイアウトは変更されていますが、それ以降はどうでしょう?

■アイテム画面
f:id:anos-soft:20161116193351p:plain

■セーブ画面
f:id:anos-soft:20161116193412p:plain

そのほか、スキル、ステータス、オプション…全部同じじゃないか!!

実は、RPGツクールMVでは所謂メニュー画面等は「シーン」と呼ばれるもので別個に管理されています。
つまり、AltMenuScreenで変えられるのはメニュー画面を開いた時のメニュー選択画面のみ、ということ

自作メニューを作りたいと思ったからには、当然全部変えたいと思いますよね?
少なくとも私はそれぞれのレイアウトを自由に弄りたいのと、
なんなら「オプション」とか「ステータス」とかあんまり使わなそうだし外したい…と思っております。

そういった画面を頑張って自作してみましょう、いえい!!

まずは調査してみます

調べてみると、ryiwamoto (id:ganr)さんのブログにたどり着きました。

gan.hatenablog.jp

こういうのって勝手にリンク貼っていいのかな、わからないけどお名前を書いたし、引用だしセーフ…?
(もしダメだったら教えてください)

ざっくりいうと、以下

  • Scene_Map
  • Scene_Menu
  • Scene_Item
  • Scene_Skill
  • Scene_Equip
  • Scene_Status
  • Scene_Options
  • Scene_Save
  • Scene_Load
  • Scene_Gameend

これだけのScene同士が遷移することでメニュー画面を作っているそうです。
さらに言うと、アイテムとスキルには共通の親クラスがあったりするそうですが、割愛

まずはScene_Menu辺りを読みましょうかね。

www.anos-soft.com