- 拡張ライブラリの使い方
- 1.教本: カエル跳びゲーム(Frogger風)
- 2.拡張ライブラリー・アルゴリズム
- 3.拡張ライブラリ・テンプレート
教本: カエル跳びゲーム(Frogger風)
sir_mud さんの作品です。
この教本では、拡張ライブラリーを使うと、単純なゲームを、簡単に、きわめて速く作ることができることを、示します。
この教本は、FreeBASIC 言語の実用的知識を持っている人を対象としています。
このゲームは、ライブラリーが提供する機能の、ごく一部分を使っているだけです。
拡張ライブラリーを使ってコードを書くと、プログラム・コードを作る全過程が、より速くより簡単になり、その過程での面倒が、なくなります。
画像をロードして操作するために、画一的で詳細なコードをたくさん書く必要はありません。
拡張ライブラリーは、高品質で信頼できる関数およびクラスを、提供します。
ここで、
完全なソース・コードと画像[frogger.zip 8kb]をダウンロードできます。さあ飛び込んでみましょう。
上のコードで、描画モジュールのいくつかの部分を含めています。
スプライト・クラス、
操作モジュール、
BMPファイル・ローダーと、付属の色定義です。
さらに、ext に、オプションを設定しました。
一番目は、コンパイル時間を速くするために使われます。私たちは、提供されるコンテナー・クラスのどれも使わないからです。
二番目は、これは小さな例で、依存状態を最小にしておきたかったので、使用されます。
他に利用できるオプションの一覧は、
ドキュメントの本文を参照ください。
ここで、これらを後でコントロールするために使う、いくつかのマジックナンバーを、定義します。
これらは、このゲームのスプライト(妖精)の全てを保持する変数です。
配列は、複数のインスタンスを持つオブジェクトのために使われます。
スプライト・クラスがすることの1つは、それ自体の位置を保持することです。
これは、描画だけでなく、衝突検出にも使われます。
そして、それが衝突発見ならびにスケッチのために使われます。
ここで、ヒーローのために使う画像をロードします。
画像をロードして、必要により、それを回転し、再着色する方法について、注意して下さい。
お分かりのように、自動車や丸太やスイレンの葉でも、同じことをします。
ここで、競技場の描画を設定します。そして、後で画面を描き直す必要がある時に、これを簡単に配置できるように、格納します。
最後の部分で、ゲームをループし始める前に、スイレンの葉が、適切な場所に表示されるように、位置を設定します。また、ヒーローがいつ勝ったか伝えることができるようにします。
更に知りたい場合は、下のリンクを参照ください!
より多くの情報
ext/Algorithms は、要素の範囲を操るための、いろいろな一般的なアルゴリズムを提供します。
要素は、記憶域に隣接して保管され、一般に、範囲の中の最初の要素へのポインターと、範囲の端を過ぎるポインターによって表示されます。
アルゴリズムは、これらが様々な種類(UDT オブジェクトでさえ)の要素の範囲で使えるという意味で、総括的です。アルゴリズムが操作する要素について、一般に、ある必要最小限の条件がありますが。
単純な例として、下のコードは、配列で、要素を再編成するために、ext.QuickSort を使います:
そして、下の出力を生成します:
別の例として、次のコードは、
ext.ReplaceIf を使って、文字列中の数字を、文字
x に置換します:
そして、下の出力を生成します:
明らかに、文字列の中で、数字を置換する最も効率的な方法ではないですが、文字列は、アルゴリズムが何を行っているかを示す簡単な方法を提供します。
この過程は、UDT 型要素で使う場合と類似しています。
次のコードは、
Person オブジェクトの範囲を変形するために
ext.Transform を使い、出力するために、
ext.ForEach を使うからです。:
fbext_Instanciate( ..., ((Person)) ) 行は、外部テンプレート・ライブラリーの一部です。
拡張ライブラリ・テンプレート を参照下さい。
ここでは、この行が、
ext.Transform と
ext.ForEach が、
Person 要素の範囲で使えるようにするということを知っておけば十分です。
デフォルトで、すべてのアルゴリズムは、内蔵の数値 (
Integer、
Doubleなど) と、
String 要素で、動作します。
より多くの情報
FreeBASIC 拡張ライブラリーは、
テンプレート(template)の例示化用のプリプロセッサーAPIを含んでいます。これはユーザ定義マクロの形をした、数個の汎用コードです。
テンプレートの1つの(典型的な)利点は、これがコード重複を最小にすることができるということです。
たとえば、配列で
UByte 要素の範囲のなかで繰り返す、手続き、アルゴリズムです:
ただ、効果的な手続きは、単に
UByte 要素の範囲の中で走査できるだけです。
同じ振る舞いを備えた手続きが必要で、それが
Integer 要素で働く場合、1つのオプションは、
Find を多重定義して、二番目のバージョンを定義することです:
どれだけのコード(またドキュメンテーション!)がこのシナリオで複写されるか、注目してください。
ただ一つの違いは署名です。署名は、
UByte か
Integer のいずれかのパラメーター型を指定します。
他の要素型の範囲を含むために、
Find の機能性を広げるために、一般的に、同じコードは、それぞれのために複写されなければなりません。これは、テンプレートが便利な点です:
新しいコードは、
ext/templates.bi を含めることから始まります。
ext/templates.bi は、テンプレート・システムで使われるマクロを、すべて含んでいます。
次に、
Find_Define と呼ぶ、1つの、マクロを定義します。
Find_Define は、2つのテンプレート・パラメーターを持っています。
テンプレート・パラメーターの2番目は、
ElementType と呼ばれる要素の型で、
Findが、繰り返すことができます。
この型を指定するために、マクロの
fbext_TypeName が、パラメータ・リストで使われます。
このマクロは、
ElementType の値を、
fbc が理解できるものに、翻訳します。
最後に、手続きテンプレート
Find は、
fbext_Instantiate(最初の引数として、テンプレートの名前、この場合は
Find、をとるマクロ)で、インスタンス化されます。
第2の引数は、
template arguments の順番;
括弧で囲まれた、1つ以上の値です。この順番は、テンプレート引数として
Find_Define に渡されます。
ここで、最後の3行の振る舞いは、
に類似しています。背後で行われた何かとともに。
このように、3つの
Find が多重定義されます。これは、ひとつだけの手続き定義で、要素の異なる型で繰り返します。
手続き記述コメントは、振る舞いは同様に一定であるという事実を強調するために、リファクタリング(ソースコードの意味・動作を保ったまま、保守性・可読性を高めるように書き直すこと。)の全体にわたって同じままです。
より多くの情報