前回の続きで、今回はとりあえず敵を表示してみましょう。
@Initialize
, @MainLoop
, @DrawLoop
, @Finalize
では、それぞれ初期化、処理、描画、後処理を行います。それではいってみましょう。
シューティングゲームに必要な要素は「敵」と「弾」です。今回はそのうちとりあえず「敵」を作ってみましょう。
敵を作るのに最低限必要な情報は、「表示位置」と「体力」と「当たり判定」です。さて、一体どこで指定すればいいのでしょうか? 前回言った話では、script_enemy_main
で敵の動作を記述すると言いました。ただ、script_enemy_main
の後の { }
の中に直接書くわけではなく、@Initialize
や @MainLoop
というのを書き、その後の { }
の中に書きます。
#東方弾幕風 #Title[敵のみスクリプト] #Text[敵のみスクリプト] #ScriptVersion[2] script_enemy_main { @Initialize { SetX(GetCenterX); SetY(GetClipMinY + 120); SetLife(2000); } @MainLoop { SetCollisionA(GetX, GetY, 24); SetCollisionB(GetX, GetY, 24); } }
@Initialize
に書かれた文は、スクリプトを実行する一番最初に実行されます。詳しい文法に関してはここでは省きますが、SetX
は敵の x 座標を、SetY
は敵の y 座標を、SetLife
は敵の体力を指定するものです。ここでは x 座標は画面中心(GetCenterX
)に、y 座標は一番上(GetClipMinY
)から 120 ピクセル下に設定しています。
@MainLoop
に書かれた文は、毎フレーム毎フレーム実行されます。当たり判定は毎フレーム毎に指定します。SetCollisionA
と SetCollisionB
には、それぞれ敵と弾、敵と自機の当たり判定を指定します。当たり判定は、中心位置と半径を使って指定します。ここでは当たり判定の中心を、敵の現在位置(GetX
, GetY
)にしています。普通これ以外を設定することはないでしょう。
では、実行してみましょう。...と、ここで気づく事があると思います。実行してみると、一見、敵がいないように見えます。ところが、弾を撃ってみると、一見何もない空間に弾が当たって、敵の体力が減っていくと思います。要するに、ここまでには敵のグラフィックを表示する部分が足りなかったわけです。
敵を表示するには、DrawGraphic
というものを使って次のようにします。
#東方弾幕風 #Title[敵のみスクリプト] #Text[敵のみスクリプト] #ScriptVersion[2] script_enemy_main { @Initialize { SetX(GetCenterX); SetY(GetClipMinY + 120); SetLife(2000); LoadGraphic("script\img\ExRumia.png"); SetTexture("script\img\ExRumia.png"); SetGraphicRect(0, 0, 63, 63); } @MainLoop { SetCollisionA(GetX, GetY, 24); SetCollisionB(GetX, GetY, 24); } @DrawLoop { DrawGraphic(GetX, GetY); } @Finalize { DeleteGraphic("script\img\ExRumia.png"); } }
色々と新しいものが増えました。先ず、グラフィックを描画する処理は @DrawLoop
というところに書きます。グラフィックを描画するには、DrawGraphic
というものを使います。DrawGraphic
には、グラフィックの描画位置を渡します。描画するグラフィックの中心が、指定した描画位置にくるように描画されます。
しかし、これだけではグラフィックを描画するには足りません。どんなグラフィックを描画するかが必要ですね。これには、SetTexture
というものを使います。SetTexture
には、th_dnh.exe の置いてあるフォルダからの相対パス(ファイルの位置)を使って、グラフィックファイルを指定します。ここではサンプルスクリプトで使われている Ex ルーミアの画像 "script\img\ExRumia.png"
を使っています。
パスの様に文字が沢山連なったものを文字列といいます。文字列は数値と違って直接書く事はできず、" "
で囲んで書きます。但し、#Title
のような #
が先頭につく命令においては、例外的に " "
を書きません。
そして、描画するグラフィックを指定するには SetTexture
を使うだけでは不十分です。そのグラフィックの中で、どの部分を表示するかも指定する必要があります。それが SetGraphicRect
です。表示する領域(長方形)の左、上、右、下の座標を指定します。
これでキャラを表示できるかと思いきや、まだこれだけでは表示されません。SetTexture
で表示されるグラフィックは、事前に読み込んでおく必要があるのです。SetTexture
はあくまでも読み込んだグラフィックのどれを使うか、を指定するものであり、SetTexture
はグラフィックを読み込まないのです。その読み込みという作業を行わなければ、グラフィックを表示することができないのです。
その読み込みには、LoadGrahpic
というものを使います。これは何度も実行する必要がないので、@Initialize
で使います。また、@Finalize
には敵を倒した後に実行される処理を書きますが、ここで DeleteGraphic
を使うことも推奨されています。このことに関する詳しい話については、ここでは割愛します。とりあえずそういうもんだと思って下さい。
では、以上のスクリプトを実行してみましょう。無事 Ex ルーミアが表示されたと思います。そして、ちゃんと Ex ルーミアに弾が当たって、ダメージを与える事ができると思います。
@Initialize
, @MainLoop
, @DrawLoop
, @Finalize
では、それぞれ初期化、処理、描画、後処理を行います。次回はいよいよ弾を表示してみましょう。