2008/9/25 木曜日

ゲームを作ってみよう 〜その6〜

第6回『外部ファイルを読み込ませてみよう』

duplex今回はバウンスショットの核となる外部ファイルの読み込みを書こうと思います。
さて、外部ファイルといっても無制限に読み込める分けでもありません。
FlashにはFlashの作法って物があります。

ってなわけですがその全てを知る必要は無いですし、そもそも知らん。でも、これを知っておけば役に立つって物を紹介しつつ使います。

第5回『ゲーム制作のためのツールを作る。・・・・いやじゃ!』CSVファイルを使うことにしたと書きましたが、そもそも、このCSVってなんでしょ?

CSVは Comma Separated Values の略でして、要は、カンマ( , )で区切られたデータファイルのことです。たとえば

2,345,6,123,5,3456,7、”ぼくドラざえもん”,1192

こんな感じでカンマ( , )で区切られたデータをひとつの単位として扱います。こういうもののデータ作成は簡単でして、MicroSoft Excel や OpenCalc 等で容易に作ることが出来ます。
ちなみにワシが使ってるのは OpenCalc。これはOpen Officeというフリーの統合オフィスソフト内の1アプリで、まぁExcelと似たような物だと思ってもらえれば結構です。
前回ちろっと書きましたね。

さて、本題に戻ってこのcsvファイル、どうやってFlash上に読み込むかと言うのが今回の趣旨でして、そのために使うのが

LoadVars

というクラスになります。このクラスがどんな物なのかを詳しくしりたければHELPを見てください、
ですがまぁ詳しく知るのはこのクラスを好きになってからで良いと思います。

ではテストプログラムを作りましょう。

先ず読み込むためのcsvファイルが必要です。本当はOpenCalcを使ってちゃんとしたデータを書きたい所ですが、最初は根本の基礎を知るのが大切ですよね。そんなわけでテキストエディッタ(Windowsであれば標準でメモ帳ってソフトが付いてきてます)を開いて、

1,2,3,4,5

と書き込んだ後に、data.csvと言うファイル名で保存すればcsvファイルの作成は終了です。簡単だね。

ではFlash側のスクリプト、今回はテストなので外部クラスは作らずに直接アクションフレームに書き込みます。

1:    var textCsv:LoadVars = new LoadVars;
2:    textCsv.onData = function(data){
3:        var itemList:Array = data.split(”,”);
4:        trace(itemList[3]);
5:    }
6:    textCsv.load(”data.csv”);

書き込みましたか?、コピペじゃ駄目よ。

このアクションスクリプトを書いたflaは先ほど作ったdata.csvと同じフォルダにおいてください。
それと当然ですがプログラムの最初にある「1:」等は行番号を意味してますので、そこまで書いて動かないとか言わないように。
ついでに、なぜ行番号を付けたかと書くと、説明しやすくするためと、コピペが出来ないように。
何といっても自分で書かないと、いや、ここでは打ち込まないとと書くべきですか。
なにはともあれ頭に叩き込むには手を動かすのが一番です。

さてパブリッシュしてみましょう、出力ウィンドウに4と出たら成功です。
失敗してる人は何かが間違ってるので、最初からよく読みなおして、自分が作ったものと、ここに書いてあるものを見比べましょう。

では説明と行きます。

1行目でtextCsvというLoadVarsクラスを生成しています。LoadVarsクラスとはどういう物かと書くと、・・・と思ったんですが一言じゃ表せないんでHELPを引用してみます。

LoadVars クラスを使用すると、データのロードが成功したかどうかを確認することや、ダウンロードの進行状況を監視できます。
loadVariables() 関数の代わりに LoadVars クラスを使用して、Flash アプリケーションとサーバーの間で変数を転送できます。

とまぁ、色々仕事してくれます、その上

具体的には、LoadVars クラスはオブジェクト内のすべての変数を指定の URL に送ったり、指定された URL にあるすべての変数をオブジェクトにロードしたりできます。
また、すべての変数ではなく特定の変数を送信することもできるので、アプリケーションの効率が向上します。
LoadVars.onLoad ハンドラを使用すると、(データがロードされる前ではなく) データがロードされるときにアプリケーションが実行されるようにすることができます。

