sgl 0.4.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. data/ChangeLog +254 -234
  2. data/History.txt +6 -0
  3. data/Manifest.txt +10 -0
  4. data/Rakefile +27 -7
  5. data/examples/cocoa1-basic.rb +14 -14
  6. data/examples/cocoa10-transparent.rb +26 -26
  7. data/examples/cocoa11-application.rb +13 -13
  8. data/examples/cocoa2-draw.rb +23 -23
  9. data/examples/cocoa3-affine.rb +29 -29
  10. data/examples/cocoa4-font.rb +24 -24
  11. data/examples/cocoa5-image.rb +22 -22
  12. data/examples/cocoa6-sound.rb +24 -24
  13. data/examples/cocoa7-movie.rb +40 -40
  14. data/examples/cocoa8-movieoverlay.rb +42 -42
  15. data/examples/cocoa9-streaming.rb +40 -40
  16. data/examples/opengl1-basic.rb +14 -14
  17. data/examples/opengl11-application.rb +13 -13
  18. data/examples/opengl2-draw.rb +23 -23
  19. data/examples/opengl3-affine.rb +29 -29
  20. data/examples/sample1.rb +11 -11
  21. data/examples/sample10.rb +16 -16
  22. data/examples/sample11.rb +22 -22
  23. data/examples/sample11a.rb +33 -33
  24. data/examples/sample12.rb +30 -30
  25. data/examples/sample12a.rb +35 -35
  26. data/examples/sample13.rb +116 -116
  27. data/examples/sample15.rb +24 -24
  28. data/examples/sample16.rb +31 -31
  29. data/examples/sample16a.rb +35 -35
  30. data/examples/sample6.rb +18 -18
  31. data/examples/sample7.rb +16 -16
  32. data/examples/sample9.rb +20 -20
  33. data/examples/testgl.rb +169 -169
  34. data/lib/sgl/bass.rb +46 -46
  35. data/lib/sgl/cocoa-app.rb +43 -43
  36. data/lib/sgl/cocoa-color.rb +65 -65
  37. data/lib/sgl/cocoa-draw.rb +72 -72
  38. data/lib/sgl/cocoa-event.rb +229 -229
  39. data/lib/sgl/cocoa-media.rb +144 -144
  40. data/lib/sgl/cocoa-notuse.rb +493 -493
  41. data/lib/sgl/cocoa-window.rb +203 -203
  42. data/lib/sgl/cocoa.rb +8 -8
  43. data/lib/sgl/opengl-app.rb +38 -38
  44. data/lib/sgl/opengl-color.rb +44 -44
  45. data/lib/sgl/opengl-draw.rb +260 -260
  46. data/lib/sgl/opengl-event.rb +325 -325
  47. data/lib/sgl/opengl-modules.rb +22 -22
  48. data/lib/sgl/opengl-window.rb +224 -224
  49. data/lib/sgl/opengl.rb +7 -7
  50. data/lib/sgl/sgl-button.rb +135 -135
  51. data/lib/sgl/sgl-client.rb +21 -21
  52. data/lib/sgl/sgl-color.rb +68 -82
  53. data/lib/sgl/sgl-connect.rb +9 -9
  54. data/lib/sgl/sgl-server.rb +58 -58
  55. data/lib/sgl/sgl-spring.rb +216 -216
  56. data/lib/sgl/version.rb +2 -2
  57. data/scripts/lib-txt2html.rb +130 -0
  58. data/scripts/txt2html +2 -63
  59. data/spec/sgl_spec.rb +13 -0
  60. data/spec/spec.opts +1 -0
  61. data/spec/spec_helper.rb +1 -0
  62. data/test/test_cocoa_app.rb +291 -291
  63. data/test/test_module_ruby16.rb +30 -30
  64. data/test/test_opengl_app.rb +147 -147
  65. data/test/test_opengl_basic.rb +22 -22
  66. data/test/test_opengl_fullscreen.rb +23 -23
  67. data/test/test_opengl_novice.rb +35 -35
  68. data/website/challenge1.html +91 -91
  69. data/website/challenge1.txt +3 -3
  70. data/website/challenge2.html +143 -144
  71. data/website/challenge2.txt +13 -14
  72. data/website/challenge3.html +66 -63
  73. data/website/challenge3.txt +7 -7
  74. data/website/cocoa.html +85 -88
  75. data/website/cocoa.txt +2 -4
  76. data/website/description.html +138 -138
  77. data/website/description.txt +1 -1
  78. data/website/exercise1.html +262 -264
  79. data/website/exercise1.txt +58 -53
  80. data/website/exercise2.html +241 -683
  81. data/website/exercise2.txt +11 -427
  82. data/website/exercise3.html +206 -0
  83. data/website/exercise3.txt +155 -0
  84. data/website/exercise4.html +198 -0
  85. data/website/exercise4.txt +151 -0
  86. data/website/exercise5.html +162 -0
  87. data/website/exercise5.txt +113 -0
  88. data/website/exhibition.html +84 -84
  89. data/website/howto.html +146 -134
  90. data/website/howto.txt +9 -0
  91. data/website/index.html +178 -178
  92. data/website/index.txt +20 -19
  93. data/website/sound.html +141 -141
  94. metadata +16 -3
@@ -1,16 +1,9 @@
1
- h1. 練習問題 1〜10
1
+ h1. 練習問題1
2
2
 
