挑戦!RPGツクールMV【5日目】
"RPG"ツクールなので、今度は自由にRPGを作ることにしました。
前回の記事から今までコツコツと作業を進めています。
イベントやスキル、敵キャラ作成をしてるとあっという間に時間が立ちますね。
RPGツクールというRPG作成に特化したソフトを使っても、
そう簡単には作れないなといった印象です。
前途のようにイベントやスキル、敵キャラの調整をしていた訳なんですが、
いい感じになるまで数値をいじるだけですし、アップするのもキリがないので、
作成したプラグインについて書いていきます。
作成したプラグイン
レベルアップ
ツクールMVはなんと、レベルアップ音と上昇ステータス表示がありませんでした。
RPGツクールっていうくせにレベルアップ周りの機能がないのか…(困惑)。
まずはレベルアップ時にSEと上昇したステータスを表示するためのプラグインです。
レベルアップした場合、戦闘勝利MEがなるのと同時にSEも鳴ります。
「レベルアップ!」のテキストに合わせたかったのですが、わかりませんでした。
上昇ステータス表示は複数人のレベルアップにも対応しておりますが、
一度に2以上レベルアップした場合は1レベル分しか表示できません。
もし表示したい場合は、変数に格納するのが一番早いと思います。
(function () { SoundManager.playLevelUp = function() { var Se = { "name": "Up4", "pan": 0, "pitch": 100, "volume": 90 }; AudioManager.playSe(Se); }; Game_Actor.prototype.changeExp = function(exp, show) { this._exp[this._classId] = Math.max(exp, 0); var lastLevel = this._level; var lastSkills = this.skills(); while (!this.isMaxLevel() && this.currentExp() >= this.nextLevelExp()) { var _last_actor = $gameActors.actor(this._actorId); var _last_myStatus = { 0 : _last_actor.mhp, 1 : _last_actor.mmp, 2 : _last_actor.atk, 3 : _last_actor.def, 4 : _last_actor.mat, 5 : _last_actor.mdf, 6 : _last_actor.agi, 7 : _last_actor.luk }; this.levelUp(); } while (this.currentExp() < this.currentLevelExp()) { this.levelDown(); } if (show && this._level > lastLevel) { this.displayLevelUp(this.findNewSkills(lastSkills)); var _actor = $gameActors.actor(this._actorId); var _myStatus = { 0 : _actor.mhp, 1 : _actor.mmp, 2 : _actor.atk, 3 : _actor.def, 4 : _actor.mat, 5 : _actor.mdf, 6 : _actor.agi, 7 : _actor.luk }; for(var i=0;i<8;i++){ _myStatus[i] = _myStatus[i] - _last_myStatus[i]; } var text = "最大HP+" + _myStatus[0] + " 最大MP+" + _myStatus[1] + "\n攻撃力+" + _myStatus[2] + " 防御力+" + _myStatus[3] + "\n魔法力+" + _myStatus[4] + " 魔法防御+" + _myStatus[5] + "\n敏捷性+" + _myStatus[6] + " 運+" + _myStatus[7]; $gameMessage.newPage(); $gameMessage.add(text); SoundManager.playLevelUp(); } this.refresh(); }; })();
スクリプトから音が鳴らす方法は、
SoundManager.playLevelUpの所を見ればわかるんですが、
上からに名前(拡張子無し)、位相、ピッチ、音量です。
AudioManager.playSe(Se);で鳴らせます。
他にも、AudioManager.playMeとかでMeが鳴らせます。
表示テキストを追加する場合は、
var text = "ほにゃらら";
$gameMessage.newPage();
$gameMessage.add(text);
と書いてやればできます。
アクターIDはthis._actorIdでなんか参照できました。
装備拡張
僕が作るRPGでは、枠を超えてどれでも好きに装備させたかったので、
武器・盾・頭・体・装飾品を装備・装備・装備・装備に変更し、
同じものを自由につけれるようにしました。
というか、武器カテゴリに全ての装備を作成し、
武器を複数装備できるようにしただけです。
つまるところ攻撃力0で守備力が上がる武器ですね。
ただし、
初期装備やイベントで防具だった箇所に装備を付けられない欠陥があります。
(function () { Game_Actor.prototype.equipSlots = function() { var slots = []; for (var i = 1; i < $dataSystem.equipTypes.length; i++) { slots.push(1); } if (slots.length >= 2 && this.isDualWield()) { slots[1] = 1; } return slots; }; Window_ItemCategory.prototype.makeCommandList = function() { this.addCommand(TextManager.item, 'item'); this.addCommand(TextManager.weapon, 'weapon'); //this.addCommand(TextManager.armor, 'armor'); this.addCommand(TextManager.keyItem, 'keyItem'); }; })();
slots.push(1);が武器のことで、slots.push(2)が盾ということです。
元のコードが見たかったら、
上記コードの一部をrpg_objects.jsでctrl+Fで探してくださいな。
Window_ItemCategory.prototype.makeCommandListでは、
使わない防具カテゴリをコメントアウトで除外しています。
TP設定
最後に、TPを戦闘終了時に0にしたり、
ダメージを喰らった際の上昇量を抑えたかったのでいじりました。
(function () { Game_Battler.prototype.initTp = function() { this.setTp(0); }; Game_Battler.prototype.chargeTpByDamage = function(damageRate) { var value = Math.floor(20 * damageRate * this.tcr); this.gainSilentTp(value); }; })();
作成したプラグインは以上です。
コードを理解するのはかなり時間がかかります。
ゲームで扱っているデータがなんて変数に格納されているかが、
いまいち把握できていませんね…。
プラグインを推奨するなら、
もっと注釈入れてくれてもいいんじゃないんですかね…?(小言)
それではまた。
挑戦!RPGツクールMV【4日目】
アイテムカテゴリを省略するプラグイン
友達にプレイしてもらって言われたのですが、
アイテム選択時に一々カテゴリを決定しないといけないのが
煩わしいとのことでした。
メニューのアイテムを押すと上図のようにカテゴリ選択から始まる。
カテゴリを決定して初めてアイテムを選択できる。
アイテムが見えているのに直接クリックできないのは確かに煩わしいですよね。
スマホでプレイするとなれば、
なおさら直接タッチができないことに違和感を覚えると思います。
僕も最初煩わしいと思ったのですが、変にいじってエラーが起きたら嫌だし、
めんどくさかったので妥協してましたが、(本音)
友人に言われたのを機にプラグインを作ることにしました。
NoItemCategory.js
(function() { var _Scene_Item_create = Scene_Item.prototype.create; Scene_Item.prototype.create = function() { _Scene_Item_create.call(this); this._categoryWindow.deactivate(); this.onCategoryOk(); this._categoryWindow.hide(); }; Scene_Item.prototype.onItemCancel = function() { this._itemWindow.deselect(); this.popScene(); }; Scene_Item.prototype.createItemWindow = function() { var wy = this._categoryWindow.y; var wh = Graphics.boxHeight - wy; this._itemWindow = new Window_ItemList(0, wy, Graphics.boxWidth, wh); this._itemWindow.setHelpWindow(this._helpWindow); this._itemWindow.setHandler('ok', this.onItemOk.bind(this)); this._itemWindow.setHandler('cancel', this.onItemCancel.bind(this)); this.addWindow(this._itemWindow); this._categoryWindow.setItemWindow(this._itemWindow); }; Window_ItemCategory.prototype.makeCommandList = function() { this.addCommand(TextManager.item, 'item'); //this.addCommand(TextManager.weapon, 'weapon'); //this.addCommand(TextManager.armor, 'armor'); //this.addCommand(TextManager.keyItem, 'keyItem'); }; })();
カテゴリ別に分ける必要が無ければ省略した方がいいですよね。
アイテム選択と同時にアイテム使用も行おうと思ったのですが、
そうするとアイテムの説明欄が表示できなくなるのでやめました。
ついでに、部屋移動の判定も少し修正しました。
以上で、脱出ゲーム製作は一旦終了とします。
ではまた。
挑戦!RPGツクールMV【3日目】
スクリプトの諸注意
やってて気づいたのですが、過去作とMVでは結構仕様が違うんですね。
VXのスクリプトを参考にしながら作っていたら、普通にエラー吐きました。
という訳で、一応新しく参考リンク貼っておきます。
RPGツクールMV スクリプト基本編 - Qiita
ツクールMVスクリプト|RPG作る人のブログ
タイルセットの追加
雰囲気を統一した上で家具を配置するとなると、
標準で備わっているマップチップでは全然足りません。
というわけで、早速インポートしたいと思います。
とりあえず、扉のマップチップが見つからなかったのでインポートしてみました。
適当に「マップチップ フリー素材 扉」とかでググって保存しました。
ここで注意なのが、ツクールMVが48×48なところです。
過去作のツクールVXなどは32×32なので拡大しないと上手くハマりません。
GIMPとかの画像編集ソフトで拡大してやりましょう。
インポートの仕方は直接プロジェクトのフォルダのに入れます。
「Project」→「img」→「tilesets」にぶっこみます。
あとはデータベースから「タイルセット」を選択して色々設定します。
進捗報告
前回のアイテム使用方法を用いて、アイテム数とイベントを増やしました。
それに伴い、マップも増やしました。
マップを作っていて思ったのですが、マップ作るのって結構難しいですね。
コピペで作っていたために部屋の大きさ・形が同じままなのもいけないのですが、
同じような部屋ばかりできてしまい、何度か作り直しました。
というか後半は投げやりになっています。
ギミックに関しては前回と同じ要領で、
正しい場所でアイテムを使うと何かが起こる、というものを量産していきます。
調べた時に出るテキストなんですが、
あまり気の利いたテキストが思いつかなかったので、
当たり障りのないものをコピペして置いときました。
次作る時はもっと面白い事を書きたいですね。(願望)
脱出ゲームではどんな仕掛けを用意するかが重要だと思うんですけど、
中々思いつかないので僕は向いていないのかもしれません。(折れ気味)
挑戦!RPGツクールMV【2日目】
2日目の記事を書いていきます。
1日目から5日が経っていますが、何をしていたかと言うと、
実際にツクール公式サイトのサンプルをプレイしたり、
ニコ動で参考動画を見ていました。
一応リンク貼っときます。
RPGツクールMV サンプルゲーム|無料で遊べるニコニコゲームマガジン
【RPGツクールVX Ace】スクリプト講座part1~コンソールとテキスト表示~ ‐ ニコニコ動画:GINZA
RPGツクール2でRPG作っているところを解説実況 Part1 ‐ ニコニコ動画:GINZA
友人が作った破壊力の高いRPGを実況 Part1 ‐ ニコニコ動画:GINZA
ちなみにプレイしたサンプルは「FILAMENT」と
「エミールの小さな冒険」の2作です。
3番目と4番目のリンクにあるRPGツクール2の方は、
エディタの使い方ではなく、
実際にRPGゲームのストーリーやバランス、
イベントなどの作り方の参考として見ました。
RPGに限られますし、エディタ面では参考にはなりませんが、
ぶっちゃけ面白かったので見続けちゃいました。
脱出ゲームを作ろう!
最初は簡単なゲームを作りたいので、
クリムゾンルームのようなアイテムを探索したり
仕掛けを解いたりして部屋から脱出するゲームを作りたいと思います。
という訳で簡単な部屋と開始イベントを作成。
・暗黒空間
・見知らぬ部屋
・廊下1
の3つのマップを作成しました。
暗黒空間は開幕のイベントで使う部屋です。
こんな感じですぐにイベントで見知らぬ部屋に飛びます。
自動実行のイベントはセルフスイッチで解除するのを忘れずに。
こちらが見知らぬ部屋なんですが、
新規マップで「タイルセット」を"近代化内装"にして、適当に作りました。
小物を調べたら適当にメッセージが出るようにしています。↓
ここで注意なのですが、
EVページの左下の「プライオリティ」を"通常キャラと同じ"にしなければ、
プレイ時に調べてもイベントが起きないので気を付けてください。
鍵を作る!
脱出ゲームの基本となるのが、
・鍵を手に入れること
・鍵を使って扉を開くこと
の2つですよね。
それを実装していきたいと思います。
ちなみに、自動でアイテムを使うのではなく、
特定の場面でアイテムを使うと効果が発揮するようにします。
具体的に言うと、
「鍵を持っている状態で扉を調べると勝手に鍵が開く」のではなく、
「扉の前でメニュー画面から鍵を使うと鍵が開く」ようにします。
こっちの方が難易度が上がりそうなので。
まずはデータベースを開き、アイテム欄を表示したら、
初期設定にある"ポーション"を"見知らぬ鍵"に変更します。
そしてアイテムの使用効果を変更するのですが、
ここで、"コモンイベント"なるものを使います。
コモンイベントとは?
一連の動きをまとめたものです。
色々な場面で繰り返し使うものをコモンイベントとして登録することで、
かなり楽が出来ます。データベースから作成します。
今回は2つのコモンイベントを作成します。
1つ目は、場所チェック。
プレイヤーの現在地を変数に代入します。
イベントの「変数の操作」を選び、
「オペラント」の"ゲームデータ"から、
・マップID
・プレイヤーのマップX
・プレイヤーのマップY
・プレイヤーの向き
以上の4つを変数に代入するコモンイベントを作成します。
変数は数値などを入れておく箱です。
直接データを参照できれば楽なんですが、
それができないので変数に入れておき、あとで参照します。
2つ目は、鍵の処理。
さっき作った"場所チェック"を呼び出し現在地を取得したら、
そこが扉の前かどうかを条件分岐で判定します。
条件は、面倒臭かったのでスクリプトで書きました。
$gameVariables.value(1)==1 &&
$gameVariables.value(2)==14 &&
$gameVariables.value(3)==4 &&
$gameVariables.value(4)==6
ここで、$gameVariables.valueは変数を意味しているのですが、
どうしてこれが変数を意味しているか分かったかと言うと、ググりました。
「RPGツクール スクリプト」とかでググれば大体でます。
そして扉の前だったら、鍵を消滅させてスイッチをONにします。
あとは、適当な場所にイベントを作って「アイテムの増減」から鍵が手に入るようにし、
スイッチがONになったら場所移動できるイベントを作ってやれば終わりです。
ついでに、データベースのシステム欄にある「効果音」から、
アイテム使用サウンドを"なし"にしておきました。うるさかったので。
また、「メニューコマンド」からスキルや装備を非表示にしときました。使わないので。
メニューのレベル、HP、MP、職業の非表示
最後に、このゲームに戦闘なんてないので、
必要ないUIを非表示にしたいと思います。
そこで、最新機能のプラグインを作ってみました。
NoStatusMenuScreen.js
(function() { Window_Base.prototype.drawActorLevel = function() {} Window_Base.prototype.drawActorClass = function() {} Window_Base.prototype.drawActorHp = function() {} Window_Base.prototype.drawActorMp = function() {} })();
メニューで各種パラメータを表示する関数を空にしただけです。
もしかしたら後々バグるかも…。(そしたら報告しますね)
これを適当なエディタ(僕はSublime)でjavaScriptとして保存し、
ツクールエディタのメニューにある「ゲーム」→「フォルダを開く」
でフォルダを開いたら、「js」→「plugins」の中に入れます。
そしたら今度はツクールエディタのプラグイン管理(パズルピースのマークorツールから)
を開き、イベントと同じようにダブルクリックしてプラグインを設定して終わりです。
こんな感じで、脱出ゲームを目指して作っていきます。
それでは、また。
挑戦!RPGツクールMV【1日目】
というわけで、
今日からRPGツクールの勉強を始めていきます。
今日からと言っても、毎日更新ではなく、
触った度に更新していきます。(予防線)
まずはググって参考資料を集める!
割とこれやるだけで時間潰れますね。
さらにじっくり読み解くとなると、普通に1日使いますね。
以下、参考サイト
一見さんによる一見さんのための「RPGツクールMV」入門。スマホゲームも作れるようになったお手軽ゲーム作成ツールをプラグインで拡張しよう - 4Gamer.net
RPGツクールVX Ace
RPGツクールでRPGの作り方を解説してみた!!!1 ‐ ニコニコ動画:GINZA
手始めには、上記三番目のリンクのぬどんさんが解説してる動画を
見るといいと思います。自分も何か作れそうって気になります。(小並)
では早速触ってみよう!
とりあえず今日は、よくある母親に起こされて家から出るところまで
シーンを作りたいと思います。
まず、左上のファイルから新規プロジェクトを作成します。
プロジェクト名はそのまま、タイトルはTestにしときます。
次に、デフォルトで配置されているフィールドやキャラを
全部消しました。
右クリックから削除か、左クリックからのDeleteです。
続いて、左下のプロジェクト(Test)を右クリックしてロードを押します。
普通の町を作成したらさらにそれを右クリックし、民家をロードします。
民家の名前は自分の家に変更しました。
そしたら今度は、プレイヤーキャラクターを作ります。
右上にあるキャラクター生成を押します。
すると、こんな画面が出てきます。↓
色々いじって気に入ったキャラが出来たら、
とりあえず設定の保存を押します。
保存場所は適当にフォルダを作ってその中に入れときました。
続いて、
・顔グラフィック
・歩行キャラ
・倒れキャラ(これはいらないかも)
・戦闘キャラ
をクリックしたらエクスポートを押して保存してやります。
それができたら、キャラ生成画面を閉じて、
エディタの上のツールからデータベースを開きます。
デフォルトでアクターが選択されているので、
下の方の最大数の変更で1に設定し、
キャラクターの名前や画像を変更していきます。
画像はダブルクリックするとメニューが開き、
アルファベット順で画像が並んでいるので、
先ほど作った画像を選択していきます。
装備やスキルと言った詳細設定はデフォルトにしときました。
さて、自分の家をクリックしてマップを開いたら、
プレイヤーキャラクターを置きます。
エディタのメニューから編集モードをイベントに切り替えて、
適当なマスを右クリックして初期位置の設定→プレイヤーを押します。
次にイベントを設置していきます。
適当なマスをダブルクリックすると、イベント設定が出来ます。
左下の画像をダブルクリックして母親っぽいのを選択したら、
トリガーを自動実行にし、実行内容を書いていきます。
実行内容はダブルクリックするとメニューがでるので、
好きなように編集していきます。
場所移動とイベントの移動を間違えない様に。
また、移動アニメーションを設定したいなら移動ルートの設定でできます。
トリガーが自動実行だと、
フラグを変えて新しいEV(イベント)ページに移らなければ、
永遠とループしてしまいます。
実行内容の最後にセルフスイッチをONにし、EVページ作成から
新しいページを作り、セルフスイッチにチェックを入れます。
これで、ゲームをスタートすると母親との会話イベントが発生し、
その後動けるようになります。
次に家から町へ出る移動判定を置いてやります。
先ほどと同じように家の入口をダブルクリックし、
実行内容に場所移動を設定してやり、とりあえず今日は終了です。
youtu.be
開幕おすすめ武器&防具
武器
片手剣の初期武器であるベルダーソードをレベル3まで上げると、
フロストエッジ(攻撃90氷24)に派生できる。
威力、属性値ともに高く、
氷結晶、ベアライト鉱石、キレアジで強化できるので楽。
氷結晶は雪山で採掘、ベアライト鉱石は孤島で採掘、
キレアジは中くらいの大きさで黄色っぽい魚を釣る。(古代林エリア3で釣った)
続いて、鉱石を使って鉄刀を生産し、レベルを上げていくと
斬破刀(攻撃80雷25)に派生できる。
マカライト鉱石、大地の結晶、電気袋で強化できるのでこちらも楽。
電気袋はフルフルから、鉱石はどこでも。
火属性武器は適当にイャンクック素材の武器を作成しておき、
後のレウス武器またはディノパルド武器まで繋ぐのが吉。
水属性はオーダーレイピアが強い。(素材忘れた)
確か鉱石系の双剣から派生したはず。
ただし、タマミツネの双剣の方が強くなるので、強化はそこそこに
タマミツネに移行したほうがよさげ。
龍は後に狩れるごアマガラから作るといいと思う。
防具
頭、胴、腰をジャギィ
腕、足をファンゴにすると、
攻撃力アップ【中】が発動する。
最初はこの装備で良さそう。
レウス一式で攻撃力アップ【小】と
弱点特攻が発動する。
上記の装備の後はレウス一式を目指すといいかも。