私は普段は JavaScript でプログラミングする機会が多いのですが、連想配列(Dictionary)は好きでよく利用します。これと JSON (もしくは XML) 形式を併用したコードは、拡張性が高いのがメリットのひとつです。
プチコン4のマニュアルを眺めていたら、限定的ですが連想配列チックな命令を見つけたので、これから活用していきたいと思います。
SPVAR のすごさ
プチコン3号で、SPVAR という命令があり、驚かされたのを覚えています。
スプライト毎に持っている内部変数を設定・取得します。
1つのスプライトにつき、0~7までの8個の変数を持っています。
というもので、凄くないですか?ゲーム、特にシューティングゲームなどを作った経験があれば、この機能の利便性は理解できると思います。画面上を飛び交う敵機や、弾の全てが、簡易的でありますがオブジェクト指向言語のインスタンスのように、自身に関する値を格納しているわけです。
ただ変数を番号で管理するのが原始的なので、プチコン4では CONST 定数で管理しようかな… なんて思って調べてみたら、さすがはスマイルブームです、あっさりと進化していました!プチコン4では変数キーが以下のように拡張されています
スプライト変数の名前
・文字列または整数を名前として付ける事ができる
これって連想配列(Dictionary)的な拡張ではないですか!管理し易いですし、さりげなく上限の8個という制限も解除されています。素晴らしい!
JavaScript の言語でいう for (key in obj)
的な、既に設定されたキーの一覧が得られないのが残念ですが、そこは運用でカバーってやつで!
ちなみに同様に拡張されたものに、テキストスクリーンごとに変数を利用できる TVAR という命令もあります。それに対して BGMVAR という命令は従来どおり 0~7 の番号で変数を指定する、のが謎なところです。
具体的な使い方
例えば敵キャラをスプライトで動かす際、倒した時のスコア値とか、残り体力などを SPVAR でスプライトに関連付けて記録しておけば、敵の種類によらず処理を汎用化できます。自機の弾が命中したら、弾のほうのスプライトに保存されたダメージ値を、敵のスプライトに記録された残り体力から引いて、体力がマイナスになったら敵はやられて、スプライトに保存されたスコア値がスコアに加算される、みたいな。
敵キャラに自機の弾が命中した、は一般的なものですから、敵機ごとの差はスプライトに SPVAR で保存した値で管理しておく。そうすれば、その処理を抽象化できるわけです。
これまでも 0~7 の変数で実現はできていましたが、自由に定義できる名前方式のほうが拡張性がありますし、他人のロジックとの衝突も少なそうです。
SPFUNC と組み合わせると、スプライトで動作する対象は全て、オブジェクト指向的な抽象化されたプログラミングができそうですね。CALL SPRITE で一斉に呼び出して、大域変数で状況をみて固有の処理 (初期化やゲームオーバー時の後処理など) を実施すれば、かなり効率的な処理が書けそうです。
マルチプログラムに関して
プチコンには マルチプログラム の機能があり、各スロットで変数などは共有されません。
TVAR などはハードウェアに紐づいた変数なので、マルチプログラム環境での動作はどうなるかな?と試したところ、SPVAR 変数、TVAR 変数、共に各スロットで共有されているような動作でした。つまり、あるスロットで SPVAR, TVAR 変数をセットすると、他のスロットからでもその変数にアクセスできた、ということです。
これは便利な反面、このことを理解したスロットの使い方が必要になりそうです。
というわけで
前々回、前回 とバックグラウンド(BG)周りを試していましたが、今回は趣向を変えて、言語仕様について気になった点をまとめてみました。
ゲームを作りやすい方向に、地道に進化してるなぁ、と改めて感じました。さすがスマイルブームです。
ではまた!