藤川帳

Studio F#の音楽とか吉里吉里とか担当の藤川ヒロヒコのブログ。
<< July 2017 | 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 27 28 29 30 31 >>
 
Windows用寄宿舎サスペンスADV『渡り鳥の門は遠く sing again』
Windows用ダーク恋愛ノベルゲーム『シュガードロップ・ブレイクアウト SpecialEdition』
NoMode Web
天使の証 - Studio F# GameExtra
RECOMMEND
駅の近くの公園で
駅の近くの公園で (JUGEMレビュー »)
NoMode,藤川ヒロヒコ
12曲入り藤川ヒロヒコボーカルワークスアルバム。
ARCHIVES
MOBILE
qrcode
みんなのブログポータル JUGEM
SPONSORED LINKS
 
スポンサーサイト

一定期間更新がないため広告を表示しています

- | | - | - | pookmark
配列でデータを整頓する

前回(だいぶ前回ですが)は吉里吉里にデータを覚えさせておく「変数」について述べました。変数を使いこなせるようになると、例えばゲームにキャラクター好感度を導入できたりして、なかなか面白いことになります。

ところで、変数を使っていると、ときどき同じようなデータを扱う必要が出てくることがあります。例えばシューティングゲームなんかだとハイスコア一覧画面があったりしますが、「1回目の点数」「2回目の点数」「3回目の点数」などの区別はあるにせよ、点数であるという点では同じ種類のデータであるといえます。

このようなデータを、まったく別の変数に代入してはいけないのかというと、別にそんなこともありません。しかしそのようにしていると、変数を使った何かの操作──例えば点数を高い順に並べ替えるとか──をする場合には、とんでもなく手間をかけなければならなくなってしまいます。そこで、このようなデータを扱うときは「配列」という「変数の入れ物」を使います。

実際の書き方を紹介する前に、配列というものを軽くイメージしてみることにします。

普通の変数は、コップに似ています。ただしどのコップも外見が同じなので、使うときにはいちいちラベルを付けないといけません(変数の宣言とは、このラベルを貼る作業に似ています)。

それに対して配列は、ひとつの大きな細長いケースです。ケースの中を見てみると、四角く仕切られた部屋が一列に並んでいて、そこにひとつずつコップが紐付きで収められています。この中に入っているコップは、ケースから切り離して使うことができないかわりに、いちいちラベルを貼らなくても使えます。なぜなら、「このケースの何番目に収められているコップである」と考えるようにすれば、他のコップと区別することができるからです。ただし、ケースにはラベルを貼らないといけません(配列を宣言する、といいます)。

なんとなく配列なるものがイメージできたでしょうか。それではプログラムの例を示します。まずは「scores」という名前の配列の宣言は:

var scores = [];

と書きます。配列の宣言の仕方は二種類ほどあって、こちらではない方が正式なんですけど、藤川は面倒なので大抵こっちで書いてしまいます(正式の方はオブジェクトの話が出てきてからあらためて紹介します)。

宣言が終わったらいよいよ値を格納していくわけですが、これは次のように書きます:

scores[0] = 10000;
scores[1] = 15000;
scores[2] = 5000;

普通の変数と少し書き方がことなりますが、それにさえ気を付ければ普通の変数と同じように代入することができます。また、最初から入る値が決まっている場合は、配列を宣言するときに:
var scores = [10000, 15000, 5000];

というように書くこともできます。

ここで配列関連の用語を紹介しておきましょう。配列に格納されている変数のことは「要素」といい、配列に入っている要素の個数を「要素数」といいます。要素の番号のことは「添字」といいます(上の例でいうとscores[0]やscores[1]の0とか1とか)。

配列を使う上で注意しなければならないことがひとつだけあります。それが添字の開始番号です。TJSを含むほとんどのプログラミング言語では、添字は0から始まります(1から始まる言語も稀にあります)。最初の要素を「0番目」とするのは、日常感覚からするとちょっと把握しづらいので、注意したいところです。これについては、添字の意味を「最初の要素から○個目」と覚えるようにしておくと、少しはマシかもしれません。

今回はここまでにして、次回は配列を使う醍醐味を見ていきたいと思います(いつになるやら)。

変数を使ってみよう

そろそろ実際的な内容に入っていくことにしましょう。用例をまじえつつ綴っていくので、気が向いたら制作中のゲームに活かしちゃってください。

