ピクセル指向プログラミング言語 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を指定するとデフォルトのスクリーンになる。