FreeBASIC マニュアルのトップに戻る

FreeBASIC TutHowToProgGame1

目次→教本→いっしょに学ぼうHow to Program a Game: Lesson 1←オリジナル・サイト

ゲームのプログラム方法:レッスン1 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る


Lachie Dazdarian による序論

このレッスンのシリーズの目的は、BASIC についてほとんど知らない新人が、FreeBASIC で、コンピュータ・ゲームを作るのに必要な、プログラミングの基礎を学ぶ助けになることです。
いくつかの、BASIC の基礎知識は、大いに役立つでしょう。しかし、BASICを全く知らない人でも、このレッスンを理解できると、信じています。
私はここで、FreeBASIC ではなく、「BASIC」という言葉を使います。あなたが、QuickBASIC、Visual BASIC または、他の BASIC の基礎を知っているなら、このレッスンを理解するのは、簡単なはずだからです。

私が、このシリーズを始めるのは、この種のチュートリアルが、我々のコミュニティで不足している、と、私は常に感じていたからです。FreeBASIC の以前でも、状況は同じでした。
私は、私のプログラミング人生で、プログラムの初心者と文通することは、余りありませんでした。しかし、ゲームをプログラムしようとするとき、彼らは皆、ほとんど同じ問題がありました。
それで、私は、初心者が何を必要とするか、そして、初心者にどんな方法で説明するとよいかを見抜くことができると思います。
私も、ゲームを作るのに、決して一体化できなく、使い物にならない、切り離されたルーチンを使っていた、私の初期段階と問題を、覚えています。
私の突破口は、RelLib (R.E.Lope による QuickBASIC 描画ライブラリ)と、それで作られたスクロール・エンジンを発見した瞬間、でした。
私は、このスクロール・エンジンに動機付けられて、その仕組みを探検して、それを詳述しました。(R.E.Lope の助けも得ました。)
この瞬間、私は、ゲームを完成させるために必要な大部分、一人でプログラミングする能力を、取得しました。
これは、自転車に乗っているようです。
あなたが実際の技能を取得する瞬間に、1秒間、続きます。

それで、これが、このシリーズの目標です。
これを十分に学べば、あなたは、90%の場合で、自給自足できるでしょう。
そして、新しいことを学ぶ最も良い方法は、その具体的な使い方を見ることです。
一般的過ぎるチュートリアルでは、新しいことを伝えられないでしょう。
あなたは、より専門のプログラマの助けを必要とするかもしれません。しかし、ポイントは、あなたが、全てのステップで、それを必要とするわけではない、ということです。
これは、あなたが開発しているゲームの種類と、あなたが使っている描画ライブラリ/ツールに依存します。

私たちが作成するプログラム例とミニゲームは、GFXlib (FreeBASIC の内蔵の描画ライブラリ)でコード化します。
Lynn の Legacy、ArKade、Mighty Line、Poxie は、GFXlib および他の多くのライブラリを使って、コード化されました。私は、これらのゲームが、良い参考になると考えます。
心配しないでください。
あなたが、少なくとも1つの描画ライブラリでコードの使い方を知っていれば、別の描画ライブラリに切り替えるのは、比較的簡単です。

このチュートリアルは、レイキャスティング・エンジン(3D プログラミング)や、その他「前進的」なものは扱いません。

参考:鏡面球を描いてみる(レイキャスティング法)
http://tcslab.csce.kyushu-u.ac.jp/~ando/hobby/ray/raytrace2.html

あなたは、「前進的」なものが欲しいかもしれませんが、初心者であれば、まず以下のレッスンを、ご覧下さい。

私たちは、FreeBASIC で プログラミングするので、FreeBASIC をまだお持ちでないなら、最初に FreeBASIC をダウンロードして下さい。https://www.freebasic.net
そして、利用できる FreeBASIC IDE のひとつを手に入れて下さい。 FBIDE か FBEdit を推薦します。


例 1: 簡単なプログラム - 動く円 !

基本のものから始めましょう。
私たちがコーディングする最初のプログラムは、外部の画像を使いません。外部のファイルから画像(通常 BMP 画像)をロードするのは、それなりに手前のかかる作業で、ここであなたを混乱させるからです。
私を信じてください。
じっくり着実に進めましょう。

