Dear!くろうどぃあ!

このブログでは、私、くろうどの趣味に関する事を記述します。
当面は、「RPGツクールMV」をメインにします。

ツクるためのプログラミング概論【2】プログラムの構造

2016-04-08 22:52:48 | RPGツクールMV
さてみなさん。

今回は、ツクるのに役立ちそうな、プログラミングの基礎知識を語る会の第2回です。


■目次(予定)
【1】コンピュータの構成
【2】プログラムの構造 (←今回)
【3】変数と関数
【4】オブジェクト指向
【5】ブラウザの仕組み


■本編
【2】プログラムの構造

今回解説するのは、RPGツクールMVでいうと、イベントコマンドの「フロー制御」と書かれている枠の部分です。

▼イベントコマンド(フロー制御)


上から「条件分岐」「ループ」「ループの中断」「イベント処理の中断」「コモンイベント」「ラベル」「ラベルジャンプ」「注釈」となっています。


●順次処理
「フロー制御」以外のイベントコマンドの大半を、ここでは「処理」と呼びます。

「処理」は記述した順に、上から下へ、実行されていきます。

※フローとは、流れの事ですので、上流から下流へ、水が流れるように実行されます。

▼順次処理



●条件分岐
「フロー制御」内に、「条件分岐」というものがあります。

RPGツクールMVの場合、他にも、「選択肢の表示(はい、いいえなどの入力)」などでも、分岐が発生しますが、条件が異なるだけで、構造上は同じです。

分岐に書かれた条件に従って、実行する処理が分かれます。

分岐には、範囲があり、その範囲内に、実行する処理を記述します。
(RPGツクールMVでは、「:分岐終了」と書かれている所までです)

注意点としては、条件を満たしていない場合には、その分岐の範囲内の処理は実行されないという点です。

なので、自分が実行させたい処理が、分岐の中に書くべきなのか、外に書くべきなのかは、要注意です。

また、「条件分岐」の中に、「条件分岐」を入れる事も出来ます。
これをやると、条件が複雑になるため、なるべく避けたい所ですが、場合によっては必要になります。

あと、RPGツクールMVでは、イベントの「ページ」も「条件分岐」の一種と考えてよいかと思われます。


ちなみに、Javaスクリプトでは、「if」と書く事で、この「条件分岐」を表します。
つまり、「もし、xxならば、◎◎する」という事を表現しているわけです。
プログラマが「if文(いふぶん)」と呼ぶのが、これの事です。

▼条件分岐



●繰り返し(ループ)
「フロー制御」内に、「ループ」というものがあります。

RPGツクールMVの場合、この「ループ」は、いわゆる「無限ループ」を作る事が出来ます。
(そのままでは、ゲームが進まなくなります)

ここで、「ループの中断」を「ループ」の範囲内に書くわけですが、「条件分岐」を合わせて使わないと、1回でループを抜けてしまうため、「ループ」を使う意味が無くなります。

RPGツクールMVでは、「はい」が入力されるまでループする……といった使い方が想定されます。
この場合、「選択肢の表示」による分岐(はい)の中に、「ループの中断」を書きます。


ちなみに、Javaスクリプトでは、「for」「while」「do while」のどれかを書く事で、ループを発生させる事が出来ます。
RPGツクールMVでは、ループからの脱出条件を書きますが、Javaスクリプトの場合、ループする条件を書きます。

▼ループ(ループする条件を書くパターン)



●構造化プログラミング
さて、「構造化プログラミング」と呼ばれる手法があります。

「順次処理」、「条件分岐」、「ループ」の3つの構造で、プログラミングする手法です。

この時、処理は、上から下へ、順に実行され、一番下に到達すると、終了です。
(ループは、上に戻りますが、1本の線として見る事が出来ます)

プログラミングの世界では、これが分かりやすいとされてきました。


RPGツクールMVの「フロー制御」には、「イベント処理の中断」や「ラベルジャンプ」といった制御方法もあります。