こんな感じなんで、一言じゃ書けないんですな。でも誤解を恐れずに書けば外部データを読み込む時に使うでも嘘じゃ無いです。

さてそのLoadVarsを使って読み込むのが6行目。これは見て分かるとおりLoadVarsクラスのloadを使って先ほど作ったcsvファイルを読み込むとしています。

今度は行数を戻って2行目、ここは何かと書くと、6行目で指定したデータの読み込みが終了したら呼ばれる所になります。
しかし、読み込み命令より先にこんな命令を書いて大丈夫なんかいと心配になりませんか?。
ワシはなりました。

ですが、よくみればこいつはfunctionであって、その場で実行される物じゃ無く、呼ばれて初めて実行される物ってのがわかります。つまり6行目の命令が動き出して、終了すると2行目を呼び出すってわけです。

またこの書き順には意味がありまして、もしload命令を2行目より先に書いてた場合、時と場合によっては2行目の命令が生成される前にLoadが終了してしまう事があり、2行目が呼び出されない可能性があるそうなんです。
まどろっこしいですな。とは言え見過ごしやすい場所なんで注意です。

さて2行目~5行目にかけては、当然ロード終了後の話です。
まず2行目のfunction(data)に注目。
これはload命令が終了した時に呼ばれると何度も書いてますが、そのload命令が取得したものを、このdataってやつに入れ込んでくれてます。
当然取得したものは、data.csv、もっと書けば1,2,3,4,5と書かれた「文字データ」です。
当然ですが、数字も文字として取得するので注意です。

次に3行目、data.split(”,”)。splitってやつは文字データを指定のデータで区切って分けてくれる便利な命令です。
3行目では区切りったデータをArrayに返してます。
今回はカンマ「,」を指定しているので、1と2と3と4と5と言う5つの文字データを作り、順番に配列に入れています。
この区切りに使ったデータの(”、”)は区切ったデータには入りません。
要は1,と2,と3,と4,と5みたいなデータでは無いって事です。

4行目はもう分かりますな、単純に取り込んだデータをカンマで区切って、その4番目(0から数えるので)のデータを表示しろとしているだけです。
当然先にも書いたように4がでるわけです。

これで外部データの取り込みの基礎は終わりです。
とりあえず、data.csv側のデータを色々変えてみてどうなるか試してみると良いと思います。
重要なのは Flashは簡単にテキストファイルを読み込める の一点です。
知ってしまえば簡単ですな。

関連ページ

  1. 第1回『ゲーム製作の流れ、一から見せます』
  2. 第2回『企画内容を吟味しよう』
  3. 第3回『仕様を詰めておこう』
  4. 第4回『では、仕様書をまとめましょうか』
  5. 第5回『ゲーム制作のためのツールを作る。・・・・いやじゃ!』

ここまで出てきた資料




2008/9/21 日曜日

ゲームを作ってみよう 〜その5〜

第5回『ゲーム制作のためのツールを作る。・・・・いやじゃ!』

duplexなーんでツールを作るのが嫌いかと書きますと、ズバリ、ツールを作り始めるとそっちに満足して本体を作りたくなくなるから。
モチベーションの問題ですな。そんな奴が記事を書くなって?

そんな事いっちゃ駄目よ。
なにせ記事を書けるだけの手が空いてるのが、今はワシだけなのだから。世界七不思議の一つ、大人の事情ってやつっす。

さて、ツールを作るのは嫌、でもデータを打ち込むのも嫌、とワガママ言い放題では話が進みません。だったらやる事は一つ、既存のツールを使ってデータを打ち込める様に考えちゃおうって算段。そう、世はプログラム戦国時代、創世記の「何をやるにも自分で作る」という時代は終わっているのです。

普段は、とにかくワシ流のやり方(データフォーマット)で作らせてくれ!とワガママを言いますが、都合がいい時だけ既存のツールを使おうよ!ですよ。
そんな二枚舌でも無問題、こんな感じでやらないとIT砂漠では生きて行けないのです。楽をするためならプライドなんか捨てっちまえ。