私たちが作るプログラムで、あなたは、円を、画面の周りに動かすことができるでしょう。
とても簡単なプログラムですが、これを作ることで、私たちは、重要な事実、多くの基本の命令文、および GFXlib でゲームを作するために必要な方法を、学ぶでしょう。

GFXlib を使うときは、GFXlib のマニュアルを、必要により参照して下さい。
GFXlib のマニュアルは、このレッスンで、私たちの聖書で、とても役に立ちます。このプログラム例で使う全ての命令文の全てのパラメタについて、私が説明するというわけではないからです。
FreeBASIC は、適宜、新しいバージョンに更新されるので、オンライン FreeBASIC マニュアル(FreeBASICウィキの一部)も、必ず参照してください。

IDE で新規プログラムを開いてください。
最初にすることは、描画モードを設定することです。
描画モードを設定する、とは何でしょうか?
プログラムの描画解像度と、色の濃さのビット(8ビットと、16ビット…)を選びます。
例えば、8ビットの色の濃さは、標準の256色モード(1画素あたり8ビット)です。
描画モードは、下のように SCREEN 命令文 で設定されます:

    Screen 13,8,2,0


13 は、320*200 の描画解像度を意味します。
8 は、8ビットの描画を意味します。
2 は、2つの作業ページ、
0 は、窓モード (1は、全画面モード) を意味します。

作業ページを少なくとも 2画面設定することは、描画を使うどんなプログラムにでも推奨します。
これらの項目については、後で、もう少し明確になるでしょう。
(SCREEN 命令文 の、より「高度な」バージョンは、SCREENRES です。)

次にすることは、ユーザが文字 Q をキーボード入力するまで、プレーを繰返すように設定することです。
繰返しは、コンピュータ・ゲームだけではなく、全てのプログラムの基礎です。
プログラムを、時々、止めたり中断させて、ユーザが何かを入力するのを待つ方法でコード化するのは、他の人々にプレーして欲しいものをプログラムするには、悪い、間違った方法です。
私たちは、プログラムが、ユーザが何かをする(マウスをクリックするか、キーを押す)のを待って、ユーザの動作に従ってプログラムが何かルーチンを実行する部分で、繰返しを使います。
繰返しループは、また、プレーヤー(敵)によって制御されない物体を、管理したり、動かす場所で、使います。
繰返しループは、絶対に必要なものです。

あなたが、これらのすべてを知っているなら、この項の最後までスキップして、完成した例(コメント付き)をダウンロードできます。
何か分からないことがあれば、ここに戻って下さい。

私たちは、他のいくつかの方法で、繰返しを設定できます。(例えば、WHILE:WEND 命令文や、GOTO 命令文です。GOTO 命令文は、非推奨です!)しかし、最も良いのは、DO...LOOP を使う方法です。

この形式の繰返しは、条件が満たされるまで、単にそのブロック内の命令文を繰り返します。
あなたは、LOOP の後に、UNTIL と共に条件を設定します。
下のコードを確認して下さい。

    Screen 13,8,2,0 ' 描画モードを設定
    Do
    ' 後で、ここに命令文を置きます
    Loop Until Inkey$ = "Q" Or Inkey$ = "q"


(編集者注:INKEY$ の $ のようなコマンドの接尾辞は:
-lang qb 方言では必須です。
-lang fblite 方言ではオプションです。
-lang fb dialec では禁止されています
該当キーワードの文書を確認してください)

このコードをコンパイルして、実行すると、小さい黒い空の 320*200 窓が表示されます。この画面は、文字 Q を押すとオフできます。(Q をしばらく押し続ける必要があるかもしれません。)
プログラムは、単に、あなたが「Q」か「q」を押すまで、繰返します。
キーボードで、「Caps Lock」が押されていることも考慮して、「Q」の大文字と小文字の両方を使っています。
INKEY は、キーボードで押された最後のキーを返す、命令文です。
後で、私は、なぜゲームでこの方法を使うべきでないか、そして、より良い代替方法を説明します。