さて、最初はプログラミングの基本中の基本。変数について述べていきます。

変数とは何か、ということを簡潔に表現すると、「データの一時的な容器」です。

私たちの身の回りにある容器には、大きなものから小さなものまで、様々なものがあります。コップや茶碗も容器ですが、冷蔵庫や食器棚も容器であると言えないこともありません。それどころか、あなたが今居る部屋や、倉庫やビルといった建築物、自動車や電車といった乗り物も、ものすごく極端に解釈すれば、容器の一形態です。

変数にも色々な種類がありますが、普通、単に「変数」といった場合は、コップや茶碗のような比較的小さい容器を指します。つまり、ひとつの変数にはあまり大きなデータを入れられません。その代わり、TJSにおいては、どんなデータを変数に入れてもあまり問題は生じません。数でもいいし、文字列でもいいし、グラフィックでもいいし、とにかくかなり色々なものを入れることが出来ます。変「数」なのに文字が入るの? と、不思議に思うかもしれませんが、そのことについてはいずれ機会があったら触れてみたいと思います。

変数はKAGシステムだけでゲームを作る時にも、よく使われます。例えば、主人公の名前をプレイヤーに入力してもらう場合、f.charnameというような変数を用意して、[edit]タグで作ったフォームに入力してもらった内容を入れておく、というようなことをします。こういう使い方は本家のKAGリファレンスで解説されていますので、是非参考にしてください。

ところで、普通、ゲームには主人公以外の人物も数人〜多人数登場しますね。既に実践されている方もいらっしゃるかもしれませんが、彼らの名前を変数に入れておいて、シナリオからはそれを呼び出す、ということをすると、作業が効率的になる場合があります。

ひとつ例を挙げてみましょう。主人公の他に、二人の登場人物が居るものとします。彼らの名前をあらかじめ変数に入れておいて、シナリオでは彼らの名前を直接呼び出すのではなく、[emb]タグで埋め込む、という作業を想定します。

まず、first.ksなど、ゲーム起動時に最初の方で読み込まれるファイルに、次のように記述します:

[iscript]
var hito1 = 'ルート';
var hito2 = 'ウィル';
[endscript]
次に、どこかシナリオファイルの会話シーンなどで、次のように記述します:
[emb exp="hito1"]:なあ、ちょっと買い物に行かないか?[l]
すると、ゲーム画面には「ルート:なあ、ちょっと買い物に行かないか?」というように表示されます。人名を変数に入れておいて[emb]タグで呼び出せるようにしておくと何が便利かというと、制作も大詰めに来た時に急に設定が変更されて名前が変わってしまったときに迅速に対処できるとか、登場人物の名前をランダムに設定したりとか、クリア後は全登場人物の名前を設定できるようにしたりとか、記述次第で色々とつぶしが効く……かもしれません(笑)。

さて。

[iscript]タグと[endscript]タグはシナリオファイル(.ksファイル)の中でTJSを記述する時に使うタグの一種で、吉里吉里は、この二つのタグに挟まれた行を、KAGタグではなくTJSのプログラムとして解釈・実行します。

上のTJS文を日本語に翻訳すると、「hito1という名前の変数を用意して、そこにはルートという文字列を入れておく。」「hito2という名前の変数を用意して、そこにはウィルという文字列をいれておく。」という意味になります。分解すると、

  • var ……「という名前の変数を用意して」
  • hito1 ……(変数の名前)
  • = ……「を入れておく」
  • 'ルート' ……「ルートという文字列」
  • ; ……「。」
となります。何やら日本語とは随分語順が違いますね。まあ、人間がしゃべる言葉でも日本語と英語では随分と語順が違いますし、残念ながらここは素直に納得するしかありません。日本語と英語で語順が違うのは文法が異なるからですが、プログラミング言語においても、語順や記述方法を規定する規則を文法といいます。プログラミング言語の習得とは、その言語に特有の文法を習得することである、と言っても過言ではありません。

