ここでは、レンダラーや表示画面の生成などを自動化してくれる、フレームワークの使用方法を扱います。
これまでは、レンダラーやグラフィックスデータ、および表示画面を生成したり、画面の GUI を描画させたりといった処理を、毎回行ってきました。しかし、これらの処理はいつも同じような内容なので、毎回いちいち書くのは面倒です。
そこで VCSSL の標準ライブラリには、これらの処理を自動で行ってくれるフレームワーク「 Graphics2DFramework 」が用意されています。これを使用すれば、ユーザーは、いくつかのタイミングで自動的に呼び出される関数の中に、描画内容の処理などをただ書くだけで済みます。
フレームワークを使用する方法は非常に簡単で、プログラム内でフレームワークを import するだけです。
これだけで、プログラムを実行すると自動でレンダラーやグラフィックスデータが生成され、画面も表示されるようになります。 つまり、形の上では、2DCG の描画用プログラムとして一応できあがったものになります。ただし、この段階では画面上は真っ白で、まだ何も描画されません。
画面に何らかの内容を描画させるには、プログラム内に onPaint という名前の関数を定義して、その中に行わせたい描画処理を記述します。 そうすると、その関数をフレームワーク側が適当なタイミングで実行してくれて、その結果が画面上に表示されるようになります。
これまでのプログラムでは、ユーザーが書いた内容だけが、「上の行から下の行へ」の流れで単純に実行されてきました。 しかしフレームワークを使用したプログラムでは、処理の流れを司るのはフレームワークであり、ユーザーはそこに「関数を定義して処理を追加していく」という形で開発を行います。 上で述べた onPaint 関数をはじめ、以下のような関数を定義して処理を追加できます:
それぞれの引数「 int rendererID 」には、フレームワークから呼び出される際に、自動で用意されている2DCG レンダラー(描画エンジン)の ID が入っています。
なお、上記の関数を全て定義する必要はありません。使うものだけを定義し、処理を記述してください。 以下に、よく使う関数の使用例を挙げておきましょう:
onStart 関数には、画像ファイルの読み込みなど、プログラムの最初に 1 度だけ行えばよい処理を記述します。
逆に onExit 関数には、画像ファイルの保存など、最後に 1 度だけ行いたい処理を記述します(画面が閉じられたタイミングで実行されます)。
onPaint関数は、毎秒数十回(負荷にもよりますが、大体 1 秒間に 30 回ほど)の頻度で繰り返し実行され続けます。この中に、画面の描画処理を記述します。
onUpdate 関数は、onPaint関数と交互に実行されます。アニメーション描画を行いたい場合は、この onUpdate 関数の中に、描画位置などの変数の値を少しずつ変化させるような処理を記述するとよいでしょう。その変化情報に基づいて、onPaint 関数内で少し変化した内容を描画するようにすればOKです。
別に、上記どちらかの関数の中で、描画も位置更新もまとめて実装してしまっても、処理上は問題ありません。しかし、絵を描く処理(onPaint)と更新処理(onUpdate)を分けて実装した方が、メンテナンス時に内容を把握しやすいコードになります。
それでは、実際にフレームワークを使用し、画面に単純な内容を描画させてみましょう。以下のように記述し、実行してみてください。
import Graphics2D;
import graphics2d.Graphics2DFramework;
// 描画処理を記述する関数
// ( 画面更新周期ごとに、毎秒数十回呼び出される )
void onPaint ( int rendererID ) {
// 背景色をグレーに設定
setGraphics2DColor( rendererID, 200, 200, 200, 255 );
// 描画色を青色に設定
setDrawColor( rendererID, 0, 0, 255, 255 );
// 点を描画
drawPoint( rendererID, 100, 100, 20, true );
}
Framework.vcssl
このプログラムを実行すると、グレーのウィンドウが表示され、その上に青い点が表示されます。
続いて、アニメーションを行う例です。以下のように記述し、実行してみてください。
import Graphics2D;
import graphics2d.Graphics2DFramework;
// 点の描画位置を格納する変数
int x = 0;
int y = 0;
// 描画処理を記述する関数
// ( 画面更新周期ごとに、毎秒数十回呼び出される )
void onPaint ( int rendererID ) {
// 背景色をグレーに設定
setGraphics2DColor( rendererID, 200, 200, 200, 255 );
// 描画色を青色に設定
setDrawColor( rendererID, 0, 0, 255, 255 );
// 点を描画
drawPoint( rendererID, x, y, 20, true );
}
// 更新処理を記述する関数
// ( 画面更新周期ごとに、毎秒数十回呼び出される )
void onUpdate ( int rendererID ) {
// 点の描画位置を少しずつ変化させる
x += 2;
y += 1;
}
FrameworkAnimation.vcssl
このプログラムを実行すると、先ほどと同様、グレーのウィンドウ上に青い点が表示されますが、青い点はゆっくりとアニメーションで移動していきます。