円を描くために、CIRCLE命令文 を使います。
下のコードを確認下さい:

    Screen 13,8,2,0 ' 描画モードを設定
    Do
    Circle (150, 90), 10, 15
    Loop Until Inkey$ = "Q" Or Inkey$ = "q"


上のコードは座標 150、90 に、半径 10 で、色 15(明瞭な白)の小円を、繰返し描きます。
では、どうやってこの円を動かすでしょうか?
私たちは、座標を変数にする必要があります。
このため、circlex と circley という2つの変数を使います。
下のコードを、確認下さい。

    Dim Shared As Single circlex, circley
    Screen 13,8,2,0 ' 描画モードを設定
    circlex = 150 ' 初期の円の位置
    circley = 90

    Do
    Circle (circlex, circlex), 10, 15
    Loop Until Inkey$ = "Q" Or Inkey$ = "q"


このプログラムを実行しても、結果は何も変わりません。しかし、これは達成したいことへのステップです。
円の最初の位置を変えるために、circlex と circley の値を変えることができます。しかし、それは、私たちが本当にしたいことではありません。
円を動かすために、circlex と circley の変数を、キーボード命令文に接続する必要があります。

私たちは、プログラムで、最初に 2 つの変数を宣言しました。
FreeBASIC プログラムでは、すべての変数を宣言しなければなりません。
コンパイルのときに、-lang qb コマンドラインを使うと、古い QBasic 互換方言を使ってコンパイルできます。しかし、これを推奨しません。デフォルト FB が既に提供している、あるいは将来提供する、進歩と拡張を使えないことになるからです。
コマンドラインの使い方 の項も、参照下さい。
変数は、FB の方法で宣言します:

    Dim variable_name [As type_of_variable] 


または、

    Dim [As type_of_variable] variable1, variable2, variable3, ... 


[ ]内のデータは任意です。そして、角括弧は実際には使いません。
FreeBASIC で利用できる変数の型は、BYTE、SHORT、INTEGER、STRING、SINGLE、DOUBLEと、わずかな他のものです。しかし、このレベルでは、これらに関する詳細は、重要ではありません。
ここで知っておくべきことは、変数や配列が、描画データ(画像を保持するメモリ・バッファー)を保持するときや、それらが小数精度を必要としないデータ(統計、点数など)を表すときは、変数や配列を、AS INTEGER で宣言する、ということです。
10進精度を必要とする変数は、AS SINGLE か DOUBLE で宣言します。
これらは、通常、物理公式を使うゲームに使われる変数です。例えば、アーケードの車運転ゲームや、跳んだり走ったりするゲーム(重力効果)です。
1サイクルで 2ピクセルの速度と、1サイクルで 1ピクセルの速度の違いは、多くの場合、とても大きいものです。この限度から、あなたは、流体運動のような効果を、充分満足できる方法で、模倣することは、できません。
また、DIM の後ろに、SHARED を置くべきです。こうすると、この変数は、プログラム全体(すべてのサブルーチン)で、使えるようになります。
サブルーチンの中で宣言される変数だけで、SHARED を使わないでください。(私は、ごくまれにこれをしますが。)
サブルーチンの中で配列を宣言する場合は、私は、DIM を REDIM に替えるように、アドバイスします。
STRING(文字列)は、文字データを保持するために使います。 YourName = "Dodo" のように。あなたは、最初に YourName AS STRING と宣言する必要があります。

今、私は、INKEY$ の代わりに、新しい命令文を紹介します。この命令文は、複数の keypresses を検出でき、INKEY$ よりはるかに敏感です(完全な応答)。
INKEY$ の欠点は、とても非応答であるだけでなく、どんな所定の瞬間にでも、それが1つの keypress しか検出できないことです。これは、ゲームでは、全く使い物になりません。
応答が遅い点は、先の例でコンパイルしたプログラムを止めようとしたとき、あなたも、たぶん感じたでしょう。