上の例文にも、早速TJS文法で最も重要な規則が現れています。箇条書きにすると、

  1. プログラムは、必ず半角英数字で記述しなければならない。ただし変数の名前には全角文字を使っても良い(ちなみに変数の名前のことを識別子といいますが、まあ覚えなくても問題ありません)。
  2. 変数を使う時は、必ず「var」という単語を使って、あらかじめ明示的に用意しなければならない(これを「変数を宣言する」といいます。また、このような特別な働きをする単語のことを予約語と言いますが、これまた覚えなくても問題ありません)。
  3. 変数にデータを入れるときは、「=」を使って、「変数の名前 = データ」というようにする(これを「変数に値を代入する」といいます。これは覚えておきましょう)。
  4. 変数に文字列を入れるときは、半角だろうと全角だろうと、必ず「'」か「"」で囲まなければならない。
  5. 文は、必ず「;」で終わらなければならない(日本語の文章が「。」で終わるようなものですね)。
といったところです。こういったことはTJSを書いていくうちに自然と身に付くことですが、どこかにメモしておいても良いかもしれません。特に、「変数を使う時は明示的に用意する」という規則は、案外忘れやすいので、気を付けてくださいね。

ちなみに、「f.param」や「sf.param」、「tf.param」といった、f.やsf.、tf.が頭につく変数は、KAGシステムが面倒を見てくれるため、明示的に用意しなくてもエラーにはなりません。また、これらの変数は、.tfを除いて、KAGシステムが自動的に栞などにセーブしてくれます。ただ、大きいデータになると動作速度やセーブデータの大きさなどに影響する場合もありますし、また後々説明する特殊なデータにはKAGシステムが完全に面倒をみてくれないものもあります。

状況に応じて変数を使い分けるのが、TJSプログラマの第一歩と言えるかもしれません。

KAGシステムはTJSの集合体

さて、第二回は「TJSを使うと吉里吉里で何ができるのか?」について、眺めていきましょう。

とはいっても、吉里吉里そのものを話の中心に持ってくると、とても話に収拾がつかなくなってしまいます。吉里吉里の開発者であるW.Dee氏は、吉里吉里について「TJSで何かをするためのソフト」と話しています。つまり、TJSを使うと、何でもとは言いませんが、それに近いくらい色々なことを実現できるのです。

そこで、ここではKAGシステムに範囲を限定して話を進めることにします。

ところで、KAGシステムとは何なのか、ここでおさらいしておきましょう。

KAGシステムというのは「吉里吉里アドベンチャーゲームシステム」の略で、その名の通りアドベンチャーゲームやそれに類するゲームを作るのに特化したシステムです。絵や音楽、シナリオといった素材を準備し、それらをKAGシステムに用意されているタグを使用して記述されたシナリオファイルである「KAGスクリプト」にまとめることで、比較的簡単にアドベンチャーゲームやノベルゲームを作ることの出来る、素晴らしいシステムです。

先程「吉里吉里はTJSを使って何かをするためのソフト」であるということばが出てきました。吉里吉里プラグインと呼ばれる小さなプログラムを使って機能を追加したり、Windowsの機能を使ってムービーの再生を行ったりといったことも出来ますが、基本的に吉里吉里はTJS以外で記述されたプログラムを動かすことは出来ません。

あれ? それでは、KAGスクリプトの実行は、一体誰がやっているんでしょうか? わかりやすい答えとしては「TJSを通じて吉里吉里がやっている」といったところです。

KAGシステムは吉里吉里で動かすために、TJSで記述されています。言ってみれば、KAGシステムは、TJSで記述された吉里吉里アプリケーションであるといえます。

これはちょうど、WindowsなどのOSと、C++などのプログラミング言語、そしてWordやExcelといったWindowsアプリケーションの関係と同じです。ほとんどのWindowsユーザーはWindowsそのものを使うのではなく、そこで動いているアプリケーション、例えばエクスプローラを使ってファイルの整理をしたり、Wordで文章を書いたり、Excelで表を作ったりしますね。

同じように、KAGシステムを使用するゲーム制作者も、吉里吉里の存在を意識せずに、KAGシステムを使ってゲームを作っている(=KAGスクリプトを作っている)わけです。そのようにして作られたゲームのプレイヤーも、もちろん吉里吉里の存在を意識することはほとんどないでしょう。紙にプリントアウトされた書類を見た課長さんが、「これ、Wordで作ったの?」などと気にすることがないのと同じです。