3
- h2. 課題1 基本 (window, background, color, line)
4
-
5
- h3. 課題1A 一本の線を描くプログラムを作る
6
-
7
- h3. 課題1B ある考えの元に3本の線を描くプログラムを作る
8
-
9
- h3. 課題1C 5本以下の直線で「変化」を表現するプログラムを作る
10
-
11
- h3. 課題1D 10本以下の直線で「ハーモニー(調和)」を表現するプログラムを作る
3
+ h2. 課題1: 一本の線を描く
12
4
 
13
5
  <pre syntax="ruby">
6
+ # kadai1.rb
14
7
  require 'sgl' # プログラムの最初に必ず書く必要がある
15
8
  window 100, 100 # windowを開く
16
9
  background 0 # 背景を黒にする
@@ -19,22 +12,38 @@ line 0, 0, 100, 100 # 左下から右上に線を描く
19
12
  wait # そのまま待つ
20
13
  </pre>
21
14
 
22
- h3. 半透明色の使い方
15
+ h2. 課題2: ある考えの元に3本の線を描く
23
16
 
24
17
  <pre syntax="ruby">
18
+ # kadai2.rb
25
19
  require 'sgl'
26
- window 100,100
27
- color 100, 0, 0 # 赤
28
- rect 10,10,70,70 # 四角
29
- color 0,0,100,50 # 半透明の青
30
- rect 30,30,90,90 # 四角を重ねてかく
20
+ window 100, 100
21
+ background 0
22
+ color 100
23
+ line 0, 0, 100, 100
24
+ line 0, 0, 100, 50
25
+ line 0, 0, 100, 25
31
26
  wait
32
27
  </pre>
33
28
 
34
- h2. 課題2A
29
+ h2. 課題3: 5本以下の直線で「変化」を表現する
30
+
31
+ <pre syntax="ruby">
32
+ # kadai3.rb
33
+ # 考えてみましょう.
34
+ </pre>
35
+
36
+ h2. 課題4: 10本以下の直線で「ハーモニー(調和)」を表現する
37
+
38
+ <pre syntax="ruby">
39
+ # kadai4.rb
40
+ # 考えてみましょう.
41
+ </pre>
42
+
43
+ h2. 課題5: 一つの変数を使って2本の直線の構成をコントロールする
35
44
 
36
- 一つの変数を使って2本の直線の構成をコントロールするプログラムを作る.
37
45
  <pre syntax="ruby">
46
+ # kadai5.rb
38
47
  require 'sgl'
39
48
  window 100, 100
40
49
  a = 50
@@ -43,10 +52,10 @@ line 100, 0, 50, a
43
52
  wait
44
53
  </pre>
45
54
 
46
- h2. 課題3A 繰り返し (for a in 0..100; end)
55
+ h2. 課題6: 繰り返しを使った形態を描く
47
56
 
48
- 繰り返しを使った形態を描く.
49
57
  <pre syntax="ruby">
58
+ # kadai6.rb
50
59
  require 'sgl'
51
60
  window 100, 100
52
61
  for a in 20..80
@@ -56,10 +65,10 @@ end
56
65
  wait
57
66
  </pre>
58
67
 
59
- h2. 課題4A 計算 (+ - * /)
68
+ h2. 課題7: 計算を使った形態を描く
60
69
 
61
- 計算を使った形態をかくプログラムを作る.
62
70
  <pre syntax="ruby">
71
+ # kadai7.rb
63
72
  require 'sgl'
64
73
  window 100, 100
65
74
  for a in 20..40
@@ -69,11 +78,23 @@ end
69
78
  wait
70
79
  </pre>
71
80
 
72
- h2. 課題6A kadai6a.rb
81
+ h2. 課題8: 半透明を使った形態を描く
73
82
 
74
- h3. 入れ子構造 6A 格子状にひろがる形態を作る.
75
83
  <pre syntax="ruby">
76
- # kadai6a.rb
84
+ # kadai8.rb
85
+ require 'sgl'
86
+ window 100,100
87
+ color 100, 0, 0 # 赤
88
+ rect 10,10,70,70 # 四角
89
+ color 0,0,100,50 # 半透明の青
90
+ rect 30,30,90,90 # 四角を重ねてかく
91
+ wait
92
+ </pre>
93
+
94
+ h2. 課題9: 入れ子構造,格子状にひろがる形態を作る
95
+
96
+ <pre syntax="ruby">
97
+ # kadai9.rb
77
98
  require 'sgl'
78
99
  window 200,200
79
100
  for a in 0..10
@@ -85,11 +106,10 @@ end
85
106
  wait
86
107
  </pre>
87
108
 
88
- h2. 課題7A kadai7a.rb
109
+ h2. 課題10: 条件分岐,画面の左右で違う形態を描く
89
110
 
90
- h3. 質問 (if 50 &lt; a; end) 7A 画面の左右で違う形態を描く.
91
111
  <pre syntax="ruby">
92
- # kadai7a.rb
112
+ # kadai10.rb
93
113
  require 'sgl'
94
114
  window 200,200
95
115
  for a in 0..200
@@ -103,12 +123,10 @@ end
103
123
  wait
104
124
  </pre>
105
125
 
106
- h2. 課題8A
126
+ h2. 課題11: 自分なりの命令を作り,それを用いた形態を描く
107
127
 