代用として使うのは、パラメタが 1つのだけの MULTIKEY 命令文 です。このパラメータは、で、尋ねたいキーの DOS scancode です。
あなたは現在、意味不明の状態かもしれません。
DOS scancode は、コンピュータによって参照される、キーボード・キーのコードです。
例えば、MULTIKEY(&h1C) は、あなたが ENTER を押したかどうかを、尋ねます。
GFXlib は、これらの scancode を、Appendix A で説明されたような、「簡単に読める」定数に、置き換えできるようにします。
GFXlib を使うためには、.biファイル(fbgfx.bi) を、ソースに含める必要があります。
.bi ファイルとは、何ですか?
それは、あなたのソースコードに接続する色々な種類のモジュールで、メインモジュールで使われる様々なサブルーチンと宣言で機能します。(サブルーチンについて、何も知らないかもしれませんが、私は、後でそれについて説明するつもりです。)
追加する必要があるコードは、次の2行です:

    #include "fbgfx.bi"
    Using FB


この 2行は、プログラムの始めに置くのがベストです。(sub 宣言の前または後です。)
fbgfx.bi に、パスを設定する必要はありません。fbgfx.bi は、/FreeBASIC/inc ディレクトリに置かれているからです。
.bi ファイルが、/FreeBASIC/inc ディレクトリに無いか、ソースコードがあるディレクトリにない場合にだけ、.bi ファイルにパスを設定する必要があります。
Using FB は、プログラムに、私たちが、名前空間なしで GFXlib シンボルにアクセスするつもりだ、と伝えます。その意味は、GFXlib シンボルの前に、'FB.' を置く必要はない、ということです。
USING(名前空間) を参照してください。

さあ、おもしろいことがはじまります。

私たちは、新しい変数 circlespeed を加えます。この変数は、 1サイクル(繰返し)の間に、円が動く画素数を設定します。
動作は、矢印キーで操作します。
ユーザが、いずれかの矢印キーを押すたびに、circlespeed で指定した量に従って circlex か circley のどちらか(押されたキーによる)を変えるように、プログラムに伝えます。
下のコードを確認して下さい:

    #include "fbgfx.bi"
    Using FB

    Dim Shared As Single circlex, circley, circlespeed

    Screen 13,8,2,0 ' 描画モードを設定

    circlex = 150   ' 最初の円の場所
    circley = 90
    circlespeed = 1 ' 円の速度 => 1繰返しあたり、1画素

    Do

    Circle (circlex, circley), 10, 15

    ' 押されたキーに従って、円の座標を変えます。
    If MultiKey(SC_RIGHT) Then circlex = circlex + circlespeed
    If MultiKey(SC_LEFT) Then circlex = circlex - circlespeed
    If MultiKey(SC_DOWN) Then circley = circley + circlespeed
    If MultiKey(SC_UP) Then circley = circley - circlespeed

    Loop Until MultiKey(SC_Q) Or MultiKey (SC_ESCAPE)


お分かりのように、私たちは、ここで MULTIKEY を使っているので、UNTIL の後の条件を変えました。
今、あなたは、ESCAPE を押しても、プログラムを終了できます。(私は、もうひとつ条件を加えています。)

上のバージョンのコードをコンパイルすると、起きて欲しくない 2つのことが起きます。
プログラムは、あなたが、円の動きに気付けないほど、速く動くでしょう。そして、円は画面に「塗り付け」られます。(前のサイクルで、異なった座標に描かれた円は、画面に残ったままです。)
塗りつけられるのを避けるために、繰返しで、CLS 命令文を使います。(画面を消去します。)
こうすると、繰返しの度に、前の繰返しで描かれた古い円は、新しい円が描かれる前に、消去されます。

速度を落とす、最も簡単なプログラムの修正は、SLEEP 命令です。
これは、何をするのでしょう?
SLEEP 命令は、指定された時間(ミリ秒で)が経過するか、またはキーが押されるまで、待っています。
キー押しオプションを回避するには、SLEEP ミリ秒,1 を使ってください。
この命令文は、100% CPU 使用問題の、効果的な解決法でもあります。
いいですか、どんな種類の FreeBASIC プログラムでも、繰返し(最も簡単なものでも)で、この命令文を使わないと、すべてのコンピュータ・サイクル妨げ、あなたが走らせている他のすべてのWindowsタスクを、這うように遅くします。
また、この種類の FreeBASIC プログラムが動いている間、他のタスクを、操作し難くします。
ただ、これは甚大な問題ではありません。今までのところ FreeBASIC ゲームをリリースしたかなりの量のプログラマは、わざわざこれを修正しませんでした。