さて、バウンスショットではステージのデータやら敵の種類やらを別ファイルにて作成することに決めたのは前回の通り。
これは前の記事で少し触れましたが、CSVと呼ばれるデータ形式だったら、わし以外でも簡単に作れるだろうとの思いでCSVを採用することにしました。
CSVはOpen Office に入っている OpenCalc * というExcelもどきで作ります。もちろん、Excelでも作れますよ。
(*もどきなんて書いてますが素晴らしい性能ですよ、フリーソフトと思えません。ぜひとも銀行とのやり取りにも、OpenCalcのデータでやり取り出来る様に対応して欲しいものです。しかも保存用にマクロを使うだけでExcelを使わなきゃならんとか嫌なんじゃい!)

外部に出すデータは何が必要なのかは第4回『では、仕様書をまとめましょうか』で書いています。忘れた人は戻って読んでこい。

ここでは実データの一つを公開しようと思います。

上のリンクで落とせるファイルはOpenCalc用のファイルで、こいつが敵データのcsvとなります。
OpenCalcはOpenofficeというフリーの統合オフィスソフト内の1アプリケーションです。持っていて損は無いので持っていない人はさっくりダウンロードしましょう。
ではenemu_data.odsは開けましたか?。これが今回のゲーム、バウンスショットに出てくる敵データとなります。
いろいろ書かれていますが、すべて使うかどうかは今は未定です。

しかしデータを外部に持つことにどんな意味があるのか、他人にデータを打ち込んでもらえるだけなのか?
いいえそんな事はありません、こう云ったデータを外部に持たせる事で、データを打ち込む人がプログラムのコンパイルを行わずにすみます。
コンパイルの時間ってのは思いの他かかる物で、速いマシーンならまだしも一昔前のやつだったりすると数十秒から数分かかる事があります。
何だ、たったその位なのかと思ってはいけません、何故なら僅か1行弄ってはコンパイル、1文字弄ってはコンパイル、下手をすりゃプログラムを書く時間よりもコンパイル時間の方が長い事すらあるのです。だからデータ類は外部でやるに越したことはありません。

そんな中、ならむらさんにデータを打ち込むのはどんなやり方が良いですかね?
と、尋ねたところ、「今までの様にソースファイルの配列に直接書くのが一番やりやすい」とお答えをいただきました。

畜生、ワシの野望、これまたロスト!
でもコートの中じゃ泣かない、だって・・・・今回はデータマンに0saeさんもいるんだから。いやっほぅっ、これで無駄にならずに済みそうだ。
それにしても女性でもデータマンって言うんですかね?、それともデータレディー?。まぁコ○ミマンレディーなんて居るくらいだから、データマンレディーと呼べば言いのでしょう、きっと。

最後になりますが、今回の記事で一番重要な「OpenCalcで作成したデータをcsvにする時の注意点」を書こうと思います。
先ず、このodsデータを名前を付けて保存してみましょう。
欲しいデータはcsvファイルなので、ファイルの種類はテキスト CSV(csv) を選びます。

設定によってはなにやらウィンドウが出てきますが、そこではOKを押して進んでください。
テキストのエクスポートダイアログが出るはずです。

ここで変更する場所は二箇所、先ずは文字列(c)ですが、こいつをUnicode(UTF-8)に変更する事。
そしてもう一つがテキストの区切り記号を初めは「”」ダブルクォーテーションに指定されているはずなので、こいつを消してください。deletキーで普通に消せます。選択しても何も使わないという選択肢は無いので注意です。
これでOKを押せば晴れてアクションスクリプトから呼び出せる形式になるわけです。

CSVの設定方法

要は保存する時は上のようになってれば良いんです。文字で書くと長々となるのに絵だと一発ですみますな。

次回はこうして出来上がったcsvファイルをどうやってスクリプトから読み込むのかをやりたいと思います。
まぁ果報は寝て待てってね。

関連ページ

  1. 第1回『ゲーム製作の流れ、一から見せます』
  2. 第2回『企画内容を吟味しよう』
  3. 第3回『仕様を詰めておこう』
  4. 第4回『では、仕様書をまとめましょうか』

ここまで出てきた資料





Copyright (C) Nigoro Allright Reserved. Powered by ASTERIZM