読者です 読者をやめる 読者になる 読者になる

ピクセル指向プログラミング言語 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 }
  }
}

f:id:mandel59:20130605190941p:plain
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を指定するとデフォルトのスクリーンになる。