これ以上何を手を加える必要があるのかと思われるかもしれませんが、最後の仕上げにもう少し手を加えたいと思います。
LoadUserShotData
を使って読み込みます。それではいってみましょう。
さて、前回まででほとんど元スペルと変わりがないくらいの状態になったのですが、1点だけ相変わらず大幅に違う部分があります。それは、弾の画像です。一応大きさは近い弾を選んではいますが、あの銃弾型(え? 坐薬型?)の弾画像を使いたいところです。
ですが、東方弾幕風では銃弾型の弾画像は用意されていません。これには、新作で新しい弾が追加されるたびに無闇に仕様を拡張するのは良くないという考えがあるようです。そこで、代わりにスクリプト側で新しい弾画像を指定することができるようになっています。
先ずは画像が必要になります。画像はちょこちょこと作ってみました。
|
透明にしたい部分は真っ黒にしておきます。こういった画像の縦と横のピクセル数は、2 の累乗にした方が効率がいいようです。ここでは縦が 16( = 24)ピクセルで、横が 64( = 26)ピクセルになっています。
見れば分かると思いますが、1つの画像にいくつも弾の画像があります。そのため、この画像を弾にして扱う...ということではなく、この画像の一部分を1つの弾画像として扱うことになります。その情報は、スクリプトとは別のファイルとして作成しておく必要があります。
弾画像用の設定ファイルは、例えば次のようになります。
#UserShotData ShotImage = ".\img\shot_pellet.png" ShotData { id = 1 rect = (0, 0, 8, 16) } ShotData { id = 6 rect = (40, 0, 48, 16) }
順番に見ていきましょう。
先ず 1 行目には、#UserShotData
というものを書きます。これは、弾幕風スクリプトの先頭に #東方弾幕風
と書くのと同じようなことです。
次に、画像ファイルのパスを書きます。
弾画像用の設定ファイルは、例えば次のようになります。
ShotImage = ".\img\shot_pellet.png"
ShotImage
というものに、弾画像のパスを代入します。ここで、この設定ファイルでは文の最後にセミコロンは付けないことに気をつけてください。
そして、後は弾の情報を羅列していくだけです。弾の情報は ShotData
の後の { }
の中に書きます。弾の情報は弾ごとに書きます。
ShotData { id = 1 rect = (0, 0, 8, 16) }
id
というのは、弾の ID です。弾の種類を、今までは WHITE01
だとか BLUE11
だとか使っていました。自分で作った弾を使いたい場合は、その代わりに弾 ID を直接指定します。例えば、この弾を使いたい場合は
CreateShot01(x, y, v, angle, 1, delay);
のようにします。
rect
というのは、ShotImage
の画像のうち、どの部分をその弾の画像とするかを指定するものです。(0, 0, 8, 16)
とすれば、(0, 0) から (8, 16) までの画像が使われます。ここで注意することは、(8, 16) にあるピクセルは含まれないことです。(8, 16) の直前までが使われるのです。
|
さて、こうやって弾の設定を作っても、それだけでは使えるようになりません。弾設定を読み込む関数 LoadUserShotData
を使う必要があります。
というわけで、次のようにしてみると...
LoadUserShotData(".\shot_pellet.txt");
何と、弾が表示されません! 実は、.\
が有効になるのは #
で始まる命令の中や、弾設定ファイルでの ShotImage
に指定する時だけであって、普通の関数に渡すパスでは別の方法を使う必要があります。具体的には、次のようにします。
LoadUserShotData(GetCurrentScriptDirectory ~ "shot_pellet.txt");
この GetCurrentScriptDirectory
という関数は、現在のスクリプトのあるフォルダ(ディレクトリ)のパスを取得する関数です。そして、~
というのは、2つの文字列を連結する演算子です。つまり、こう書けば、現在のスクリプトのあるフォルダ内にある shot_pellet.txt というファイルのパスになるわけです。
独自の弾画像を使うように変更したプログラムをここに置いておきます。
スペルグラフィックを付けた完成品をここに置いておきます。ZIP 形式で圧縮されているので、解凍して script フォルダに放り込んで下さい。
オブジェクト弾を使えば、本当に色んなことができます。ここまでの知識を使えば、かなりの弾幕が作れると思います。まだまだいくつも話してない関数がありますが、その多くは今までの知識があれば理解できるものと思います。
この講座ではあらゆる関数の解説を行うつもりはありませんが、基本となる関数はできるだけ使うようにしています。例えば CreateShot02
は CreateShot01
を理解していれば使えると思いますし、CreateLaserA
を理解していれば CreateShotA
も使えると思います。一度ヘルプを読んでみて、一体どんなことができるのかを確認しておいて下さい。
LoadUserShotData
を使って読み込みます。次回はいよいよ使い魔付きの弾幕を作ってみたいと思います。