4.画面の準備




『一般的な画面の表示方法』
まずはアプリケーションの顔となる電卓の画面を表示してみます。
画面を表示するには色々な方法が考えられますが、画面を幾つかのパーツ(例えばボタンとか、画像等)を組み合わせて表示をするのが普通である。



『今回の画面の表示方法』
だが今回は手抜きをして、電卓の画面を1枚の絵で貼り付けて表示する事にします。最後にはこの手抜き部分も直すので取り敢えずはこのままで行こうと思いますが、取り敢えずはこれでも十分でしょう。こちらで以下のような画像を用意したのでそれを使います。



画像はWindowsではおなじみのビットマップ画像(BMP)です。横320ドット、縦240ドット、色数256色モードの画像であり、このサイズが電卓のウインドウサイズとなります。
【画像のDOTの説明】
WindowsやMac、unix等の一般的なコンピュータは、モニターに表示されている画像は格子上に均等に並んだ点の集まりで描かれています。街を歩いていると電球を並べた電光掲示板を見ると思いますがこれと同じ原理です。
この一つ一つの点に色々な色を割り当てあげれば、きれいな画像が出来上がるのです。コンピュータの世界ではこの一つの点の事を「ドット(dot)」と呼びます。

「無からのプログラミング講座」でコンピュータは全てを数字で扱うと書きましたが画像も同じであり、色毎に番号がついています。「光の3原色」という言葉を聞いたことはありませんか?全ての色は「赤、青、緑」の3色の光を重ねる事で表現します。例えば、赤と青のセロファンを重ね懐中電灯にかざすと紫色の光になります。
各色の明るさをそれぞれ変えてあげれば微妙な色も表現ができます。LGPでは各色の明るさを256段階「0(暗い)〜255(明るい)」で表現します。

『画面を表示する準備』
LGPで画面に何かしら画像を表示したい場合、前もって画面の初期化(準備)をする事が約束となっている。
この画面の初期化は「G@SETUP関数(予めLGPが提供する機能)」の実行で行なう。初期化する内容は以下の4つである。

@画面(ウインドウ)の横サイズ
A画面(ウインドウ)の縦サイズ
B画面の色数
Cウインドウ表示とフルスクリーン表示のどちらにするかの情報


『関数とは?』
関数とは、特定の処理を実現するプログラムを部品化し、同処理を扱いやすくしたものを言います。
「無からのプログラミング講座」でプログラムで標準で使えるは演算方法は加減乗除だけであるとお話しましたが、もし、三角関数などの高度な演算をしたい場合加減乗除だけでこれを行う事は大変です。そこで、数値を渡してあげたら演算結果を返してくれたら簡単だとは思いませんか。数値を渡してから演算結果を返してくれるまでの間どんな事をしているのかを意識しなくても良いし、気にしなくても良い。
このように部品化しある機能を使いやすくするものが関数なのです。
関数のイメージを下図に示してみました。左側があなたの作るプログラムで右側が関数になります。機能を呼び出すための命令を実行すると関数に処理が移り、終わると元のプログラムに戻ってきます。飛び先の関数の中身はまったく知らなくてもO.K.です。ちなみにこの関数はLGPで用意されているもの以外に自分でも作ることができます。

利点として以下のような物があげられます。
@例えば同じ処理をするプログラムが複数箇所で必要な場合、その箇所毎にそのプログラムを記述する事は面倒です。もしこの同じ処理をするプログラムを別の箇所に作っておき(部品化)、必要な時にそのプログラムを呼出せれば面倒さは軽減するでしょう。
A同じ処理をするプログラムで問題があった場合、同じ修正を同問題点全てに入れなければならなくなるだろうが、関数化しておけば、関数内のただ1っ箇所の修正だけで済む。
B複数箇所に必要なプログラムを1ヶ所に纏められるので、総プログラム量を減らす事が出来る。
C良く使う機能を関数化しておけば、以後に作る他プログラムにも流用が簡単に行なえる。
D複数人数での開発では、関数を単位にして作業分担を行なう


『初めての関数』
G@SETUP関数の仕様を次に示す。

int G@SETUP( int WX, int WY, int Color, int Mode )
パラメタ 説明
int WX 画面の幅
int WY 画面の高さ
int Color カラーのビットサイズ
int Mode 画面モード(0:フル画面、1:ウインドウ画面)


戻り値説明
0以外初期化成功、戻り値は キャラクタ番号(メイン画面:プライマリ・サーフェス)となる。
初期化エラー


G@SETUPの後ろの括弧内が関数への入力値になり、入力値が複数ある場合はカンマ「,」で区切ります。入力値の仕様の見方ですが、まず一番右側に「int WX」とありますが「int」は整数値を指定する事をあらわしています。「int」以外にも文字列を指定させる「char」や小数値を含む値を指定させる「float」というものがあります。「WX」は表中のパラメタと対比させる為だけの記号なので、特に考えなくてもいいです。
で、「int WX」に何を指定すれば良いかといえば、説明にあるとおり「画面の幅」を指定します。
次にG@SETUPの前の「int」ですが、これは関数の実行した結果(戻り値という)が「int」(つまりは整数値)で返される事を示しています。(全ての関数で結果が戻るわけではありません)
結果は関数の左側に「=」をつけて代入式と同じように変数に入れてください。


『関数を実際に使う』
電卓は「横320ドット、縦240ドット、色数256色モード、ウインドウ画面」である事を先に決めているので、同関数の指定は次のようになる。

CH=G@SETUP(320,240,16,1)


関数の結果(戻り値)は変数CHに代入されますが、この値の説明を見ると「キャラクタ番号(メイン画面:プライマリ・サーフェス)となる」とある。この説明をする前に次の話を聞いてほしい。

これはLGP独特の仕様である(というかDirectXの仕様である)が、LGPで扱う画像は全てディスクからメモリに一度読み込んだものを処理に使う構造になっている。(まあ、いちいちディスクから読み込んでいたら遅くてはなしにならんけどね)
メモリに余裕がある限り複数の画像を読み込むことができるので、実際に処理を行うときにはどの画像を扱うのかを指定しなければならない。そこで、画像を読み込む関数(すぐ後に登場する「G@CHRLOAD」関数のこと)を使い読み込んだ画像には固有の番号付けられ戻り値として取得できる。以後この画像を指すときには同番号を利用する。画像処理では、読み込んだ画像同士の好きな範囲をコピーしたりする事が自由にできる。

なぜ、G@SETUP関数の話で何故読み込んだ画像の話をするのかと言えば、G@SETUP関数の戻り値は画面の番号である。この番号は上で書いた画像番号と同等の意味を持つものであり、画面を他の画像と同じように扱う為のものである。つまり、プログラマは画面と画像の違いを意識することなく、画像処理を行うことができる。他の画像の一部をコピーしてきたり、画面の一部分を他の画像にコピーしたりとね。
つまり、画面に対して画像処理を行いたい場合はG@SETUP関数で取得した画像番号を示するのである。

『DirectXでプログラムしたことがある人へ』
画面の初期化はたったのこれだけである。C言語を使いDirectXを使用した場合から比べれば苦労は数百分の一であろうか。(・・・自画自賛)
DirectXの関数を直接使ったプログラムに挑戦したことがある人ならば、より簡単さを実感してもらえると思います。さらに、LGP ver02.00.00からはDirect3Dを使った3D処理をサポートするが、こいつの初期化も同関数1発ですむようになる予定である。