緊急企画DirectXを使おうの巻・その2
前回HSPによるDirectXの使い方をザッと紹介しましたが、大事な部分をまだ説明していませんでした。そう、スプライトの使い方です。DirectXを使って実際にプログラムを組んだことがないと「画像をコピーするだけなのに何でそんな機能があるの?」とか「使い分けがわからない」などと思うことでしょう。ちなみに筆者もスプライトの使い方まで覚えるのが面倒で「コピー命令(es_copy)で代用すればいいや」と思ったことがありますが、実はes_copy命令ではゲームを作る際に不便な点があるのです。
それは何かというと、「クリッピングの関係でコピーする画像が画面外にはみ出す場合表示されずに消滅する」んですね(HSPDXFIXでは直っています)。意味が分からない人は、HSPに付属のサンプル「test1.as」を下の表を参考にいじって確認してください。ちなみにクリッピングというのはグラフィックの描画が画面外に及ぶときに、その部分を描画しないことを言います。
行数 | 元のスクリプト | 変更内容 |
53 | es_set 0,myx,myy,0 | gmode 1,64,64 |
64 | es_pos 0,myx,myy | pos myx,myy |
68 | (空行) | es_copy 0,64,64 |
変更したら、そのままキャラクタを左右か上の端へと移動させてください。・・・消えたでしょ? これではゲームを作るには致命的なものがありますので、スプライトを使う必要があるわけですね。
●スプライトを使おう
というわけで、スプライトの使い方です。
以上が簡単な使い方です。
●もっと使いたい!
えー正直な話これだけだったらes_copy命令のクリッピングを改善すればそっちの方が簡単なので意味ありません。HSPには1フレームごとにスプライトを直線移動させる処理というものがありまして、シューティングゲームの敵弾のような単純なアルゴリズムの処理であればその命令を1回実行するだけで後はなにもしなくても勝手に動き、画面から消えたら勝手に消滅してくれます。これをうまく使えばスクリプトは小さくなりますし、よけいな処理を行わないぶん処理速度の向上にも一役買うことになります。現在は直線移動に限定されていますが、将来(ver
2.5?)は移動経路を設定することの可能になるとのことです。
この3つは結構重要です。覚えておきましょう。
ワラワラと敵を出現させたり、大量の弾幕を発生させたりといった処理をゲームでは要求させられます。そして、それらに使われるスプライトがいくつ必要なのかとか、何番のスプライトをあけておく必要があるかなどというのはプログラマの知るところではありません。必要になったときに未使用のスプライトに割り当てるのがもっとも普通なやり方だと思います。そんなわけで新しい敵や弾を発生させるたびに未使用のスプライトを検索してやる必要が出るわけですが、だからといってrepeat-loop命令などを駆使していちいち検索していたのでは、HSPの速度では厳しいものがあります。以上、ネタふり。
そこで登場するのが、「es_new p1,p2」です。ふつうは「es_new
a,0」とでもやっておいてes_setでa番のスプライトをセットします。p2が検索開始時のスプライト番号なので、たとえば「敵の弾は敵などよりも奥に表示したい」というときにはp2に大きな値(100とか)を入れておきます。
●アニメーションさせてみる
キャラクタを設定するときに4番目のパラメータに0以上の数値を入れると、そのパラメータのフレーム数だけ表示して次のキャラクタへと表示が移ることになります。これでアニメーションを自動的に行わせることができるわけです。
まず、当然のことながら必要な分だけアニメーションのパターンを用意しておきましょう。そしたら、次にそれらをキャラクタ登録するのですが、このとき連番で登録しないとアニメーションできません。たとえば、4コマのアニメーションを10,11,12,13番に登録するのはよいですが、10,12,17,21番のような登録の仕方ではアニメーションになりません(というか、バグッたようにみえる)。前にも書いたとおり、es_patの第4パラメータで表示させるフレーム数を指定します。
以下に、10番から13番までの4コマのアニメーションを行うプログラム例を示しますが、アニメーションの方法によって2通りの組み方になります。
アニメーションを繰り返す | アニメーションを繰り返さない |
es_pat 10,0,0,1 es_pat 11,32,0,1 es_pat 12,0,32,1 es_pat 13,32,32,1 es_link 13,10 |
es_pat 10,0,0,1 es_pat 11,32,0,1 es_pat 12,0,32,1 es_pat 13,32,32,0 |
ポイントは4コマ目のキャラクタを設定するところから後です。アニメーションを繰り返す場合は4コマ目にもフレーム数を指定し、最後に「es_link」という命令でアニメーションをつなぐことで繰り返しアニメーションを繰り返すことができるようになります。アニメーションを繰り返さない場合は最後のコマについてはフレーム数を0にすればアニメーションはそこでストップします。
勘のいい人は気づいたかもしれませんが、キャラクタ番号が不連続でもes_linkを使えばアニメーションを行うことができます。ただし、プログラムに無駄ができるのであまりおすすめできません。
以上でスプライトをある程度使うことができますが、実はまだやり残しがあります。そこで、次回は当たり判定についてや、実際の使用例をいろいろ載せたいと思います。いつになったら終わるやら。