下のコードをコピー貼付けしてください。そして、コンパイルして実行してみてください:

    #include "fbgfx.bi"
    Using FB

    Dim Shared As Single circlex, circley, circlespeed 

    Screen 13,8,2,0 ' 描画モードを設定

    circlex = 150   ' 最初の円の場所
    circley = 90
    circlespeed = 1 ' 円の速度 => 1輪あたりの1画素

    Do

    Cls
    Circle (circlex, circley), 10, 15

    ' 押されたキーに従って、円の座標を変えます。
    If MultiKey(SC_RIGHT) Then circlex = circlex + circlespeed
    If MultiKey(SC_LEFT) Then circlex = circlex - circlespeed
    If MultiKey(SC_DOWN) Then circley = circley + circlespeed
    If MultiKey(SC_UP) Then circley = circley - circlespeed

    Sleep 10, 1

    Loop Until MultiKey(SC_Q) Or MultiKey (SC_ESCAPE)


私たちの円は、それなりの速度で、塗りつぶされずに移動します!

上のバージョンのコードは、コード化の望ましい方法を示してはいません。私は、このレッスンを分かり易くするために、コードを簡素化しているからです。

次にすることは、変数を、それらがどんな「重大な」プログラムでも宣言できる方法で宣言すること。そして、2つの作業ページがなぜあるか、それで何ができるか、を示すことです。

変数を上のコードで宣言する方法は、大きいプロジェクトでは、最も便利な方法ということではありません。大きいプロジェクトでは、通常、膨大な量の変数を、数個のオブジェクトに関連づけます。
(オブジェクトは、複数の変数で定義される、プレーヤーや、敵や、何かです。)

それで、最初に、命令文 TYPE を使って、ユーザ定義のデータ型を定義します。ユーザ定義のデータ型は、より多くの変数/配列を含むことができます。(頑張って、ついて来て下さい。)
私たちは、このユーザ・データ型に、ObjectType という名前を付けます。
下のコードです:

    Type ObjectType
         x As Single
         y As Single
         speed As Single
    End Type


この後、円を、オブジェクトとして宣言します:

    Dim Shared CircleM As ObjectType

    ' この変数を、"Circle" という名前で宣言できません。
    ' FB は、それを、命令文 CIRCLE と区分できないからです。
    ' それで、変数名を "CircleM" としています。


この方法は、どのように有益でしょうか?
ユーザ定義型を使うと、プログラム変数を、より効率的で簡潔な方法で、管理できます。
この例で、別々に、円の各特性(位置、速度など)を宣言する代わりに、単純に、型定義を使います。型定義は、これらのすべての変数を含めて、変数や配列を変数名に関連づけます(この場合、変数名は CircleM です)。
これで、今、円の x 位置は、CircleM.X で、円の y 位置は、CircleM.Y で、円の速度は、CircleM.speed で、指定できます。
ユーザ定義型を使うと良い理由を、分かっていただけたと思います。
1つのユーザ定義型で、より多くの変数や配列に接続できます。
この例では、あなたは何か別のオブジェクトを加えることができます。例えば、
DIM SHARED EnemyCircle(8) AS ObjectType
とすると、ObjectType type:def (x, y, speed) から変数を使っている、特定のセットのルーチン(ある種のAI)で、8つの「悪」の円を、管理できるようになります。
そして、これらの円は何らかの方法で、ユーザの円を「攻撃」できます。
次のレッスンで、このすべてが、もっと明確になるでしょう。
すべての変数を、type:def を使って宣言する必要があるわけではないことに、注意して下さい。
type:def を使って宣言するのは、ゲームで、多くの変数(ヒーローを、健康、お金、スコア、強さなどで決定するように)で定義される(特徴付けられる)オブジェクトの場合だけです。