108
- h3. defを使って自分なりのコマンドを作り,それを用いた形態を描く.
109
-
110
- ファイル名 kadai8a.rb
111
128
  <pre syntax="ruby">
129
+ # kadai11.rb
112
130
  require 'sgl'
113
131
  window 100,100
114
132
  background 100
@@ -128,16 +146,14 @@ my_rect(60, 60, 80, 90, 70, 90)
128
146
  wait
129
147
  </pre>
130
148
 
131
- defというコマンドで関数を定義する.自分がよく使う形,例えば枠付きの塗
132
- りつぶされた四角形を定義する.defの後に続くのが関数名である.アルファ
133
- ベットの小文字から始まっている必要がある.
134
-
135
- h2. 課題9A
149
+ defというコマンドで命令を定義する.ここでは,枠付きの塗りつぶされた四
150
+ 角形を定義している.defの後に続くのが命令の名前となる.アルファベット
151
+ の小文字から始まっている必要がある.
136
152
 
137
- h3. flipを使ってアニメーションを作る.
153
+ h2. 課題12: flipを使ってアニメーションを作る
138
154
 
139
- ファイル名 kadai9a.rb
140
155
  <pre syntax="ruby">
156
+ # kadai12.rb
141
157
  require 'sgl'
142
158
  window 100,100
143
159
  loop do
@@ -149,17 +165,15 @@ end
149
165
  wait
150
166
  </pre>
151
167
 
152
- flipというところで、ちょうど紙をめくるように次の画面を表示させている。
168
+ flipというところで,ちょうど紙をめくるように次の画面を表示させている.
153
169
  @loop do 〜〜〜 end@ で,その間を無限に繰り返す.
154
170
 
155
- h2. 課題10A
156
-
157
- h3. HSVによる色指定を使って,自分なりの色グラデーションを作る。
171
+ h2. 課題13: HSVによる色指定を使り,自分なりの色グラデーションを作る
158
172
 
159
173
  静止画でもアニメーションでもよい.(colorHSV, backgroundHSV)
160
174
 
161
- ファイル名 kadai10a.rb
162
175
  <pre syntax="ruby">
176
+ # kadai13.rb
163
177
  require 'sgl'
164
178
  window 100,100
165
179
  background 100
@@ -181,12 +195,3 @@ wait
181
195
 
182
196
  * 4番目のパラメーターを使って,透明度を設定することもできる.
183
197
  * backgroundHSVというコマンドもある.