「ループ」を「ラベルジャンプ」を使って実装する事も出来ますし、好きな場所で「イベント処理の中断」をする事も出来ます。

ですが、特に「ラベルジャンプ」は、使い方次第では、イベントがどの順序で実行されるのか、分かりにくくなります。

「ラベルジャンプ」を使った方が分かりやすい場面もあるため、一概には言えませんが、Javaスクリプトには「ラベルジャンプ」に相当するコマンド(goto)が無いようですので、Javaスクリプトへのステップアップを目指す場合には、多用しない事をおススメします。


それでは~。

ツクるためのプログラミング概論【1】コンピュータの構成

2016-04-08 14:05:59 | RPGツクールMV
さてみなさん。

RPGツクールMVの公式サイトには、

『RPGツクールは、「プログラムを覚えないで簡単にゲームを作りたい」というユーザーの思いをかなえるために生まれた、簡単にオリジナルRPGを作ることができるソフトです。』

……と、書いてあります。

とは言え、イベントに記述する内容は、プログラミングの用語を置き換えたような物なので、プログラミングの知識があると、イベントにどう記述すればいいのか……が、分かりやすくなると思われます。

もっと言うと、自分の思う通りに動かない原因を見つけやすくなる……と思われます。

……というわけで、職業プログラマーになるわけではないけど、知っておくとツクるのに役立ちそうなプログラミングの知識をなるべく噛み砕いて書きたいと思います。


■目次(予定)
【1】コンピュータの構成
【2】プログラムの構造
【3】変数と関数
【4】オブジェクト指向
【5】ブラウザの仕組み


■本編
【1】コンピュータの構成

はじめに、コンピュータという物そのものについて、触れたいと思います。

ひと言で、コンピュータと言いますが、色んな部品を組み合わせて作られています。

パソコン(PC)やスマートフォンのカタログを見ると、CPUやメモリとか書かれているあれです。

大きく分類すると、5種類の装置に分けられます。
(専門学校で最初に習うような内容なのですが、せっかくなので書いておきます)

●中央処理装置
「CPU」と呼ばれているもので、プログラムの処理(いわゆる命令や計算)を行う物です。

例えて言うと、人間の頭脳(の物を考える部分)に相当し、プログラム(アプリケーションやゲーム)は、命令書です。


●主記憶装置
「メモリ」と呼ばれているもので、いわゆる「USBメモリ」とは別の物です。
この「メモリ」は、電源をオフにすると消えてしまうし、記憶できる容量も少ないのですが、代わりに、動作が速いのです。
そのため、「CPU」が処理するデータや結果をここに一時的に置く事になります。

よく例えられるのが、机の上(物を載せる部分)です。


●補助記憶装置
上記の「メモリ」は電源をオフにするとデータが消えてしまうので、それを保存しておくための装置です。
「USBメモリ」や「ハードディスクドライブ(HDD)」などが該当します。

さっきの例えを引き継ぐと、机の引き出し(収納スペース)ですかね。
(この場合、データは、紙のノートに書かれた内容などが相当します)


●入力装置
●出力装置
人間がコンピュータに対して、命令や情報を与える物が必要です。
「インタフェース」とかいうヤツですね。
「入力(インプット)」と「出力(アウトプット)」があります。

入力は、キーボードやマウス、タッチペン(指)が該当し、出力は、ディスプレイやプリンタ、スピーカーが該当します。
さっきまでの例えで言うと、鉛筆と紙のノートのような物です。


◆ちょっと難しい話

さて、RPGツクールMVで、メモリリークが起こる……のような話を聞いた事があるかもしれません。

これは、机の上の物を載せて、引き出しにしまわないで、載せ続けてしまい、机の上に物が載せられなくなって、仕事が出来なくなる……ような状態です。

Javaスクリプトでは、ガベージコレクション(GC)という仕組みで、自動で机の上を整理しているのですが、この整理するルールから外れたプログラミングをすると、いつまでも残ってしまい、このような事態を起こしてしまいます。


◆難しい話をもうひとつ

さて、「OS(オペレーティングシステム)」と呼ばれる物があります。

