EGGXチュートリアル 4

Double buffering

アニメーションを作る場合、表示されている画面に直接絵を描くのはあまりいい方法ではない。よく行なわれるのは、一画面分の絵をメモリ上で作成してしまってから一気に画面に転送するという方法で、doublo bufferingと呼ばれる。EGGXはひとつのウィンドウに対して2画面分のメモリ(レイヤーと呼ばれ、0番と1番という番号が割り当てられている)が用意されており、どちらのレイヤーを表示してどちらのレイヤーに描くかを切り替えることができる。また、一方のレイヤーの内容を他方のレイヤーへ転送する命令も用意されている。ここまではレイヤーの指定を一切していなかったので、常に0番レイヤーが表示され、作画も0番レイヤーに対して行なわれていた。 double bufferingを実現するには、表示は0番レイヤー、作画は1番レイヤーと役割を分けて、1画面分の作画が終了したら、1番レイヤーの内容を0番レイヤーに転送すればよい。

w1ウィンドウについて 表示を0番レイヤー、作画対象を1番レイヤーとするにはlayer命令を使って

  eggx_layer(w1,0,1);
と指定する。これは次にeggx_layer命令が使われるまで有効なので、普通は一度指定するだけでよい。これ以後は絵を描いてもメモリ上で処理されるだけで、その結果は画面に表示されない(eggx_gclrもlayer 1が対象になる)。

1番レイヤーの内容を0番レイヤーに転送するには

   eggx_copylayer(w1,1,0);
とする

これを使って、トラック(?)が走るアニメーションを作ったのが下のプログラムである。
#include<stdio.h>
#include<eggxlib.h>
main(){
  int w1;
  int i;
  double x,y;

  w1=eggx_gopen(500,100);
  eggx_window(w1,0,0,50,10);
  eggx_layer(w1,0,1);
  eggx_gsetbgcolor(w1,"blue");
  eggx_gclr(w1);
  eggx_copylayer(w1,1,0);

  for(i=0; i<250; ++i){
   x=i*0.2;
   eggx_gclr(w1);
   eggx_fillrect(w1,x,3,4,1);
   eggx_fillrect(w1,x+2,4,1,0.7);
   eggx_drawrect(w1,x+0.5,2.5,0.5,0.5);
   eggx_drawrect(w1,x+3,2.5,0.5,0.5);
   eggx_copylayer(w1,1,0);
   eggx_msleep(20);
  }
 eggx_msleep(2000);
}
タイヤを丸くしたい人はeggx_circleなりeggx_drawarcなりeggx_fillarcなりを使えばよい

こんなのも作れる(目がちらちらしそうな色にしてみた)

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

  w1=eggx_gopen(100,100);
  eggx_window(w1,-2,-2,2,2);
  eggx_layer(w1,0,1);
  eggx_gsetbgcolor(w1,"blue");
  eggx_gclr(w1);
  eggx_copylayer(w1,1,0);
  eggx_newcolor(w1,"yellow");

  w2=eggx_gopen(100,100);
  eggx_window(w2,-2,-2,2,2);
  eggx_layer(w2,0,1);
  eggx_gsetbgcolor(w2,"red");
  eggx_gclr(w2);
  eggx_copylayer(w2,1,0);
  eggx_newcolor(w2,"green");

  for(i=0; i<200; ++i){
   x=sin(i*2*3.14/20)+1;
   eggx_gclr(w1);
   eggx_fillrect(w1,-x/2,-x/2,x,x);
   eggx_gclr(w2);
   eggx_fillrect(w2,-x/2,-x/2,x,x);

   eggx_copylayer(w1,1,0);
   eggx_copylayer(w2,1,0);
   eggx_msleep(50);
  }
 eggx_msleep(2000);
}

課題

  1. トラック以外のものを走らせる。横だけでなく、縦や斜めに動かしたり、 正方形の縁に沿って動かす、ジグザクに動かすなどを考えてみる
  2. なんでもいいのでアニメーションを作ってみる。基本図形の組み合わせだけでもそれなりの絵は作れるので、なにか考えてください。たとえば、猫がウィンクを繰り返すくらいのアニメーションなら、なんとかなるのでは。

前へ