WordやExcelなどのWindowsアプリケーションと、吉里吉里アプリケーションであるKAGシステムとの共通点は上に述べたようなことですが、違うところももちろんたくさんあります。その最たるものは、KAGシステムを形作っているTJSを使用して、ゲーム制作者が吉里吉里そのものを制御できるということです(ウィンドウを改造したり、ダイアログを制御したり、レイヤを自由に操作したり etc.)。さらにいえば、KAGシステムを改造することだって、簡単に出来てしまいます。

もちろん、そこまで使いこなすには、ある程度の勉強が必要です。でも、「KAGスクリプトで書くと、なんだかめんどくさいなぁ」という処理を、TJSでスマートに記述することくらいなら、2〜3日で出来るようになるでしょう(多分)。

はじめに

一部でご要望があったのと、何よりも更新のネタがないので、ここらでインチキTJS入門を始めてみることにします。不定期です。藤川の気分で記事が追加されるので、TJSプログラマを目指すあなたは、多分自分であれこれ試してみた方が上達が早そうですが(笑)、そうもいかない方は、どうぞ気長におつきあいください。

さて、はじめに、ということで。このシリーズのおおまかな構想をここに書いておきますね。

最初に「プログラミングとは何ぞや」というところから始まります。これは、この記事の後ろの方に載っけてますので、読んでやってください。次回は「じゃあTJSを使うと、吉里吉里で何ができるのさ?」というところを書きます。

その後いよいよ講座っぽい記事が始まるわけですが、最初のうちは「プログラミングの基礎知識」として、変数がどーとか、条件分岐がどーとか、わりとかったるい話題になります。まあ、この辺を知らないとにっちもさっちも行きませんので、どうぞ我慢して読んでください。それが済んだら「実践!? KAGにTJSを絡めよう」というような話になります。

その後はまだ未定ですが、オブジェクト指向プログラミングを経由して、KAGプラグインの作り方だとか、「いまここで明かされる『メルクリウスの青い砂』の舞台裏!」なんていう記事もやってみたいですね(まず本編作れよ)。まあ、構想としてはおおよそこんな感じです。

ということで、第一回の話題。プログラミングとは、何ぞや。

プログラミングを勉強する人が陥りやすいのが、プログラミング言語さえ習得すれば何とかなる、という勘違いです。実は藤川もそうでした。これが、実はプログラミング言語だけ覚えても仕方がなかったりします。なぜなら、プログラミング言語はその名の通り、まさにプログラムを組むための言葉に過ぎないからです。

今、あなたがこうしてこの記事を読めるのは、学校で国語を勉強したからですね。また、私がこうやってカタカタと記事を書けるのも、やっぱり国語を勉強したからです。では、国語の勉強とは何だったでしょう? 文字や単語を覚えただけでしたか? 違いますね。文章の書き方や、それによってものごとを表現する、あるいは逆に文章を読んで内容を理解する、ということを勉強したはずです。

この意味で、プログラミングの勉強は国語ととてもよく似ています。言葉(命令)を覚え、文章の書き方(文法)を習い、ものごとの表現(動作の記述)を行うわけです。そうして書き上がったプログラムは、小説やコラムと同じ、ひとつの創作品であると言えるのです。

プログラミングに何となく理系のイメージがあるのは、コンピュータがもともと数学と深い関係にあるからです。もともと数学的な研究の成果として生み出されたコンピュータは、その動作を制御するにも、数学的な知識がある程度は必要とされてきた経緯があります。今でも、難しいプログラム、例えば吉里吉里のようなソフトを作ろうと思ったら、膨大な数学的知識が必要となります。

しかし、TJSでちょっとしたものを作るくらいなら、実はあまりそういう知識は必要ありません。必要なのは「これをこうして、次にこうして、最終的にこういう結果を出して、それによってゲームをこう進展させる」というように、プロセスを明確にイメージすることです。言い換えれば、自分の思考回路を、プログラムという作品を通じて、コンピュータに教えてやる。それが、プログラミングという作業なのです。

とはいっても、まずは言葉の書き方を知らないと話になりません。国語でも一番初めにやることは「あいうえお」の書き方からでした。プログラミング言語だって、やっぱりそうです。でも、基礎さえしっかりしていれば、もうどんなものだって作れてしまいます。

さあ、それでは張り切っていきましょう。

(藤川も制作&更新を頑張りますので……見捨てないでくださいです (^^;)