修正を加えて、最終版のコードは、下のようになります:

    #include "fbgfx.bi"
    Using FB

    ' 私たちのユーザ定義型
    Type ObjectType
         x As Single
         y As Single
         speed As Single
    End Type

    Dim Shared CircleM As ObjectType

    ' この変数を、"Circle" という名前で宣言できません。
    ' FB は、それを、命令文 CIRCLE と区分できないからです。
    ' それで、変数名を "CircleM" としています。

    Screen 13,8,2,0 ' 描画モードを設定
    SetMouse 0,0,0 ' マウス・カーソルを隠す

    CircleM.x = 150   ' 最初の円の場所
    CircleM.y = 90
    CircleM.speed = 1 ' 円の速度 => 1輪あたりの1画素

    Do

    Cls
    Circle (CircleM.x, CircleM.y), 10, 15

    ' 押されたキーに従って、円の座標を変えます。
    If MultiKey(SC_RIGHT) Then CircleM.x = CircleM.x + CircleM.speed
    If MultiKey(SC_LEFT) Then CircleM.x = CircleM.x - CircleM.speed
    If MultiKey(SC_DOWN) Then CircleM.y = CircleM.y + CircleM.speed
    If MultiKey(SC_UP) Then CircleM.y = CircleM.y - CircleM.speed
    Sleep 10, 1 ' 10ミリ秒待つ。

    Loop Until MultiKey(SC_Q) Or MultiKey (SC_ESCAPE)


あなたは、私が、もうひとつの命令文を、コードに加えたのに気付くでしょう。
SETMOUSE 命令文は、システム・マウス・カーソル(最初の2つのパラメタ)を位置付けて、また、マウス・カーソルの表示・非表示(3番目のパラメタ; 0は非表示)を切り替えます。
これらのパラメタを持つこの命令文は、あらゆるプログラムで、デフォルトで、SCREEN 命令文の後ろ(重要!)にある状態で、入力すべきです。あなたのプログラムが、マウスで操作できるインタフェースを付けていても、あなたは、あなた自身のカーソルを描くからです。
これについて、私を信じてください。 (えー、ちょっとしつこいですね。)


フー、最初の例は、ここで終わりです。
あなたは、私が、あまりに細部にまで入り込みすぎた、と思うかもしれません。しかし、私は、ここであちこち手をつけたことが、次の例とレッスンをより楽しい冒険にするために必要だったと感じています。

そうは言っても、これまでの例は、私たちが欲しいものまで、まだまだ遠いんでしょう?
それで、次の章は、あなたのために、外部のファイルから画像をロードする方法を学ぶでしょう。


例 2: 緑野を走り回っている戦士


以下の例では、上の例で使った、知識を、すべて適用します。このため、以下では、再び使う命令文の説明は、省略します。
新しい命令文は、全て説明するつもりです。

このセクションで、ミニゲームをコーディングしますが、このレッスンでは、最後まで完成しません。
このレッスンでは、戦士が緑野(単一画面)を、ただ走り回るプログラムを、作ります。

