EGGXチュートリアル 2

以下、実際にEGGXを使った簡単なプログラムを書いてゆく。 プログラム例を実際に入力して、実行してみること。

ウィンドウを開く

グラフィクスを描くには、まずそのためのウィンドウを開く。 それにはeggx_gopen(x,y)命令を使う。 整数型変数x,yはウィンドウの縦横のサイズをドット数単で指定する。 複数のウィンドウを管理するために各ウィンドウには番号がつけられる。 下のプログラムは100ドット×100ドットのウィンドウをひとつ開いて終了する (終了時にウィンドウは自動的に閉じられるので、ウィンドウは一瞬見えるだけ)。

#include<stdio.h>
#include<eggxlib.h>
main(){
  int w;
  w=eggx_gopen(100,100);
}

ウィンドウの番号を格納するために整数変数wを用意し、

   w=eggx_gopen(100,100);
でウィンドウを開くと同時にウィンドウの番号がwに記憶される。

プログラム終了後にすぐウィンドウが閉じてしまうのはあんまりなので、しばらくそのままにしておく命令も覚えておこう。eggx_msleep(ms)は整数変数msで指定した時間(ミリ秒単位)だけ、なにもせずに待つ。この命令はプログラムの最後に限らず、いつでも使用できる。 次のプログラムはサイズの違うふたつのウィンドウを開いて、そのまま5秒間待って終了する(ウィンドウが重なってしまうようなら、マウスで位置を動かせばよい)

#include<stdio.h>
#include<eggxlib.h>
main(){
  int w1,w2;

  w1=eggx_gopen(100,100);
  w2=eggx_gopen(300,200);
  eggx_msleep(5000);
}

ウィンドウの背景色を設定する

初期状態ではウィンドウの背景は黒塗りになっている。この色の設定を変更するにはeggx_gsetbgcolor命令を使う。ただし、背景の色はウィンドウを”クリア”した時点で初めて反映される。”クリア”というのは要するにウィンドウに描かれているグラフィクスをすべて消去することである。それにはgclr命令を使う。 次のプログラムは1番目のウィンドウの背景を赤、2番目を黄色に設定して、両方 ウィンドウをクリアする。

#include<stdio.h>
#include<eggxlib.h>
main(){
  int w1,w2;

  w1=eggx_gopen(100,100);
  w2=eggx_gopen(300,200);

  eggx_gsetbgcolor(w1,"red");
  eggx_gsetbgcolor(w2,"yellow");

  eggx_gclr(w1);
  eggx_gclr(w2);

  eggx_msleep(5000);
}

eggx_gsetbgcolorではウィンドウの番号と色を指定する。色は非常に細かく指定できるのだが、ここでは色の名前による指定だけをおぼえておけばいいだろう。色の名前として、white,black,red,blue,green,yellow,purple,pinkなど常識的なものはだいたい使えると思ってよい(実際には数百種の名前が使用できる)。名前を二重引用符(double quotation mark つまり"")で囲むことを忘れないように

eggx_gclrにはウィンドウの番号を指定する

矩形を描く

矩形の輪郭を描くにはeggx_drawrect命令、矩形を塗りつぶすにはeggx_fillrect命令を使う。どちらもウィンドウ番号と矩形を指定する四つの数(初めの二つが矩形の左下隅の座標、次の二つが矩形の横幅と高さ)を与える。たとえば

#include<stdio.h>
#include<eggxlib.h>
main(){
  int w1;
  w1=eggx_gopen(100,100);
  eggx_gsetbgcolor(w1,"red");
  eggx_gclr(w1);

  eggx_drawrect(w1,50,10,20,30);
  eggx_fillrect(w1,50,60,30,20);

 eggx_msleep(5000);
}
は輪郭だけの矩形と塗りつぶされた矩形とをそれぞれ一個ずつ描画する。ひとつめの
  eggx_drawrect(w1,50,10,20,30);
は座標(50,10)を左下隅として、横幅20、高さ30の矩形を描く。 座標はウィンドウの左下隅を(0,0)とし、縦横にドット数単位で測る。

矩形の位置とサイズは一般には実数変数で指定する(本当はfloatつまり"単精度実数"という型の変数にするべきなのだが、gccではいつものdoubleつまり倍精度実数変数でもうまくいくようなので、ここではそれでいいことにしておく。実は整数型変数でもできてしまったりする。どちらも本来はできないはずだと思うので、gccだけの特例だろう。ちゃんとやるにはキャストと呼ばれる方法で変数をfloatに変換する。キャストについてはC言語の本を参照)。 たとえば

#include<stdio.h>
#include<eggxlib.h>
main(){
  int w1;
  int i;
  double x,y;

  w1=eggx_gopen(100,100);
  eggx_gsetbgcolor(w1,"red");
  eggx_gclr(w1);

  for(i=1; i<6; ++i){
   x = 10*i;
   y = 12*i;
  eggx_drawrect(w1,x,y,20,30);
  }
 eggx_msleep(5000);
}
は位置やサイズを変えながら矩形を5個描く。

これを利用すると、アニメーションを作ることができる。 たとえば、次のプログラムは矩形が右方向に2ドットずつ進んでゆく。

#include<stdio.h>
#include<eggxlib.h>
main(){
  int w1,w2;
  int i;
  double x,y;

  w1=eggx_gopen(100,100);
  eggx_gsetbgcolor(w1,"red");

  for(i=1; i<40; ++i){
   x = 2*i;

  eggx_gclr(w1);
  eggx_fillrect(w1,x,30,10,30);
  eggx_msleep(100);
  }
 eggx_msleep(2000);
}
各ステップで、画面をクリアしてから矩形を描くことを繰り返している。 矩形を表示したのち100ミリ秒休んでいるのは、こうしないと変化が 速すぎて動きが見えないからである。休む時間は目的に合わせて いろいろ変えてみるといいだろう。 ただし、このような原始的なアニメーションの方法では画面がちらついて見づらい。 これを解決するには、あとで説明するdouble bufferingと呼ばれる方法が有効である。

矩形以外の図形としては円弧や多角形などが用意されている。 詳細はマニュアル参照のこと。たとえば

#include<stdio.h>
#include<eggxlib.h>
main(){
  int w1,w2;
  int i;
  double x,y;

  w1=eggx_gopen(100,100);
  eggx_gsetbgcolor(w1,"red");

  for(i=1; i<40; ++i){
   x = 2*i;

  eggx_gclr(w1);
  eggx_fillarc(w1,x,30,20,20,0,360,1);
  eggx_msleep(100);
  }
 eggx_msleep(2000);
}
円を描く命令eggx_circleはあるが、円を塗りつぶす命令(eggx_fillcircle?)がないらしいので、ここではfillarcを使った。fillarcは任意の角度の円弧(というか、扇型)を塗りつぶす命令である。詳細はマニュアル参照

課題

  1. ウィンドウの数やサイズ、背景色などをいろいろ変えてみる。ウィンドウ・サイズは画面上のドット数で指定するので、ドット数と実際のサイズとの関係をだいたい把握しておくと便利。eggx_gsetbgcolorとeggx_gclrを繰り返し使うと背景色が次々と変化する
  2. マニュアルを参考に円・長方形・円弧を描いてみる。位置やサイズも変えてみる

前へ 次へ