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