website/exercise2.txt in sgl-0.4.0 vs website/exercise2.txt in sgl-1.0.0

- old
+ new

@@ -1,22 +1,11 @@ -h1. 練習問題 11〜21 +h1. 練習問題2 -h2. 課題15 マウスのボタンが押された時に +h2. 課題14: マウスの位置に反応する形 -h2. 課題16 円の描き方 - -h2. 課題18 三次元 - -h2. 課題19 速度 - -h2. 課題20 キーボードからの入力 - -h2. 課題21 配列の使い方 - -h2. 課題11A マウスの位置に反応する形 - <pre syntax="ruby"> +# kadai14.rb require 'sgl' window 200,200 loop do @@ -37,13 +26,14 @@ line 200, 0, x, y line 0, 200, x, y line 200, 200, x, y </pre> -h2. 課題12A 複雑な形の描画 +h2. 課題15: 複雑な形の描画 <pre syntax="ruby"> +# kadai15.rb require 'sgl' window -200, -200, 200, 200 beginObj(POLYGON) @@ -87,13 +77,14 @@ endObj </pre> 頂点ごとに透明度も変えられる. -h2. 課題13A スムースな線の描画 +h2. 課題16: スムースな線の描画 <pre syntax="ruby"> +# kadai16.rb require 'sgl' useSmooth window -200, -200, 200, 200 @@ -119,13 +110,14 @@ この二つがあればほぼ十分であるが,他に下記方法も指定できる. LINES, POINTS, LINE_STRIP, LINE_LOOP, TRIANGLES, TRIANGLE_STRIP, TRIANGLE_FAN, QUADS, QUAD_STRIP, POLYGON, -h2. 課題14A 物体の移動 +h2. 課題17: 物体の移動 <pre syntax="ruby"> +# kadai17.rb require 'sgl' useSmooth window -200, -200, 200, 200 @@ -144,13 +136,14 @@ push, pop, translate, rotateZ, scaleを使って回転移動拡大縮小などができ るようになる.pushとpopで囲まれていることが非常に重要である.また襦袢 として,translate, rotateZ, scaleの順番に指定することが重要.形を描く コマンドと,位置,回転角度などの指定を分離できる. -h2. 課題15A ボタンが押されたその時に +h2. 課題18: ボタンが押された時に <pre syntax="ruby"> +# kadai18.rb require 'sgl' def setup window -200, -200, 200, 200 background 0 @@ -184,414 +177,5 @@ それぞれ使える範囲というのもがあるのだが,通常は一つのコマンドの範囲内 でしか使うことができなかった.しかし,$のついた変数であれば,プログラ ムが動いている間ずっと残る.プログラムの最初の部分で,@$x = 0@のように して,あらかじめなんらかの値を代入することで,変数を使うということを示 す必要がある. - -h2. 課題16A 円 - -<pre syntax="ruby"> -require 'sgl' - -def setup - window -200, -200, 200, 200 - background 100 - $x = 0 - $y = 0 -end - -def onMouseDown(x, y) - $x = x - $y = y -end - -def display - color 100, 0, 0 - circle($x, $y, 100) -end - -mainloop -</pre> - -円を描く.マウスボタンを押すと,ボタンを押したところに移動する. -プログラムの構造は課題15Aで導入された構造を使っている. - -<pre syntax="ruby"> -def display - colorHSV 66, 100, 100, 30 - circle($x, $y, 100, POLYGON) -end -</pre> - -塗り潰された円を描く. - -<pre syntax="ruby"> -def display - colorHSV 33, 100, 100, 30 - circle($x, $y, 100, POLYGON, 5) -end -</pre> - -五角形を描く.いままで円といってきたものは,実は正確には正32角形である. -上記circle文の@5@のところを@32@にすると,普通の円と同じになる. - -<pre syntax="ruby"> -def display - x = mouseX - y = mouseY - colorHSV 8, 100, 100, 50 - circle(x, y, 100, POLYGON, 7) -end -</pre> - -マウスを押されないでもついてくるようにする. - -h2. 課題18A 3D - -<pre syntax="ruby"> -require 'sgl' - -window -200, -200, 200, 200 - -push -color 100, 0, 0 -translate 30, 40, 20 -rotateZ 10 -rotateY 20 -rotateX 30 -scale 20 -rect -5, -5, 5, 5 -pop - -wait -</pre> - -課題14の物体の移動の例とほとんど同じだが,@translate 30, 40, 20@として -三つの値を指定している点,@rotateZ@だけではなく,@rotateY@ @rotateX@を -使っている点が違う.三つめの値はZ軸,奥行きである.手前が正の値,奥の -ほうが負の値となる.vertexを使った形の描画は,三つの値を指定することで -3Dに対応できる. - -<pre syntax="ruby"> -require 'sgl' - -def setup - window -200, -200, 200, 200 - background 100 -end - -def display - x = mouseX - y = mouseY - - push - color 100, 0, 0 - translate x, y, 0 - rotateX x - rotateY y - scale 20 - rect -5, -5, 5, 5 - pop -end - -mainloop -</pre> - -マウスの移動と組み合わせることもできる. - -<pre syntax="ruby"> -require 'sgl' - -def setup - window -200, -200, 200, 200 - background 100 - $pos = [] # 中身が空の配列を用意する. -end - -def display - x = mouseX - y = mouseY - - $pos << [x, y] # 配列に現在のマウスの位置を追加する. - - $pos.each {|pos| # 配列の各々の要素について,{}の中身を実行する. - # その各々の要素は,posという変数に入る. - x = pos[0] - y = pos[1] - - push - colorHSV 0, 100, 100, 10 - translate x, y, 0 - rotateX x - rotateY y - scale 20 - rect -5, -5, 5, 5 - pop - } - - if 10 < $pos.length # 配列がたまりすぎた場合は,先頭から順に捨てていく. - $pos.shift - end -end - -mainloop -</pre> - -配列の使用と組み合わせてみている. - -h2. 課題19A 速度 - -<pre syntax="ruby"> -require 'sgl' - -def setup - window -200, -200, 200, 200 - background 100 - $x = 0 - $y = 0 -end - -def display - x = mouseX - y = mouseY - speed = 20.0 - vx = (x - $x)/speed - vy = (y - $y)/speed - $x = $x + vx - $y = $y + vy - color 100, 0, 0 - circle($x, $y, 50, POLYGON) -end - -mainloop -</pre> - -物の位置に加え,速度を導入する.円がマウスのところに近付こうとする. - -<pre syntax="ruby"> -require 'sgl' - -def setup - window -200, -200, 200, 200 - background 100 - $pos=[] - for i in 0..9 - $pos[i] = [-200 + i * 40, 0] # 最初の位置を指定する. - end -end - -def display - x = mouseX - y = mouseY - - speed = 10.0 - for i in 0..9 - pos = $pos[i] - vx = (x - pos[0]) / speed # マウスに吸い寄せられる速度 - vy = (y - pos[1]) / speed - speed += 2.0 # 円によって速度が異なるようにする. - pos[0] = pos[0] + vx # マウスに吸い寄せられた位置 - pos[1] = pos[1] + vy - color 100, 0, 0, 10 - circle(pos[0], pos[1], 50, POLYGON) - end -end - -mainloop -</pre> - -配列の使い方を説明する. - -<pre syntax="ruby"> -require 'sgl' - -def setup - window -200, -200, 200, 200 - background 100 - - $pos=[] - $orgpos=[] - for i in 0..19 - $pos[i] = [-200 + i * 40, 0] # 最初の位置を指定する. - $orgpos[i] = [-200 + i * 40, 0] # もう一つ別の配列にも保存する. - end -end - -def display - x = mouseX - y = mouseY - - for i in 0..19 - pos = $pos[i] # 現在の円の位置 - orgpos = $orgpos[i] # 元々の位置 - - if mouseDown # ボタンが押されているときだけマウスに吸いつく. - vx = x - pos[0] - vy = y - pos[1] - mag = Math.sqrt(vx * vx + vy * vy) - mag = mag / 40 - mag = mag * mag + 1 - vx = vx / mag - vy = vy / mag - pos[0] = pos[0] + vx - pos[1] = pos[1] + vy - end - - speed = 3.0 - vx2 = (orgpos[0] - pos[0]) / speed # 元々の位置に吸い寄せられる速度 - vy2 = (orgpos[1] - pos[1]) / speed - pos[0] = pos[0] + vx2 # マウスに吸い寄せられた位置 - pos[1] = pos[1] + vy2 - color 100, 0, 0, 30 - circle(pos[0], pos[1], 50, POLYGON) - end -end - -mainloop -</pre> - -マウスにすいよせられる円.マウスボタンを押しているときだけ反応する. - -<pre syntax="ruby"> -require 'sgl' - -def setup - window -200, -200, 200, 200 - background 100 - $xpos = [] # 配列を準備する. - $ypos = [] - for i in 0..9 - $xpos[i] = -200 + i * 40 - $ypos[i] = 0 - end -end - -def display - x = mouseX - y = mouseY - - speed = 10.0 - for i in 0..9 - vx = (x - $xpos[i]) / speed # マウスに吸い寄せられる速度 - vy = (y - $ypos[i]) / speed - speed += 2.0 # 円によって速度が異なるようにする. - $xpos[i] = $xpos[i] + vx # マウスに吸い寄せられた位置 - $ypos[i] = $ypos[i] + vy - color 100, 0, 0, 10 - circle($xpos[i], $ypos[i], 50, POLYGON) - end -end - -mainloop -</pre> - -配列の使い方を変更した. - -h2. 課題20A キーボードからの入力の仕方 - -<pre syntax="ruby"> -require 'sgl' - -def setup - window 200, 200 - background 100 - $key = 0 -end - -def onKeyDown(key) - p key - $key = key -end - -def display - colorHSV $key, 100, 100 - line $key, 0, $key, 200 -end - -mainloop -</pre> - -アルファベットのキーを押すと,keyに1〜26の値が入る.Aが1,Zが26という -関係になる. - -それら以外のキーを押したときにどのようなキーコードになるかは, -@c:\ruby\doc\rubysdl\rubysdl_const_list.txt@ に記述されている. -数字の0が押されたときは,@SDL::Key::K0@という値となる. - -h2. 課題21A 配列の使い方return - -<pre syntax="ruby"> -require 'sgl' - -def setup - window -200, -200, 200, 200 - background 100 - $pos = [] # 中身が空の配列を用意する. - for a in 0..10 # 配列の要素それぞれについて繰り返す. - $pos[a] = 0 # 中身に全部0を入れておく. - end - $index = 0 # 現在配列のどこの部分を指しているかを示す変数である. -end - -def display - $pos[$index] = mouseX # 配列の$indexの示す個所に現在のマウスのx座標を入れる. - - for a in 0..10 # 配列の要素それぞれについて繰り返します. - x = $pos[a] - color 0 - line x, -100, x, 100 # 縦線を描く. - end - - $index = $index + 1 # 現在を示す$indexを次の値のところにセットする. - if 10 < $index # $indexが配列の大きさを越えたら0にセットしなおす. - $index = 0 - end - - p $pos # $posという配列の中身を表示する. -end - -mainloop -</pre> - -配列の使い方の基本形である.縦線が,マウスの動きを追って動く.つまりマ -ウスのx座標だけを保存している.x座標,y座標を保存するとどうなるか,実 -験する. - -<pre syntax="ruby"> -require 'sgl' - -def setup - window -200, -200, 200, 200 - background 100 - $xpos = [] # 中身が空の配列を,x座標,y座標について用意する. - $ypos = [] - for a in 0..10 # 配列の要素それぞれについて繰り返す. - $xpos[a] = 0 - $ypos[a] = 0 - end - $index = 0 # 現在配列のどこの部分を指しているかを示す変数. -end - -def display - $xpos[$index] = mouseX - $ypos[$index] = mouseY - - for a in 0..10 # 配列の要素それぞれについて繰り返す. - x = $xpos[a] - y = $ypos[a] - color 0 - circle x, y, 50 - end - - $index = $index + 1 # 現在を示す$indexを,次の値のところにセットする. - if 10 < $index # $indexが配列の最大を越えたら,0にセットしなおす. - $index = 0 - end - - p $xpos - p $ypos -end - -mainloop -</pre> - -このように値を保存する配列を増やしていくようにする.