課題

上にも書いた通り,カウンタのデザインは自由です. セグメントの形状は必ずしも上図のように6角形である必要はありません. また点灯していないセグメントは,点灯しているセグメントと区別できるように描画してもよいですし,全く描画しなくても構いません.
課題の進め方
課題のプログラムはすべてを完成させてから実行しようとせず,大枠を作ってから細部を仕上げていくようにするとよいと思います. まずは,次のような枠組みから始めるとよいでしょう.以下のプログラムは次のリンクからダウンロードできます.
ファイルをダウンロードするにはリンクを右クリックして「名前を付けて保存」を選んで下さい. ファイル名は必要に応じて変更して下さい. なおダウンロード先は「Home」としてください.
require 'opengl'
require 'glut'
require 'cg/mglutils'
WSIZE=800
### 描画コールバック ########
display = Proc.new {
GL.Clear(GL::COLOR_BUFFER_BIT) # 画面のクリア
# 描画する内容を記述する
GL.Flush()
}
# キーかマウスを利用してインタラクティブな処理を行うようにします
# (カウンタの増減処理とそれにともなう表示の更新を行います)
### キーボード入力コールバック ########
keyboard = Proc.new { |key,x,y|
# キーを押したときの動作を記述する
# 最初からプログラムを終了させるような仕組みだけは入れておいて,
# そのあと徐々に機能を追加していくとよいでしょう
if key == 'q'
exit 0
end
}
#### マウス入力コールバック ########
mouse = Proc.new { |button,state,x,y|
# マウスボタンを押したとき,離したときの動作を記述する
}
##############################################
# main
##############################################
GLUT.Init()
GLUT.InitWindowSize(WSIZE,WSIZE) # ウインドウサイズ (適切に設定すること)
GLUT.CreateWindow('Title') # ウインドウタイトル (適切に設定すること)
GLUT.DisplayFunc(display) # 描画コールバックの登録
GLUT.KeyboardFunc(keyboard) # キーボード入力コールバックの登録
GLUT.MouseFunc(mouse) # マウス入力コールバックの登録
MGLUtils.bgcolor(0.4,0.4,1.0) # 背景色の設定
GLUT.MainLoop()
サンプルプログラム
信号機のサンプルプログラム(traffic_signal.rb)を用意しています.ダウンロードすれば実行できます.
課題のプログラムでは,カウンタの状態(現在の値)をキーあるいはマウスで変更して,それに応じてカウンタの表示を変えることになります. このサンプルプログラム(traffic_signal.rb)と同じような処理で実現可能であることが容易に予想できるでしょう.
もう一つサンプルを示します.緑色の円盤をキー入力で動かすようになっています. if式の基本的な使い方とバリエーションを示します.
セグメントの表示
簡単に横向きあるいは縦向きのセグメントを表示するにはGL.Rectを利用するとよいでしょう. GL.Rectで矩形を一つ描けます(GL.Begin...GL.Endで囲う必要はありません). GL.Rectをうまく組み合わせることで,カウンタ全体を構成することができます.
# 左上角(x0,y0),右下角(x1,y1)の矩形を描く
# (x0,y0,x1,y1の値は定義済と仮定する)
GL.Rect(x0,y0,x1,y1)
GL.Rectの具体的な使い方についてはサンプルプログラム(traffic_signal.rb)を参照して下さい.
もちろんGL.Rect以外の方法でセグメントを描いても構いません. 適当なメソッドを定義してセグメントを描くこともできるでしょう. メソッドについては今後授業で取り上げる予定です. なお参考までに次にメソッドを使ったプログラムの例を示します(このサンプル自体はわざわざメソッドを使わなくてもGL.Rectでも書けます).
基本事項の確認について
ウインドウ上に描画される座標の範囲,色の指定方法, あるいはファイルのダウンロードの方法など,課題に取り組むために必要で, このページで説明していないことについては,これまでの課題のページで確認するようにして下さい.
キーの指定
キー入力イベントではキーの種類を指定して,それぞれに応じた処理を記述します. キーの種類は次のように指定します.
- 表示可能な文字の場合,「文字」を引用符で括ります.
ただし「∖」については特別な意味があるため,「'∖∖'」と表記します.
'a' # [a] 'A' # [A] (=[Shift]+[a]) ' ' # [SPACE] (空白文字) '∖∖' # [∖]
「∖」(左上から右下への斜め線)はバックスラッシュといいます. 「∖」が使えない場合は,代わりに「¥」を使います.上で使っている「∖」は厳密には「set minus」という記号です. バックスラッシュが「¥」として表示される場合があることから, それを避けるためにあえてバックスラッシュと似て非なる文字として「∖」を使っています. このページの「∖」はバックスラッシュではありませんので, このページからコピーしてもバックスラッシュとしては使えません. - 表示可能でない文字を使いたい場合は,(一部を除いて)文字の「番号」で指定できます.
表示可能な文字を「番号」で指定することもできます.
サンプルプログラムでは16進数で番号を指定しています(「0x」につづいて16進数2桁で表現します).0x09 # [TAB] 0x0d # [Enter] (正しくはCR) 0x1b # [ESC] 0x20 # [SPACE]
これらの番号はasciiのマニュアルで確認できます.
$ man ascii
マニュアルで番号は(Oct=8進,Dec=10進,Hex=16進)で記述されています マニュアルの操作 [SPACE]でスクロール [b]で逆スクロール [q]で終了
特別なキーの扱い
カーソルキー[↓][↑]やファンクションキー[F1]...[F12],ホームキー[Home]などの通常の文字以外のキー入力はキーボードコールバック(KeyboardFunc)では扱えません. それらをインタラクションに利用するには,特殊キー用のコールバックを別途作成して,それを「SpecialFunc」として登録します.
マウスボタンと状態の指定
マウスボタンイベントでコールバックに通知されるボタンと状態は次のように表記できます.
左ボタン | GLUT::LEFT_BUTTON |
右ボタン | GLUT::RIGHT_BUTTON |
中ボタン | GLUT::MIDDLE_BUTTON |
押されている | GLUT::DOWN |
押されてない | GLUT::UP |
サンプルプログラムも参照してください.
色表
色指定のサンプルを示した表を準備しました.