「Windows」とか、「Android」が、「OS」なのですが、何をするかというと、「アプリケーション(プログラム)」の管理です。
「アプリケーション」を「メモリ」に載せて「CPU」に処理させています。

メモリリークのような状況になった時に、「アプリケーション」を強制終了させたりもします。

この「アプリケーション」の作り方が「OS」によって異なるために、いわゆる「xx版のゲーム」という別物になってしまいます。

ですが、「HTML5」という規格のおかげで、同じ作り方であっても、「ブラウザ」で同じ動きが出来るようになりました。
(「ブラウザ」自体は、それぞれのOS版がありますが、「ブラウザ」向けの作り方は同じです)

こうして、RPGツクールMVでは、マルチプラットフォームが実現出来ているわけですね。


長くなりましたが、それでは~。

「スクリプト」を使ってみた

2016-04-02 23:41:20 | RPGツクールMV
さてみなさん。
お久しぶりです。

今回は、「スクリプト」という機能を使ってみたので、その紹介をします。


■テレポ

「テレポ」という魔法を作るにあたって、メニュー画面ではダンジョン脱出、戦闘中は戦闘強制終了(処理としては逃げる)……というように、1つのスキルで場面によって効果が変わる仕様にする事にしました。

もちろん、ダンジョン脱出スキルと、戦闘強制終了スキルを別個に作れば、今回の手間はかからなかったのですが、スキルの数を増やしたくないという個人的な思いによって、「テレポ」1個でやりたい……となりました。

さて、上記の「テレポ」の仕様では、「今が戦闘中かどうか」を判断する必要があります。

ですが、私の知る限り、条件分岐イベントでは「今が戦闘中かどうか」の判断が用意されていません。

そこで、今まで避けて来た「スクリプト」という項目を使ってみる事にしました。

難しい話をしますが、「スクリプト」を使うためには、Javaスクリプトを読む必要があります。
今回は、条件分岐で使用するので、戻り値が Boolean(true または false)になっているメソッドなどを見つければいい事になります。
私は、1から作る事は出来ないけれど、読む事は出来る人なので、調べた所、それっぽいモノを見つけました。
それが、コレです。

$gameParty.inBattle()



というわけで、コレを条件分岐の中の「スクリプト」に設定した所、「今が戦闘中かどうか」を判断する事が出来ました。


■全体ダメージの対象が1体の時に、ダメージを増やす(単全自動切替)

今回の自作品では、攻撃魔法はすべて敵全体が対象である……という仕様にしました。

敵全体が対象なので、ダメージは抑え気味に設定してあります。
(通常攻撃より少し強い程度)

ただ、コレって、雑魚が相手の時は、一掃するのに丁度いいのですが、ボスが単体で出現した時に、ダメージが低くて使い物にならない……という事になりかねません。

当初は、ボスだけ、属性倍率を増やして、弱点にとことん弱い仕様を考えていたのですが、なんかやりたい事と違う気がしたので、検討する事にしました。

というわけで、「敵全体が対象のダメージ効果を、敵1体しか居ない時に使うと、複数体の時よりもダメージが大きくなる」という仕様を実現出来るのか、検討する事になりました。
(私は、単全自動切替と呼んでます)

プラグインは使いたくなかったので、計算式です。

そうして、調査の結果、生存している敵キャラの配列とおぼしきモノを見つけたので、以下のように計算式を設定してみました。

($gameTroop.aliveMembers().length >= 2 ? 450 : 900) + a.mat * 3 - b.mdf * 3



コレの 450 が全体用で、900 が、単体用の固定値です。
「?:」は、三項演算子と呼ばれるもので、if文と同じ事がこの書き方でも出来ますよ~っていうモノです。

ちなみに、この「$gameTroop.aliveMembers().length」を使えば、前回の投稿にある、敵キャラの数をカウントするコモンイベントが、この1行で済んでしまいます。

……うわー……あの手間が1行になるなんて~……、これからは、「スクリプト」も使っていこうっと。

といった所で、それでは~。