ピクセル指向プログラミング言語 Pixilang (5)
関数を作る
前回のプログラムに書き足して、次のようなプログラムを作った。
t = 0
s = ""
while 1
{
t = (t + 1) % 360
sprintf( s, "%03d", t )
t_reset()
transp( 16 )
clear()
transp( 255 )
fbox( -12, -12, 24, 24, BLACK )
print( s )
t_rotate( t, 0, 0.5, 1 )
box( -100, -100, 200, 200, WHITE )
t_rotate( t / 2, 0, 1, 0 )
box( -120, -120, 240, 240, WHITE )
t_rotate( -t / 2, 1, 0, 0 )
box( -80, -80, 160, 160, WHITE )
frame()
while get_event()
{
if EVT[ EVT_TYPE ] == EVT_QUIT { halt }
}
}
while 1の中の処理が長くなってきたので、自分で新しい関数を作成し、そこに画面描画の処理を書くことにしよう。
t = 0
s = ""
while 1
{
t = (t + 1) % 360
sprintf( s, "%03d", t )
draw()
frame()
while get_event()
{
if EVT[ EVT_TYPE ] == EVT_QUIT { halt }
}
}
fn draw()
{
t_reset()
transp( 16 )
clear()
transp( 255 )
fbox( -12, -12, 24, 24, BLACK )
print( s )
t_rotate( t, 0, 0.5, 1 )
box( -100, -100, 200, 200, WHITE )
t_rotate( t / 2, 0, 1, 0 )
box( -120, -120, 240, 240, WHITE )
t_rotate( -t / 2, 1, 0, 0 )
box( -80, -80, 160, 160, WHITE )
}最初のプログラムとやっていることは同じ。 fn draw() { ... } の部分が関数の定義。これはプログラムの先頭に書いても、途中に書いても、末尾に書いてもいい。whileによるループの中でdrawが呼び出されたとき、{ ... }の中に書かれた処理が実行される。
OpenGLによる描画処理
上のプログラムを少し修正するだけで、OpenGLを使った描画を行うことができる。OpenGLを使うと、描画処理をより高速に行える。
t = 0
s = ""
set_gl_callback( draw )
while 1 {
t = (t + 1) % 360
sprintf( s, "%03d", t )
frame()
while get_event()
{
if EVT[ EVT_TYPE ] == EVT_QUIT { halt }
}
}
fn draw()
{
set_screen( GL_SCREEN )
t_reset()
transp( 16 )
clear()
transp( 255 )
fbox( -12, -12, 24, 24, BLACK )
print( s )
t_rotate( t, 0, 0.5, 1 )
box( -100, -100, 200, 200, WHITE )
t_rotate( t / 2, 0, 1, 0 )
box( -120, -120, 240, 240, WHITE )
t_rotate( -t / 2, 1, 0, 0 )
box( -80, -80, 160, 160, WHITE )
set_screen( 0 )
}OpenGLを使うには、whileループの前で、set_gl_callback( draw )を呼び出しておく。また、draw関数の最初にset_screen( GL_SCREEN )を、最後にset_screen( 0 )を書く。このようにしておくと、自動的にOpenGLによる描画が行われるので、whileの中から自分でdrawを呼び出してはいけない。frame関数の呼び出しは残すこと。
set_gl_callback( $gl_callback, $user_data ) $gl_callback: コールバック関数。指定した関数の中で描画処理を行う。-1を指定すると、コールバック関数の指定を解除する。 $user_data: $fnで指定した関数に引数として渡されるデータ。省略可能。
set_screen( $screen ) $screen: 描画処理を行うスクリーンを指定する。OpenGLによる処理を行う場合は、GL_SCREENを指定する。0を指定するとデフォルトのスクリーンになる。