184
-
185
- h2. 課題の注意点
186
-
187
- 課題はいずれもwindowサイズなどは自由.課題例は100,100のサイズになって
188
- いるが,より大きいwindowサイズを選択してもよい。
189
-
190
- ファイル名は必ず指定のものにし,Z:に保存する.指定のファイル名のファイ
191
- ルが保存されているかどうかで課題提出を判定する.ファイル名が違う場合は
192
- 提出してないことになってしまうので,注意する.
@@ -1,683 +1,241 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
- <head>
5
- <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
- <title>
8
- 練習問題 11〜21
9
- </title>
10
- <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
- <style>
12
-
13
- </style>
14
- <script type="text/javascript">
15
- window.onload = function() {
16
- settings = {
17
- tl: { radius: 10 },
18
- tr: { radius: 10 },
19
- bl: { radius: 10 },
20
- br: { radius: 10 },
21
- antiAlias: true,
22
- autoPad: true,
23
- validTags: ["div"]
24
- }
25
- var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
- versionBox.applyCornersToAll();
27
- }
28
- </script>
29
- </head>
30
- <body>
31
- <div id="main">
32
-
33
- <h1>練習問題 11〜21</h1>
34
- <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/sgl"; return false'>
35
- <p>Get Version</p>
36
- <a href="http://rubyforge.org/projects/sgl" class="numbers">0.4.0</a>
37
- </div>
38
- <h2>課題15 マウスのボタンが押された時に</h2>
39
-
40
-
41
- <h2>課題16 円の描き方</h2>
42
-
43
-
44
- <h2>課題18 三次元</h2>
45
-
46
-
47
- <h2>課題19 速度</h2>
48
-
49
-
50
- <h2>課題20 キーボードからの入力</h2>
51
-
52
-
53
- <h2>課題21 配列の使い方</h2>
54
-
55
-
56
- <h2>課題11A マウスの位置に反応する形</h2>
57
-
58
-
59
- <pre syntax="ruby">
60
- require 'sgl'
61
-
62
- window 200,200
63
-
64
- loop do
65
- x = mouseX
66
- y = mouseY
67
- rect x-5, y-5, x+5, y+5
68
- flip
69
- end
70
- </pre>
71
-
72
- <p>mouseXとmouseYでマウス位置を取得する.rectで四角形を描画する.</p>
73
-
74
-
75
- <p>rectの前に<code>color x, y, 0</code>をいれてみる.</p>
76
-
77
-
78
- rectの後に下記をいれてみる.
79
- <pre syntax="ruby">
80
- line 0, 0, x, y
81
- line 200, 0, x, y
82
- line 0, 200, x, y
83
- line 200, 200, x, y
84
- </pre>
85
-
86
- <h2>課題12A 複雑な形の描画</h2>
87
-
88
-
89
- <pre syntax="ruby">
90
- require 'sgl'
91
-
92
- window -200, -200, 200, 200
93
-
94
- beginObj(POLYGON)
95
- vertex 60, 90
96
- vertex -120, 60
97
- vertex -90, -90
98
- vertex 120, -90
99
- endObj
100
-
101
- wait
102
- </pre>
103
-
104
- <p><code>window -200, -200, 200, 200</code>のようにして四つの値を指定できる.
105
- beginObjとendObjではさまれた領域で形を描く.</p>
106
-
107
-
108
- <pre syntax="ruby">
109
- beginObj(POLYGON)
110
- color 100, 0, 0, 100
111
- vertex 60, 90
112
- color 0, 100, 0, 100
113
- vertex -120, 60
114
- color 0, 0, 100, 100
115
- vertex -90, -90
116
- color 100, 100, 0, 100
117
- vertex 120, -90
118
- endObj
119
- </pre>
120
-
121
- <p>頂点ごとに色を指定できる.</p>
122
-
123
-
124
- <pre syntax="ruby">
125
- beginObj(POLYGON)
126
- color 100, 0, 0, 0
127
- vertex 60, 90
128
- color 0, 100, 0, 100
129
- vertex -120, 60
130
- color 0, 0, 100, 100
131
- vertex -90, -90
132
- color 100, 100, 0, 0
133
- vertex 120, -90
134
- endObj
135
- </pre>
136
-
137
- <p>頂点ごとに透明度も変えられる.</p>
138
-
139
-
140
- <h2>課題13A スムースな線の描画</h2>
141
-
142
-
143
- <pre syntax="ruby">
144
- require 'sgl'
145
-
146
- useSmooth
147
-
148
- window -200, -200, 200, 200
149
-
150
- beginObj(LINE_LOOP)
151
- color 100, 0, 0, 100
152
- vertex 60, 90
153
- color 0, 100, 0, 50
154
- vertex -120, 60
155
- color 0, 0, 100, 50
156
- vertex -90, -90
157
- color 100, 100, 0, 100
158
- vertex 120, -90
159
- endObj
160
-
161
- wait
162
- </pre>
163
-
164
- <p>windowの前にuseSmoothを指定することによって,アンチエイリアスを
165
- かけることができる.</p>
166
-
167
-
168
- <p>beginObjの括弧の中は,<code>POLYGON</code>または<code>LINE_LOOP</code>を指定する.
169
- この二つがあればほぼ十分であるが,他に下記方法も指定できる.</p>
170
-
171
-
172
- <p><span class="caps">LINES</span>, POINTS, <span class="caps">LINE</span>_STRIP, <span class="caps">LINE</span>_LOOP, <span class="caps">TRIANGLES</span>, TRIANGLE_STRIP,
173
- <span class="caps">TRIANGLE</span>_FAN, <span class="caps">QUADS</span>, QUAD_STRIP, <span class="caps">POLYGON</span>,</p>
174
-
175
-
176
- <h2>課題14A 物体の移動</h2>
177
-
178
-
179
- <pre syntax="ruby">
180
- require 'sgl'
181
-
182
- useSmooth
183
-
184
- window -200, -200, 200, 200
185
-
186
- push
187
- translate 100, 0
188
- rotateZ 10
189
- scale 2
190
- rect -5, -5, 5, 5
191
- pop
192
-
193
- wait
194
- </pre>
195
-
196
- <p>今回でてきた新しいコマンド,
197
- push, pop, translate, rotateZ, scaleを使って回転移動拡大縮小などができ
198
- るようになる.pushとpopで囲まれていることが非常に重要である.また襦袢
199
- として,translate, rotateZ, scaleの順番に指定することが重要.形を描く
200
- コマンドと,位置,回転角度などの指定を分離できる.</p>
201
-
202
-
203
- <h2>課題15A ボタンが押されたその時に</h2>
204
-
205
-
206
- <pre syntax="ruby">
207
- require 'sgl'
208
-
209
- def setup
210
- window -200, -200, 200, 200
211
- background 0
212
- $x = 0
213
- $y = 0
214
- end
215
-
216
- def onMouseDown(x, y)
217
- $x = x
218
- $y = y
219
- end
220
-
221
- def display
222
- line 0, 0, $x, $y
223
- end
224
-
225
- mainloop
226
- </pre>
227
-
228
- <p>いままではプログラムはかかれている順番通りに実行されるものだったが,こ
229
- こでは違う順序となっている.まず最初にコマンドを登録し,それが後に呼ば
230
- れて実行されることになる.このようにプログラムの実行順番が違う方式をこ
231
- れから採用する.</p>
232
-
233
-
234
- <p>setup, onMouseDown, displayというコマンドを登録する.その後mainloopと
235
- いうコマンドを呼ぶ.このメインループの中で,全てのプログラムが実行され,
236
- 適宜setup, displayが呼び出される.マウスのボタンが押された瞬間に,
237
- onMouseDownというコマンドが呼ばれる.</p>
238
-
239
-
240
- <p>そのonMouseDownの前に,$xという$のついた変数がつかわれている.変数には
241
- それぞれ使える範囲というのもがあるのだが,通常は一つのコマンドの範囲内
242
- でしか使うことができなかった.しかし,$のついた変数であれば,プログラ
243
- ムが動いている間ずっと残る.プログラムの最初の部分で,<code>$x = 0</code>のように
244
- して,あらかじめなんらかの値を代入することで,変数を使うということを示
245
- す必要がある.</p>
246
-
247
-
248
- <h2>課題16A 円</h2>
249
-
250
-
251
- <pre syntax="ruby">
252
- require 'sgl'
253
-
254
- def setup
255
- window -200, -200, 200, 200
256
- background 100
257
- $x = 0
258
- $y = 0
259
- end
260
-
261
- def onMouseDown(x, y)
262
- $x = x
263
- $y = y
264
- end
265
-
266
- def display
267
- color 100, 0, 0
268
- circle($x, $y, 100)
269
- end
270
-
271
- mainloop
272
- </pre>
273
-
274
- <p>円を描く.マウスボタンを押すと,ボタンを押したところに移動する.
275
- プログラムの構造は課題15Aで導入された構造を使っている.</p>
276
-
277
-
278
- <pre syntax="ruby">
279
- def display
280
- colorHSV 66, 100, 100, 30
281
- circle($x, $y, 100, POLYGON)
282
- end
283
- </pre>
284
-
285
- <p>塗り潰された円を描く.</p>
286
-
287
-
288
- <pre syntax="ruby">
289
- def display
290
- colorHSV 33, 100, 100, 30
291
- circle($x, $y, 100, POLYGON, 5)
292
- end
293
- </pre>
294
-
295
- <p>五角形を描く.いままで円といってきたものは,実は正確には正32角形である.
296
- 上記circle文の<code>5</code>のところを<code>32</code>にすると,普通の円と同じになる.</p>
297
-
298
-
299
- <pre syntax="ruby">
300
- def display
301
- x = mouseX
302
- y = mouseY
303
- colorHSV 8, 100, 100, 50
304
- circle(x, y, 100, POLYGON, 7)
305
- end
306
- </pre>
307
-
308
- <p>マウスを押されないでもついてくるようにする.</p>
309
-
310
-
311
- <h2>課題18A 3D</h2>
312
-
313
-
314
- <pre syntax="ruby">
315
- require 'sgl'
316
-
317
- window -200, -200, 200, 200
318
-
319
- push
320
- color 100, 0, 0
321
- translate 30, 40, 20
322
- rotateZ 10
323
- rotateY 20
324
- rotateX 30
325
- scale 20
326
- rect -5, -5, 5, 5
327
- pop
328
-
329
- wait
330
- </pre>
331
-
332
- <p>課題14の物体の移動の例とほとんど同じだが,<code>translate 30, 40, 20</code>として
333
- 三つの値を指定している点,<code>rotateZ</code>だけではなく,<code>rotateY</code> <code>rotateX</code>を
334
- 使っている点が違う.三つめの値はZ軸,奥行きである.手前が正の値,奥の
335
- ほうが負の値となる.vertexを使った形の描画は,三つの値を指定することで
336
- 3Dに対応できる.</p>
337
-
338
-
339
- <pre syntax="ruby">
340
- require 'sgl'
341
-
342
- def setup
343
- window -200, -200, 200, 200
344
- background 100
345
- end
346
-
347
- def display
348
- x = mouseX
349
- y = mouseY
350
-
351
- push
352
- color 100, 0, 0
353
- translate x, y, 0
354
- rotateX x
355
- rotateY y
356
- scale 20
357
- rect -5, -5, 5, 5
358
- pop
359
- end
360
-
361
- mainloop
362
- </pre>
363
-
364
- <p>マウスの移動と組み合わせることもできる.</p>
365
-
366
-
367
- <pre syntax="ruby">
368
- require 'sgl'
369
-
370
- def setup
371
- window -200, -200, 200, 200
372
- background 100
373
- $pos = [] # 中身が空の配列を用意する.
374
- end
375
-
376
- def display
377
- x = mouseX
378
- y = mouseY
379
-
380
- $pos &lt;&lt; [x, y] # 配列に現在のマウスの位置を追加する.
381
-
382
- $pos.each {|pos| # 配列の各々の要素について,{}の中身を実行する.
383
- # その各々の要素は,posという変数に入る.
384
- x = pos[0]
385
- y = pos[1]
386
-
387
- push
388
- colorHSV 0, 100, 100, 10
389
- translate x, y, 0
390
- rotateX x
391
- rotateY y
392
- scale 20
393
- rect -5, -5, 5, 5
394
- pop
395
- }
396
-
397
- if 10 &lt; $pos.length # 配列がたまりすぎた場合は,先頭から順に捨てていく.
398
- $pos.shift
399
- end
400
- end
401
-
402
- mainloop
403
- </pre>
404
-
405
- <p>配列の使用と組み合わせてみている.</p>
406
-
407
-
408
- <h2>課題19A 速度</h2>
409
-
410
-
411
- <pre syntax="ruby">
412
- require 'sgl'
413
-
414
- def setup
415
- window -200, -200, 200, 200
416
- background 100
417
- $x = 0
418
- $y = 0
419
- end
420
-
421
- def display
422
- x = mouseX
423
- y = mouseY
424
- speed = 20.0
425
- vx = (x - $x)/speed
426
- vy = (y - $y)/speed
427
- $x = $x + vx
428
- $y = $y + vy
429
- color 100, 0, 0
430
- circle($x, $y, 50, POLYGON)
431
- end
432
-
433
- mainloop
434
- </pre>
435
-
436
- <p>物の位置に加え,速度を導入する.円がマウスのところに近付こうとする.</p>
437
-
438
-
439
- <pre syntax="ruby">
440
- require 'sgl'
441
-
442
- def setup
443
- window -200, -200, 200, 200
444
- background 100
445
- $pos=[]
446
- for i in 0..9
447
- $pos[i] = [-200 + i * 40, 0] # 最初の位置を指定する.
448
- end
449
- end
450
-
451
- def display
452
- x = mouseX
453
- y = mouseY
454
-
455
- speed = 10.0
456
- for i in 0..9
457
- pos = $pos[i]
458
- vx = (x - pos[0]) / speed # マウスに吸い寄せられる速度
459
- vy = (y - pos[1]) / speed
460
- speed += 2.0 # 円によって速度が異なるようにする.
461
- pos[0] = pos[0] + vx # マウスに吸い寄せられた位置
462
- pos[1] = pos[1] + vy
463
- color 100, 0, 0, 10
464
- circle(pos[0], pos[1], 50, POLYGON)
465
- end
466
- end
467
-
468
- mainloop
469
- </pre>
470
-
471
- <p>配列の使い方を説明する.</p>
472
-
473
-
474
- <pre syntax="ruby">
475
- require 'sgl'
476
-
477
- def setup
478
- window -200, -200, 200, 200
479
- background 100
480
-
481
- $pos=[]
482
- $orgpos=[]
483
- for i in 0..19
484
- $pos[i] = [-200 + i * 40, 0] # 最初の位置を指定する.
485
- $orgpos[i] = [-200 + i * 40, 0] # もう一つ別の配列にも保存する.
486
- end
487
- end
488
-
489
- def display
490
- x = mouseX
491
- y = mouseY
492
-
493
- for i in 0..19
494
- pos = $pos[i] # 現在の円の位置
495
- orgpos = $orgpos[i] # 元々の位置
496
-
497
- if mouseDown # ボタンが押されているときだけマウスに吸いつく.
498
- vx = x - pos[0]
499
- vy = y - pos[1]
500
- mag = Math.sqrt(vx * vx + vy * vy)
501
- mag = mag / 40
502
- mag = mag * mag + 1
503
- vx = vx / mag
504
- vy = vy / mag
505
- pos[0] = pos[0] + vx
506
- pos[1] = pos[1] + vy
507
- end
508
-
509
- speed = 3.0
510
- vx2 = (orgpos[0] - pos[0]) / speed # 元々の位置に吸い寄せられる速度
511
- vy2 = (orgpos[1] - pos[1]) / speed
512
- pos[0] = pos[0] + vx2 # マウスに吸い寄せられた位置
513
- pos[1] = pos[1] + vy2
514
- color 100, 0, 0, 30
515
- circle(pos[0], pos[1], 50, POLYGON)
516
- end
517
- end
518
-
519
- mainloop
520
- </pre>
521
-
522
- <p>マウスにすいよせられる円.マウスボタンを押しているときだけ反応する.</p>
523
-
524
-
525
- <pre syntax="ruby">
526
- require 'sgl'
527
-
528
- def setup
529
- window -200, -200, 200, 200
530
- background 100
531
- $xpos = [] # 配列を準備する.
532
- $ypos = []
533
- for i in 0..9
534
- $xpos[i] = -200 + i * 40
535
- $ypos[i] = 0
536
- end
537
- end
538
-
539
- def display
540
- x = mouseX
541
- y = mouseY
542
-
543
- speed = 10.0
544
- for i in 0..9
545
- vx = (x - $xpos[i]) / speed # マウスに吸い寄せられる速度
546
- vy = (y - $ypos[i]) / speed
547
- speed += 2.0 # 円によって速度が異なるようにする.
548
- $xpos[i] = $xpos[i] + vx # マウスに吸い寄せられた位置
549
- $ypos[i] = $ypos[i] + vy
550
- color 100, 0, 0, 10
551
- circle($xpos[i], $ypos[i], 50, POLYGON)
552
- end
553
- end
554
-
555
- mainloop
556
- </pre>
557
-
558
- <p>配列の使い方を変更した.</p>
559
-
560
-
561
- <h2>課題20A キーボードからの入力の仕方</h2>
562
-
563
-
564
- <pre syntax="ruby">
565
- require 'sgl'
566
-
567
- def setup
568
- window 200, 200
569
- background 100
570
- $key = 0
571
- end
572
-
573
- def onKeyDown(key)
574
- p key
575
- $key = key
576
- end
577
-
578
- def display
579
- colorHSV $key, 100, 100
580
- line $key, 0, $key, 200
581
- end
582
-
583
- mainloop
584
- </pre>
585
-
586
- <p>アルファベットのキーを押すと,keyに1〜26の値が入る.Aが1,Zが26という
587
- 関係になる.</p>
588
-
589
-
590
- <p>それら以外のキーを押したときにどのようなキーコードになるかは,
591
- <code>c:\ruby\doc\rubysdl\rubysdl_const_list.txt</code> に記述されている.
592
- 数字の0が押されたときは,<code>SDL::Key::K0</code>という値となる.</p>
593
-
594
-
595
- <h2>課題21A 配列の使い方return</h2>
596
-
597
-
598
- <pre syntax="ruby">
599
- require 'sgl'
600
-
601
- def setup
602
- window -200, -200, 200, 200
603
- background 100
604
- $pos = [] # 中身が空の配列を用意する.
605
- for a in 0..10 # 配列の要素それぞれについて繰り返す.
606
- $pos[a] = 0 # 中身に全部0を入れておく.
607
- end
608
- $index = 0 # 現在配列のどこの部分を指しているかを示す変数である.
609
- end
610
-
611
- def display
612
- $pos[$index] = mouseX # 配列の$indexの示す個所に現在のマウスのx座標を入れる.
613
-
614
- for a in 0..10 # 配列の要素それぞれについて繰り返します.
615
- x = $pos[a]
616
- color 0
617
- line x, -100, x, 100 # 縦線を描く.
618
- end
619
-
620
- $index = $index + 1 # 現在を示す$indexを次の値のところにセットする.
621
- if 10 &lt; $index # $indexが配列の大きさを越えたら0にセットしなおす.
622
- $index = 0
623
- end
624
-
625
- p $pos # $posという配列の中身を表示する.
626
- end
627
-
628
- mainloop
629
- </pre>
630
-
631
- <p>配列の使い方の基本形である.縦線が,マウスの動きを追って動く.つまりマ
632
- ウスのx座標だけを保存している.x座標,y座標を保存するとどうなるか,実
633
- 験する.</p>
634
-
635
-
636
- <pre syntax="ruby">
637
- require 'sgl'
638
-
639
- def setup
640
- window -200, -200, 200, 200
641
- background 100
642
- $xpos = [] # 中身が空の配列を,x座標,y座標について用意する.
643
- $ypos = []
644
- for a in 0..10 # 配列の要素それぞれについて繰り返す.
645
- $xpos[a] = 0
646
- $ypos[a] = 0
647
- end
648
- $index = 0 # 現在配列のどこの部分を指しているかを示す変数.
649
- end
650
-
651
- def display
652
- $xpos[$index] = mouseX
653
- $ypos[$index] = mouseY
654
-
655
- for a in 0..10 # 配列の要素それぞれについて繰り返す.
656
- x = $xpos[a]
657
- y = $ypos[a]
658
- color 0
659
- circle x, y, 50
660
- end
661
-
662
- $index = $index + 1 # 現在を示す$indexを,次の値のところにセットする.
663
- if 10 &lt; $index # $indexが配列の最大を越えたら,0にセットしなおす.
664
- $index = 0
665
- end
666
-
667
- p $xpos
668
- p $ypos
669
- end
670
-
671
- mainloop
672
- </pre>
673
-
674
- <p>このように値を保存する配列を増やしていくようにする.</p>
675
- <p class="coda">
676
- 20th June 2007<br>
677
- </p>
678
- </div>
679
-
680
- <!-- insert site tracking codes here, like Google Urchin -->
681
-
682
- </body>
683
- </html>
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
+ <title>
8
+ 練習問題2
9
+ </title>
10
+ <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
+ <style>
12
+
13
+ </style>
14
+ <script type="text/javascript">
15
+ window.onload = function() {
16
+ settings = {
17
+ tl: { radius: 10 },
18
+ tr: { radius: 10 },
19
+ bl: { radius: 10 },
20
+ br: { radius: 10 },
21
+ antiAlias: true,
22
+ autoPad: true,
23
+ validTags: ["div"]
24
+ }
25
+ var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
+ versionBox.applyCornersToAll();
27
+ }
28
+ </script>
29
+ </head>
30
+ <body>
31
+ <div id="main">
32
+
33
+ <h1>練習問題2</h1>
34
+ <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/sgl"; return false'>
35
+ <p>Get Version</p>
36
+ <a href="http://rubyforge.org/projects/sgl" class="numbers">1.0.0</a>
37
+ </div>
38
+ <h2>課題14: マウスの位置に反応する形</h2>
39
+
40
+
41
+ <pre syntax="ruby">
42
+ # kadai14.rb
43
+ require 'sgl'
44
+
45
+ window 200,200
46
+
47
+ loop do
48
+ x = mouseX
49
+ y = mouseY
50
+ rect x-5, y-5, x+5, y+5
51
+ flip
52
+ end
53
+ </pre>
54
+
55
+ <p>mouseXとmouseYでマウス位置を取得する.rectで四角形を描画する.</p>
56
+
57
+
58
+ <p>rectの前に<code>color x, y, 0</code>をいれてみる.</p>
59
+
60
+
61
+ rectの後に下記をいれてみる.
62
+ <pre syntax="ruby">
63
+ line 0, 0, x, y
64
+ line 200, 0, x, y
65
+ line 0, 200, x, y
66
+ line 200, 200, x, y
67
+ </pre>
68
+
69
+ <h2>課題15: 複雑な形の描画</h2>
70
+
71
+
72
+ <pre syntax="ruby">
73
+ # kadai15.rb
74
+ require 'sgl'
75
+
76
+ window -200, -200, 200, 200
77
+
78
+ beginObj(POLYGON)
79
+ vertex 60, 90
80
+ vertex -120, 60
81
+ vertex -90, -90
82
+ vertex 120, -90
83
+ endObj
84
+
85
+ wait
86
+ </pre>
87
+
88
+ <p><code>window -200, -200, 200, 200</code>のようにして四つの値を指定できる.
89
+ beginObjとendObjではさまれた領域で形を描く.</p>
90
+
91
+
92
+ <pre syntax="ruby">
93
+ beginObj(POLYGON)
94
+ color 100, 0, 0, 100
95
+ vertex 60, 90
96
+ color 0, 100, 0, 100
97
+ vertex -120, 60
98
+ color 0, 0, 100, 100
99
+ vertex -90, -90
100
+ color 100, 100, 0, 100
101
+ vertex 120, -90
102
+ endObj
103
+ </pre>
104
+
105
+ <p>頂点ごとに色を指定できる.</p>
106
+
107
+
108
+ <pre syntax="ruby">
109
+ beginObj(POLYGON)
110
+ color 100, 0, 0, 0
111
+ vertex 60, 90
112
+ color 0, 100, 0, 100
113
+ vertex -120, 60
114
+ color 0, 0, 100, 100
115
+ vertex -90, -90
116
+ color 100, 100, 0, 0
117
+ vertex 120, -90
118
+ endObj
119
+ </pre>
120
+
121
+ <p>頂点ごとに透明度も変えられる.</p>
122
+
123
+
124
+ <h2>課題16: スムースな線の描画</h2>
125
+
126
+
127
+ <pre syntax="ruby">
128
+ # kadai16.rb
129
+ require 'sgl'
130
+
131
+ useSmooth
132
+
133
+ window -200, -200, 200, 200
134
+
135
+ beginObj(LINE_LOOP)
136
+ color 100, 0, 0, 100
137
+ vertex 60, 90
138
+ color 0, 100, 0, 50
139
+ vertex -120, 60
140
+ color 0, 0, 100, 50
141
+ vertex -90, -90
142
+ color 100, 100, 0, 100
143
+ vertex 120, -90
144
+ endObj
145
+
146
+ wait
147
+ </pre>
148
+
149
+ <p>windowの前にuseSmoothを指定することによって,アンチエイリアスを
150
+ かけることができる.</p>
151
+
152
+
153
+ <p>beginObjの括弧の中は,<code>POLYGON</code>または<code>LINE_LOOP</code>を指定する.
154
+ この二つがあればほぼ十分であるが,他に下記方法も指定できる.</p>
155
+
156
+
157
+ <p><span class="caps">LINES</span>, POINTS, <span class="caps">LINE</span>_STRIP, <span class="caps">LINE</span>_LOOP, <span class="caps">TRIANGLES</span>, TRIANGLE_STRIP,
158
+ <span class="caps">TRIANGLE</span>_FAN, <span class="caps">QUADS</span>, QUAD_STRIP, <span class="caps">POLYGON</span>,</p>
159
+
160
+
161
+ <h2>課題17: 物体の移動</h2>
162
+
163
+
164
+ <pre syntax="ruby">
165
+ # kadai17.rb
166
+ require 'sgl'
167
+
168
+ useSmooth
169
+
170
+ window -200, -200, 200, 200
171
+
172
+ push
173
+ translate 100, 0
174
+ rotateZ 10
175
+ scale 2
176
+ rect -5, -5, 5, 5
177
+ pop
178
+
179
+ wait
180
+ </pre>
181
+
182
+ <p>今回でてきた新しいコマンド,
183
+ push, pop, translate, rotateZ, scaleを使って回転移動拡大縮小などができ
184
+ るようになる.pushとpopで囲まれていることが非常に重要である.また襦袢
185
+ として,translate, rotateZ, scaleの順番に指定することが重要.形を描く
186
+ コマンドと,位置,回転角度などの指定を分離できる.</p>
187
+
188
+
189
+ <h2>課題18: ボタンが押された時に</h2>
190
+
191
+
192
+ <pre syntax="ruby">
193
+ # kadai18.rb
194
+ require 'sgl'
195
+
196
+ def setup
197
+ window -200, -200, 200, 200
198
+ background 0
199
+ $x = 0
200
+ $y = 0
201
+ end
202
+
203
+ def onMouseDown(x, y)
204
+ $x = x
205
+ $y = y
206
+ end
207
+
208
+ def display
209
+ line 0, 0, $x, $y
210
+ end
211
+
212
+ mainloop
213
+ </pre>
214
+
215
+ <p>いままではプログラムはかかれている順番通りに実行されるものだったが,こ
216
+ こでは違う順序となっている.まず最初にコマンドを登録し,それが後に呼ば
217
+ れて実行されることになる.このようにプログラムの実行順番が違う方式をこ
218
+ れから採用する.</p>
219
+
220
+
221
+ <p>setup, onMouseDown, displayというコマンドを登録する.その後mainloopと
222
+ いうコマンドを呼ぶ.このメインループの中で,全てのプログラムが実行され,
223
+ 適宜setup, displayが呼び出される.マウスのボタンが押された瞬間に,
224
+ onMouseDownというコマンドが呼ばれる.</p>
225
+
226
+
227
+ <p>そのonMouseDownの前に,$xという$のついた変数がつかわれている.変数には
228
+ それぞれ使える範囲というのもがあるのだが,通常は一つのコマンドの範囲内
229
+ でしか使うことができなかった.しかし,$のついた変数であれば,プログラ
230
+ ムが動いている間ずっと残る.プログラムの最初の部分で,<code>$x = 0</code>のように
231
+ して,あらかじめなんらかの値を代入することで,変数を使うということを示
232
+ す必要がある.</p>
233
+ <p class="coda">
234
+ 30th June 2007<br>
235
+ </p>
236
+ </div>
237
+
238
+ <!-- insert site tracking codes here, like Google Urchin -->
239
+
240
+ </body>
241
+ </html>