まず最初に、私たちが使う画像を、示します。
8ビットの色深度のモードを使うつもりなので、私たちが使う画像は、そのモードで有効なものでなければなりません(256色モード)。
戦士のスプライトのために、私の最初のゲーム Dark Quest から、主人公のスプライトを使います。
http://hmcsoft.org/fb/htpagl1-sprites.png
(編集者注:上のリンクはもう消滅しています。ダーククエストのゲームは、まだダウンロードできます。
http://lachie.phatcode.net/downloads.php)

渡辺注:リンクが表示されないので、代替で「First Seed Material」
http://www.tekepon.net/fsm/modules/refmap/
のキャラクタを使わせてもらうと、良いでしょう。


御覧の通り、この画像は、戦士の 12 のスプライトを主役とします。どれも、20 * 20 ピクセルの大きさです。
それぞれの方向対して 2つ (歩行動画) のスプライトと、それぞれの方向で戦士が剣を振るっているときの 1つのスプライトです。
剣を振り動かすことは、最初のレッスンでは実行されませんが、後で必要になります。

2番目の画像は、背景画像です。320 * 200 画素の大きさで、8 ビットの、BMP 画像です。

両方の画像をダウンロードして、ソースの場所に置いて下さい。あるいは、このセクションの最後のリンクで、完成した例をダウンロードしてください。

プログラムの始まりに、fbgfx.bi を入れる必要があります。最初の例と同じです。そして、最初の例と同じ描画モードを設定します。
コードは下のようになります:

    #include "fbgfx.bi"
    Using FB

    Screen 13,8,2,0 ' 描画モードを設定
    SetMouse 0,0,0  ' マウス・カーソルを隠す


ここで、画像を格納するメモリ・バッファを指す、2つの記憶ポインターを宣言します。 (一つはスプライトのため、もう一つは背景のためです)

最初のポインタは、background1 という名前にして、下の行のように宣言します。

    Dim Shared background1 As Any Ptr


ANY PTR は、background1 が実際にメモリポインタであることを示しています。
ANY PTR と定義されたポインターは、コンパイラが、それが指すデータの型について調べることを、無効にします。
これは、異なった型のデータを示すことができるようになるので、役に立ちます。
IMAGECREATE 命令文を使って、画像のためのメモリを割り当てるつもりなので、ポインタを使います。
画像の高さと幅を入力すると、IMAGECREATE は、1つの描画(スプライト/画像)のために、正しいメモリー容量を割り当てます。
さもないと、私たちは手動でそれをしなければなりません。つまり、スプライト・サイズ、ビット深さ、および変数サイズの結果として、必要なメモリー容量を、計算しなければなりません。
IMAGECREATE を使って、これをします。
IMAGECREATE の結果はポインタなので、私たちは、変数ではなくて、それをポインタ参照する必要があります。
ポインタに関して何も知らなくても、心配しないでください。
知らなくても、このチュートリアルを理解できます。

次に宣言するポインタは、12人の戦士のスプライトを保持するメモリ・バッファを示します。
私たちは一次元配列として、このポインタを定義します。配列の各要素は、1つのスプライトを表します。

    Dim Shared WarriorSprite(12) As Any Ptr


これらの Dim の 2行を、コードの SCREEN 命令文の前に入れます。
これは、どんなプログラムを書くときにも使う方法です。
サブルーチン宣言、変数宣言、必要なら追加のサブルーチン宣言、そして、実際のコード、の順に書きます。
私たちのプログラムの始めの部分は、現在、下のようになります:

    #include "fbgfx.bi"
    Using FB

    Dim Shared background1 As Any Ptr ' メモリを示すポインタ
                                      ' 背景描画を保持するバッファ'
    Dim Shared WarriorSprite(12) As Any Ptr ' メモリを示すポインタ
                                            ' 戦士のスプライトを保持するバッファ

    Screen 13,8,2,0 ' 描画モードを設定
    SetMouse 0,0,0  ' マウス・カーソルを隠す


画面解像度、色の濃さ、および作業ページの数を設定した後、画像を作業ページにロードする前に、作業ページを隠します。なぜなら、ユーザが私たちのプログラムを始動するときに、ユーザにプログラムのすべての画像を見せたくないからです。
これを達成するために、SCREENSET 命令文を使います。
SCREENSET は、作業ページ(最初のパラメタ)と、目に見えるページ(2番目のパラメタ) を用意します。
ここでは、作業ページとして 1ページと、目に見えるページとして 0ページを設定します。
「SCREENSET 1, 0」を使った後、画面上に、何かを描くかロードすると、それは作業ページに描かれるかローされ、異なるパラメーター(SCREENSET 1, 1)を備えたステートメント SCREENCOPYSCREENSET を使うまで、ユーザには見えません。
これは、我々がユーザーに見せたくない画面を、削除できるようにします。作業ページの内容を、目に見えるページにコピーする前にです。
また、このページ宙返りも、点滅や他のある望まれない発生を回避する、「必要な描画」プログラムを備えたループで、役立ちます。


渡辺注:下記の ActiveBasic の、「Win32プログラミング講座」や「DirectXプログラミング講座」も参考になるかもしれませんね。
http://www.activebasic.com/help_center/articles/win32/step17/index.html
http://www.activebasic.com/help_center/articles/directx/

いっしょに学ぼう に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2019-03-11 08:32:53
日本語翻訳:WATANABE Makoto、原文著作者:SirMud

ホームページのトップに戻る

表示-非営利-継承