nyle 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -3
  3. data/lib/nyle.rb +54 -5
  4. data/lib/nyle/frame.rb +45 -12
  5. data/lib/nyle/screen.rb +28 -18
  6. data/lib/nyle/version.rb +1 -1
  7. data/samples/application/block.rb +1 -1
  8. data/samples/application/clock.rb +1 -1
  9. data/samples/application/falling.rb +1 -1
  10. data/samples/application/flight.rb +1 -1
  11. data/samples/application/pendulum.rb +242 -0
  12. data/samples/application/sketch.rb +3 -3
  13. data/samples/application/sugar.rb +1 -1
  14. data/samples/application/tree.rb +1 -1
  15. data/samples/basic/color_chart.rb +17 -9
  16. data/samples/basic/color_pixel.rb +1 -1
  17. data/samples/basic/draw_circle.rb +1 -1
  18. data/samples/basic/draw_line.rb +1 -1
  19. data/samples/basic/draw_rect.rb +1 -1
  20. data/samples/basic/draw_shape.rb +3 -3
  21. data/samples/basic/draw_text.rb +1 -1
  22. data/samples/basic/image_click.rb +1 -1
  23. data/samples/basic/image_rotate.rb +1 -1
  24. data/samples/basic/image_rpg.rb +1 -1
  25. data/samples/basic/keyboard.rb +1 -1
  26. data/samples/basic/pause.rb +34 -0
  27. data/samples/basic/random_walk.rb +4 -4
  28. data/samples/basic/random_walk_trace.rb +4 -4
  29. data/samples/basic/random_walk_trace_fadeout.rb +55 -0
  30. data/samples/basic/rotation.rb +35 -0
  31. data/samples/launcher.rb +1 -1
  32. data/samples/tutorial/tut_a10.rb +1 -1
  33. data/samples/tutorial/tut_a20.rb +1 -1
  34. data/samples/tutorial/tut_a30.rb +1 -1
  35. data/samples/tutorial/tut_a40.rb +1 -1
  36. data/samples/tutorial/tut_a45.rb +1 -1
  37. data/samples/tutorial/tut_a50.rb +1 -1
  38. data/samples/tutorial/tut_a60.rb +1 -1
  39. data/samples/tutorial/tut_a70.rb +1 -1
  40. data/samples/tutorial/tut_b10.rb +1 -1
  41. data/samples/tutorial/tut_b20.rb +1 -1
  42. data/samples/tutorial/tut_b30.rb +1 -1
  43. data/samples/tutorial/tut_b40.rb +1 -1
  44. metadata +7 -5
  45. data/samples/tips/.gitkeep +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a33dd14f3c5ebe3aca4a68321822a9f9e43cae7cc241762d1565c5958deb70a2
4
- data.tar.gz: 07f1ef3ff7c4ecb06a458434085946bd891615fcc636e07fa5fddb75b07e98ef
3
+ metadata.gz: 98fb894b0df670d4987b952d424e3a9d3d0279fb97e4f074a23db75318b7e26a
4
+ data.tar.gz: cc983b74f64805584372049038945e24c658d3a645e8473517bbcc896fb68ba0
5
5
  SHA512:
6
- metadata.gz: 80f2cb71e85a567a9b6d36ac41ec21f9fb6b55fbe1863a645ccd83e150af46ebc14a70c24ba7216954f720913a8dc14475c6858e49451c6c7afacf4c91a3d1ac
7
- data.tar.gz: ef83253f3dfe474d064940cf51ba2f20d1e299c3b51633509777995acffda7f6d80f10d34713b3f1754ea8177942de057f7b11b0911873881de129cb230f6849
6
+ metadata.gz: 983b3c340b11617cfb9e8d636fda9ccc1a36039bdf572bc6e7fe250aff722a2d283309ca23f6b54f3ba4fde01e8aa04227a2b27808d8fefc535a5268a2456019
7
+ data.tar.gz: 3e8ec70297a649d70274784b86c27760c5cee3fcc2e61eb9b2653a4b90099cf2c4b44056a517235da6ffbc289daeeb9b4bf791a60111d8c30e0af91283fe9638
data/CHANGELOG.md CHANGED
@@ -1,3 +1,29 @@
1
+ ### 0.7.1 (2019/03/30)
2
+ #### New features
3
+ * add `Nyle.clear` method
4
+ * add `Nyle.running_time` method
5
+ * add `Nyle.main` method
6
+ * add `Nyle.create_screen` method
7
+ * add `Nyle.create_frame` method
8
+ * add `Nyle::Screen#start` method
9
+ * set alias `w` to `screen_width`
10
+ * set alias `h` to `screen_height`
11
+ * enhance `Nyle::Screen#show_all` method to be able to specify the interval time
12
+
13
+ #### Bug fixes, etc.
14
+ * adjust `draw_shape` method about `cap` option
15
+
16
+ #### Samples
17
+ * add `pause.rb`
18
+ * add `random_walk_trace_fadeout.rb`
19
+ * add `rotation.rb`
20
+ * add `double_pendulum.rb`
21
+ * adjust `color_chart.rb`
22
+ * adjust `random_walk.rb`
23
+ * adjust `random_walk_trace.rb`
24
+ * use `Nyle.main` method
25
+
26
+
1
27
  ### 0.7.0 (2019/02/09)
2
28
  #### New features
3
29
  * enhance `draw_text` to be able to specify font attributes(font-name, italic, bold)
@@ -61,9 +87,9 @@
61
87
  #### New features
62
88
  * release as RubyGems
63
89
  * add `Nyle.draw_shape` method
64
- * add `a`(alpha value) option in `Nyle.draw_*`
65
- * add `Nyle::Scneen#suspend` method and `Nyle::Scneen#resume` method
66
- * give `?` letter to method which returns true ot false
90
+ * add `Nyle::Screen#suspend` method and `Nyle::Screen#resume` method
91
+ * enhance `a`(alpha value) option in `Nyle.draw_*`
92
+ * append `?` letter to method which returns true ot false
67
93
 
68
94
 
69
95
  ### 0.4.0 (2018/11/04)
data/lib/nyle.rb CHANGED
@@ -27,9 +27,12 @@ MOUSE_R = 3
27
27
  module Nyle
28
28
  class Error < StandardError; end
29
29
 
30
- DEFAULT_WIDTH = 640
31
- DEFAULT_HEIGHT = 480
32
- DEFAULT_TITLE = 'Nyle'
30
+ DEFAULT_WIDTH = 640
31
+ DEFAULT_HEIGHT = 480
32
+ DEFAULT_TITLE = 'Nyle'
33
+ DEFAULT_INTERVAL = 15
34
+ MIN_INTERVAL = 5
35
+ MAX_INTERVAL = 1000
33
36
 
34
37
  @__cr = nil
35
38
  @__screen_width = DEFAULT_WIDTH
@@ -48,6 +51,9 @@ module Nyle
48
51
  @__mask_shift = false
49
52
  @__cursor_x = 0
50
53
  @__cursor_y = 0
54
+ @__running_time = 0
55
+
56
+ @__frame = nil # main frame
51
57
 
52
58
  @__os = (
53
59
  host_os = RbConfig::CONFIG['host_os']
@@ -62,7 +68,6 @@ module Nyle
62
68
  :unknown
63
69
  end
64
70
  )
65
- @__frame = nil # main frame
66
71
 
67
72
  # Singleton class
68
73
  class << self
@@ -142,9 +147,30 @@ module Nyle
142
147
  else
143
148
  @__cursor_y = 0
144
149
  end
145
-
146
150
  end
147
151
  end
152
+
153
+ private def _clear_mouse_state
154
+ @__mouse_down.clear
155
+ @__mouse_down_last.clear
156
+ @__mouse_press.clear
157
+ @__mouse_release.clear
158
+ end
159
+
160
+ private def _clear_key_state
161
+ @__key_down.clear
162
+ @__key_down_last.clear
163
+ @__key_press.clear
164
+ @__key_release.clear
165
+ end
166
+
167
+ private def _set_running_time(rt)
168
+ @__running_time = rt
169
+ end
170
+
171
+ private def _clear_running_time
172
+ @__running_time = 0
173
+ end
148
174
  end
149
175
 
150
176
 
@@ -165,8 +191,14 @@ module Nyle
165
191
  module_function def mask_shift? ; Nyle.module_eval{ @__mask_shift } ; end
166
192
  module_function def cursor_x ; Nyle.module_eval{ @__cursor_x } ; end
167
193
  module_function def cursor_y ; Nyle.module_eval{ @__cursor_y } ; end
194
+ module_function def running_time ; Nyle.module_eval{ @__running_time } ; end
168
195
  module_function def os ; Nyle.module_eval{ @__os } ; end
169
196
 
197
+ alias_method :w, :screen_width
198
+ alias_method :h, :screen_height
199
+ module_function :w
200
+ module_function :h
201
+
170
202
  module_function def save
171
203
  cr = Nyle.module_eval{ @__cr }
172
204
  cr.save do
@@ -230,6 +262,7 @@ module Nyle
230
262
  cr.save do
231
263
  cr.line_width = weight
232
264
  cr.line_cap = cap
265
+ cr.line_join = :ROUND if cap == :ROUND
233
266
  cr.set_source_rgba(Cairo::Color.parse(color).r,
234
267
  Cairo::Color.parse(color).g,
235
268
  Cairo::Color.parse(color).b, a)
@@ -353,6 +386,10 @@ module Nyle
353
386
  return (c == Cairo::Color.parse(color).to_s[0, 7] ? true : false)
354
387
  end
355
388
 
389
+ module_function def clear
390
+ Nyle.module_eval{ @__frame.current_screen.clear_screen }
391
+ end
392
+
356
393
  module_function def translate(tx, ty)
357
394
  cr = Nyle.module_eval{ @__cr }
358
395
  cr.translate(tx, ty)
@@ -368,11 +405,23 @@ module Nyle
368
405
  cr.scale(sx, sy)
369
406
  end
370
407
 
408
+ module_function def create_screen(*args)
409
+ Nyle::Screen.new(*args)
410
+ end
411
+
412
+ module_function def create_frame(*args)
413
+ Nyle::Frame.new(*args)
414
+ end
415
+
371
416
  module_function def quit
372
417
  @__frame.close if @__frame # destroy
373
418
  # Gtk.main_quit
374
419
  end
375
420
 
421
+ module_function def main
422
+ Gtk.main
423
+ end
424
+
376
425
  end
377
426
 
378
427
 
data/lib/nyle/frame.rb CHANGED
@@ -13,21 +13,15 @@ module Nyle
13
13
 
14
14
  # Frame
15
15
  class Frame < Gtk::Window
16
- include Gdk::Keyval # Include key definication to omit 'Gdk::Keyval::' for subclass
17
- def initialize(width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT, title: DEFAULT_TITLE)
16
+ attr_reader :current_screen
17
+ # include Gdk::Keyval # Include key definication to omit 'Gdk::Keyval::' for subclass
18
+ def initialize(width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT)
18
19
  super()
19
20
  self.set_size_request(width, height)
20
21
  self.resizable = false
21
- self.title = title
22
- @transition = [] # Screen transition table
23
- @interval_time = ENV['NYLE_INTERVAL'].to_i # milli seconds
24
- @interval_time = 15 if @interval_time < 5 or @interval_time > 1000
25
- GLib::Timeout.add(@interval_time) do
26
- if @current_screen
27
- update
28
- @current_screen.queue_draw unless @current_screen.destroyed?
29
- end
30
- end
22
+ self.title = DEFAULT_TITLE
23
+ @transition = [] # Screen transition table
24
+ @interval_time = DEFAULT_INTERVAL # milli seconds
31
25
 
32
26
  # Nyle main frame
33
27
  me = self
@@ -78,6 +72,38 @@ module Nyle
78
72
  end
79
73
  end
80
74
 
75
+ def show_all(title: nil, interval: nil)
76
+ super()
77
+ self.title = title if title
78
+ if ENV['NYLE_INTERVAL']
79
+ @interval_time = ENV['NYLE_INTERVAL'].to_i
80
+ elsif interval
81
+ @interval_time = interval.to_i
82
+ end
83
+ @interval_time = MIN_INTERVAL if @interval_time < MIN_INTERVAL
84
+ @interval_time = MAX_INTERVAL if @interval_time > MAX_INTERVAL
85
+
86
+ @timer = GLib::Timer.new
87
+ @timer.start
88
+
89
+ GLib::Timeout.add(@interval_time, GLib::PRIORITY_HIGH) do
90
+ # puts "#{@timer.elapsed[0]}" if @timer
91
+ if @timer
92
+ elapsed = (@timer.elapsed[0] * 1000).round
93
+ Nyle.module_eval {
94
+ _set_running_time(elapsed)
95
+ }
96
+ if @current_screen
97
+ update
98
+ @current_screen.queue_draw unless @current_screen.destroyed?
99
+ end
100
+ true
101
+ else
102
+ false
103
+ end
104
+ end
105
+ end
106
+
81
107
  def close
82
108
  _quit
83
109
  end
@@ -113,6 +139,13 @@ module Nyle
113
139
  end
114
140
 
115
141
  private def _quit
142
+ @timer.stop
143
+ @timer = nil # as block returns false by this, GLib::Timeout will remove and not be called
144
+ Nyle.module_eval{
145
+ _clear_mouse_state
146
+ _clear_key_state
147
+ _clear_running_time
148
+ }
116
149
  self.hide
117
150
  Gtk.main_quit
118
151
  end
data/lib/nyle/screen.rb CHANGED
@@ -23,8 +23,6 @@ module Nyle
23
23
  @running_count = 0
24
24
  @status = nil
25
25
 
26
- @fill_done = false
27
-
28
26
  Nyle.module_eval {
29
27
  _set_screen_size(width, height)
30
28
  }
@@ -46,14 +44,10 @@ module Nyle
46
44
  Nyle.module_eval {
47
45
  _set_cr(cr)
48
46
  }
49
- unless @trace # If not trace, fill screen each time
50
- Nyle.cr.set_source_color(@bgcolor)
51
- Nyle.cr.paint
52
- else
53
- unless @fill_done
54
- Nyle.cr.set_source_color(@bgcolor) # fill once
47
+ unless @trace # If not trace, clear screen each time
48
+ Nyle.save do
49
+ Nyle.cr.set_operator(Cairo::Operator::CLEAR)
55
50
  Nyle.cr.paint
56
- @fill_done = true
57
51
  end
58
52
  end
59
53
  update
@@ -63,8 +57,9 @@ module Nyle
63
57
  Nyle.module_eval {
64
58
  _set_cr(cairo_context)
65
59
  }
66
- pattern = Cairo::SurfacePattern.new(@canvas)
67
- Nyle.cr.set_source(pattern)
60
+ Nyle.cr.set_source_color(@bgcolor)
61
+ Nyle.cr.paint
62
+ Nyle.cr.set_source(@canvas, 0, 0)
68
63
  Nyle.cr.paint
69
64
  @running_count += 1
70
65
  end
@@ -83,19 +78,34 @@ module Nyle
83
78
  end
84
79
  end
85
80
 
81
+ # Clear
82
+ def clear_screen
83
+ Nyle.cr.set_operator(Cairo::Operator::CLEAR)
84
+ Nyle.cr.paint
85
+ end
86
+
86
87
  # When single screen, create frame to show self
87
- def show_all(title = DEFAULT_TITLE)
88
- f = Nyle::Frame.new(@width, @height, {title: title})
88
+ def show_all(title: nil, interval: nil)
89
+ f = Nyle::Frame.new(@width, @height)
89
90
  f.set_current(self)
90
- f.show_all
91
+ f.show_all({title: title, interval: interval})
91
92
  f
92
93
  end
93
94
 
95
+ # Syntax sugar for starting Nyle aplication
96
+ def start(*args)
97
+ self.setup
98
+ self.show_all(*args)
99
+ Nyle.main
100
+ end
101
+
102
+
94
103
  # Abstract methods to be overriden
95
- private def update ; end
96
- private def draw ; end
97
- private def suspend ; end
98
- private def resume ; end
104
+ def update ; end
105
+ def draw ; end
106
+ def suspend ; end
107
+ def resume ; end
108
+ def setup ; end
99
109
  end
100
110
 
101
111
  end
data/lib/nyle/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nyle
2
- VERSION = "0.7.0"
2
+ VERSION = "0.7.1"
3
3
  end
@@ -183,5 +183,5 @@ end
183
183
 
184
184
 
185
185
  Screen.new.show_all
186
- Gtk.main
186
+ Nyle.main
187
187
 
@@ -52,5 +52,5 @@ end
52
52
 
53
53
 
54
54
  Screen.new.show_all
55
- Gtk.main
55
+ Nyle.main
56
56
 
@@ -292,5 +292,5 @@ end
292
292
 
293
293
 
294
294
  Frame.new.show_all
295
- Gtk.main
295
+ Nyle.main
296
296
 
@@ -80,5 +80,5 @@ end
80
80
 
81
81
 
82
82
  Screen.new.show_all
83
- Gtk.main
83
+ Nyle.main
84
84
 
@@ -0,0 +1,242 @@
1
+ require 'nyle'
2
+
3
+ class Controller < Gtk::Box
4
+ def initialize(target)
5
+ super(:vertical, 0)
6
+
7
+ @target = target
8
+
9
+ @l1_init = @target.L1
10
+ @m1_init = @target.M1
11
+ @l2_init = @target.L2
12
+ @m2_init = @target.M2
13
+ @g_init = @target.G
14
+
15
+ # length of upper pendulum
16
+ scale_l1 = Gtk::Scale.new(:vertical, 50.0, 150.0, 0.1)
17
+ scale_l1.set_size_request(65, 150)
18
+ scale_l1.value = @l1_init
19
+ scale_l1.draw_value = false
20
+ label_caption_l1 = Gtk::Label.new("L1")
21
+ label_value_l1 = Gtk::Label.new(scale_l1.value.round(1).to_s)
22
+ label_value_l1.override_font(Pango::FontDescription.new('bold'))
23
+ scale_l1.signal_connect(:value_changed) do |widget|
24
+ widget.value = widget.value.round(1)
25
+ label_value_l1.text = widget.value.to_s
26
+ @target.L1 = widget.value if @target
27
+ @target.status if @target
28
+ end
29
+
30
+ # mass of upper pendulum
31
+ scale_m1 = Gtk::Scale.new(:vertical, 10.0, 20.0, 0.5)
32
+ scale_m1.set_size_request(65, 150)
33
+ scale_m1.value = @m1_init
34
+ scale_m1.draw_value = false
35
+ label_caption_m1 = Gtk::Label.new("M1")
36
+ label_value_m1 = Gtk::Label.new(scale_m1.value.round(1).to_s)
37
+ label_value_m1.override_font(Pango::FontDescription.new('bold'))
38
+ label_value_m1.justify = :right
39
+ scale_m1.signal_connect(:value_changed) do |widget|
40
+ widget.value = widget.value.round(1)
41
+ label_value_m1.text = widget.value.to_s
42
+ @target.M1 = widget.value if @target
43
+ @target.status if @target
44
+ end
45
+
46
+ # panel for upper pendulum
47
+ box_l1 = Gtk::Box.new(:vertical, 0)
48
+ box_l1.add(label_caption_l1)
49
+ box_l1.add(Gtk::Separator.new(:horizontal))
50
+ box_l1.add(label_value_l1)
51
+ box_l1.add(scale_l1)
52
+
53
+ box_m1 = Gtk::Box.new(:vertical, 0)
54
+ box_m1.add(label_caption_m1)
55
+ box_m1.add(Gtk::Separator.new(:horizontal))
56
+ box_m1.add(label_value_m1)
57
+ box_m1.add(scale_m1)
58
+
59
+ box_1 = Gtk::Box.new(:horizontal, 0)
60
+ box_1.add(box_l1)
61
+ box_1.add(box_m1)
62
+
63
+ frame_1 = Gtk::Frame.new
64
+ frame_1.add(box_1)
65
+
66
+ # length of lower pendulum
67
+ scale_l2 = Gtk::Scale.new(:vertical, 50.0, 150.0, 0.1)
68
+ scale_l2.set_size_request(65, 150)
69
+ scale_l2.value = @l2_init
70
+ scale_l2.draw_value = false
71
+ label_caption_l2 = Gtk::Label.new("L2")
72
+ label_value_l2 = Gtk::Label.new(scale_l2.value.round(1).to_s)
73
+ label_value_l2.override_font(Pango::FontDescription.new('bold'))
74
+ scale_l2.signal_connect(:value_changed) do |widget|
75
+ widget.value = widget.value.round(1)
76
+ label_value_l2.text = widget.value.to_s
77
+ @target.L2 = widget.value if @target
78
+ @target.status if @target
79
+ end
80
+
81
+ # mass of lower pendulum
82
+ scale_m2 = Gtk::Scale.new(:vertical, 10.0, 20.0, 0.5)
83
+ scale_m2.set_size_request(65, 150)
84
+ scale_m2.value = @m2_init
85
+ scale_m2.draw_value = false
86
+ label_caption_m2 = Gtk::Label.new("M2")
87
+ label_value_m2 = Gtk::Label.new(scale_m2.value.round(1).to_s)
88
+ label_value_m2.override_font(Pango::FontDescription.new('bold'))
89
+ label_value_m2.justify = :right
90
+ scale_m2.signal_connect(:value_changed) do |widget|
91
+ widget.value = widget.value.round(1)
92
+ label_value_m2.text = widget.value.to_s
93
+ @target.M2 = widget.value if @target
94
+ @target.status if @target
95
+ end
96
+
97
+ # panel for lower pendulum
98
+ box_l2 = Gtk::Box.new(:vertical, 0)
99
+ box_l2.add(label_caption_l2)
100
+ box_l2.add(Gtk::Separator.new(:horizontal))
101
+ box_l2.add(label_value_l2)
102
+ box_l2.add(scale_l2)
103
+
104
+ box_m2 = Gtk::Box.new(:vertical, 0)
105
+ box_m2.add(label_caption_m2)
106
+ box_m2.add(Gtk::Separator.new(:horizontal))
107
+ box_m2.add(label_value_m2)
108
+ box_m2.add(scale_m2)
109
+
110
+ box_2 = Gtk::Box.new(:horizontal, 0)
111
+ box_2.add(box_l2)
112
+ box_2.add(box_m2)
113
+
114
+ frame_2 = Gtk::Frame.new
115
+ frame_2.add(box_2)
116
+
117
+ # panel for gravity
118
+ label_caption_g = Gtk::Label.new(" G")
119
+ spinner_g = Gtk::SpinButton.new(0.1, 2.0, 0.1)
120
+ spinner_g.value = @g_init
121
+ spinner_g.wrap = false
122
+ box_g = Gtk::Box.new(:horizontal, 10)
123
+ box_g.add(label_caption_g)
124
+ box_g.add(spinner_g)
125
+ spinner_g.signal_connect(:value_changed) do |widget|
126
+ widget.value = widget.value.round(1)
127
+ @target.G = widget.value if @target
128
+ @target.status if @target
129
+ end
130
+
131
+ # reset button
132
+ button = Gtk::Button.new(label: "Reset")
133
+ button.focus = true
134
+ button.signal_connect(:clicked) {
135
+ if @target
136
+ scale_l1.value = @target.L1 = @l1_init # set/get initial value
137
+ scale_m1.value = @target.M1 = @m1_init # set/get initial value
138
+ scale_l2.value = @target.L2 = @l2_init # set/get initial value
139
+ scale_m2.value = @target.M2 = @m2_init # set/get initial value
140
+ spinner_g.value = @target.G = @g_init # set/get initial value
141
+ @target.status
142
+ end
143
+ }
144
+
145
+ # control panel
146
+ self.add(frame_1)
147
+ self.add(frame_2)
148
+ self.add(Gtk::Separator.new(:horizontal))
149
+ self.add(box_g)
150
+ self.add(button)
151
+ end
152
+
153
+ end
154
+
155
+
156
+ class Screen < Nyle::Screen
157
+ attr_accessor :L1, :M1, :L2, :M2, :G
158
+
159
+ def initialize
160
+ super(600, 600, {bgcolor: :WHITE})
161
+ @L1 = 100
162
+ @L2 = 100
163
+ @M1 = 15
164
+ @M2 = 15
165
+ @G = 1.0
166
+ @cx = Nyle.w / 2
167
+ @cy = Nyle.h / 2
168
+ @a1_v = 0
169
+ @a2_v = 0
170
+ @a1 = Math::PI / 2
171
+ @a2 = Math::PI / 2
172
+ @points = []
173
+ end
174
+
175
+ def update
176
+ #calc a1_a
177
+ num1 = -@G * (2 * @M1 + @M2) * Math.sin(@a1)
178
+ num2 = -@M2 * @G * Math.sin(@a1 - 2 * @a2)
179
+ num3 = -2 * Math.sin(@a1 - @a2) * @M2
180
+ num4 = @a2_v * @a2_v * @L2 + @a1_v * @a1_v * @L1 * Math.cos(@a1 - @a2)
181
+ den = @L1 * (2 * @M1 + @M2 - @M2 * Math.cos(2 * @a1 - 2 * @a2))
182
+ a1_a = (num1 + num2 + num3 * num4) / den
183
+
184
+ #calc a2_a
185
+ num1 = 2 * Math.sin(@a1 - @a2)
186
+ num2 = (@a1_v * @a1_v * @L1 * (@M1 + @M2))
187
+ num3 = @G * (@M1 + @M2) * Math.cos(@a1)
188
+ num4 = @a2_v * @a2_v * @L2 * @M2 * Math.cos(@a1 - @a2)
189
+ den = @L2 * (2 * @M1 + @M2 - @M2 * Math.cos(2 * @a1 - 2.0 * @a2))
190
+ a2_a = (num1 * (num2 + num3 + num4)) / den
191
+
192
+ @a1_v += a1_a
193
+ @a2_v += a2_a
194
+ @a1 += @a1_v
195
+ @a2 += @a2_v
196
+ end
197
+
198
+ def draw
199
+ x1 = @L1 * Math.sin(@a1)
200
+ y1 = @L1 * Math.cos(@a1)
201
+ x2 = x1 + @L2 * Math.sin(@a2)
202
+ y2 = y1 + @L2 * Math.cos(@a2)
203
+
204
+ Nyle.save do
205
+ Nyle.translate(@cx, @cy)
206
+ Nyle.draw_shape(@points, {weight: 1, color: :BLUE})
207
+ end
208
+ @points << [x2, y2]
209
+ @points.shift if @points.length > 2000
210
+
211
+ Nyle.save do
212
+ Nyle.translate(@cx, @cy)
213
+ # draw No1_pendulum
214
+ Nyle.draw_line(0, 0, x1, y1)
215
+ Nyle.draw_circle(x1, y1, @M1, {color: :BLACK, fill: true})
216
+
217
+ # draw No2_pendulum
218
+ Nyle.draw_line(x1, y1, x2, y2)
219
+ Nyle.draw_circle(x2, y2, @M2, {color: :BLACK, fill: true})
220
+ end
221
+ end
222
+ end
223
+
224
+
225
+ class Frame < Nyle::Frame
226
+ def initialize
227
+ super
228
+ self.set_size_request(740, 600)
229
+ screen = Screen.new
230
+ controller = Controller.new(screen)
231
+ box = Gtk::Box.new(:horizontal)
232
+ box.add(controller)
233
+ #box.add(screen)
234
+ box.pack_start(screen, expand: true, fill: true, padding: 0)
235
+ self.set_current(box)
236
+ end
237
+ end
238
+
239
+
240
+ Frame.new.show_all
241
+ Nyle.main
242
+
@@ -12,8 +12,8 @@ class Screen < Nyle::Screen
12
12
  Nyle.draw_circle(Nyle.mouse_x, Nyle.mouse_y, 10, {color: @color, fill: true}) if Nyle.mouse_down?(MOUSE_L) # draw (left-click)
13
13
  Nyle.draw_circle(Nyle.mouse_x, Nyle.mouse_y, 10, {color: :WHITE, fill: true}) if Nyle.mouse_down?(MOUSE_R) # erase (right-click)
14
14
 
15
- Nyle.draw_text( 10, 20, "[mouse left ] draw", {size: 16})
16
- Nyle.draw_text( 10, 40, "[mouse right] erase", {size: 16})
15
+ # Nyle.draw_text( 10, 20, "[mouse left ] draw", {size: 16})
16
+ # Nyle.draw_text( 10, 40, "[mouse right] erase", {size: 16})
17
17
 
18
18
  if @png
19
19
  Nyle.save_image("./sketch.png")
@@ -91,5 +91,5 @@ end
91
91
 
92
92
 
93
93
  Frame.new.show_all
94
- Gtk.main
94
+ Nyle.main
95
95
 
@@ -59,5 +59,5 @@ end
59
59
 
60
60
 
61
61
  Screen.new.show_all
62
- Gtk.main
62
+ Nyle.main
63
63
 
@@ -43,5 +43,5 @@ end
43
43
 
44
44
 
45
45
  Screen.new.show_all
46
- Gtk.main
46
+ Nyle.main
47
47
 
@@ -8,34 +8,42 @@ class Screen < Nyle::Screen
8
8
 
9
9
  def setup
10
10
  @colors = _color_list
11
- @start_index = 0
12
11
  @bar_w = 200
13
12
  @bar_h = 30
13
+ @start_index = 0
14
+ @end_index = _end_index
14
15
  end
15
16
 
16
17
  def draw
17
- @colors.each_with_index do |c, i|
18
- next if i < @start_index
18
+ (@start_index..@end_index).each do |i|
19
19
  y = (i - @start_index) * @bar_h
20
- Nyle.draw_rect(0, y, @bar_w, @bar_h, {color: c, fill: true})
21
- Nyle.draw_text(@bar_w + 10, y + @bar_h - 10, "#{c.to_s}", {color: :BLACK, size: 16})
20
+ Nyle.draw_rect(0, y, @bar_w, @bar_h, {color: @colors[i], fill: true})
21
+ Nyle.draw_text(@bar_w + 10, y + @bar_h - 10, "#{@colors[i].to_s}", {color: :BLACK, size: 16})
22
22
  end
23
23
  end
24
24
 
25
25
  def update
26
26
  if Nyle.key_press?(KEY_Up) or Nyle.mouse_press?(MOUSE_R)
27
- @start_index -= (@height / @bar_h)
28
- @start_index = (@colors.length / (@height / @bar_h)) * (@height / @bar_h) if @start_index < 0
27
+ @start_index -= (Nyle.screen_height / @bar_h)
28
+ @start_index = (@colors.length / (Nyle.screen_height / @bar_h)) * (Nyle.screen_height / @bar_h) if @start_index < 0
29
+ @end_index = _end_index
29
30
  end
30
31
 
31
32
  if Nyle.key_press?(KEY_Down) or Nyle.mouse_press?(MOUSE_L)
32
- @start_index += (@height / @bar_h)
33
+ @start_index += (Nyle.screen_height / @bar_h)
33
34
  @start_index = 0 if @start_index >= @colors.length
35
+ @end_index = _end_index
34
36
  end
35
37
 
36
38
  Nyle.quit if Nyle.key_press?(KEY_Escape)
37
39
  end
38
40
 
41
+ def _end_index
42
+ index = @start_index + Nyle.screen_height / @bar_h - 1
43
+ index = @colors.length - 1 if index >= @colors.length
44
+ index
45
+ end
46
+
39
47
  def _color_list
40
48
  [
41
49
  :ALICE_BLUE, # #F0F8FF
@@ -306,5 +314,5 @@ end
306
314
 
307
315
 
308
316
  Screen.new.show_all
309
- Gtk.main
317
+ Nyle.main
310
318
 
@@ -29,5 +29,5 @@ end
29
29
 
30
30
 
31
31
  Screen.new.show_all
32
- Gtk.main
32
+ Nyle.main
33
33
 
@@ -48,5 +48,5 @@ end
48
48
 
49
49
 
50
50
  Screen.new.show_all
51
- Gtk.main
51
+ Nyle.main
52
52
 
@@ -78,5 +78,5 @@ end
78
78
 
79
79
 
80
80
  Screen.new.show_all
81
- Gtk.main
81
+ Nyle.main
82
82
 
@@ -54,5 +54,5 @@ end
54
54
 
55
55
 
56
56
  Screen.new.show_all
57
- Gtk.main
57
+ Nyle.main
58
58
 
@@ -49,11 +49,11 @@ class Screen < Nyle::Screen
49
49
  super
50
50
  end
51
51
  def draw
52
- Nyle.draw_shape(star(160, 100), {color: :GOLD, weight: 5, close: true})
52
+ Nyle.draw_shape(star(160, 100), {color: :GOLD, weight: 5, close: true, cap: :ROUND})
53
53
  Nyle.draw_shape(star(320, 100), {color: :GOLD, weight: 5, close: true, fill: true})
54
54
  Nyle.draw_shape(star(480, 100), {color: :GOLD, a: 0.5, weight: 5, close: true, fill: true})
55
55
 
56
- Nyle.draw_shape(para_star(160, 240), {color: :BROWN, weight: 3, close: true})
56
+ Nyle.draw_shape(para_star(160, 240), {color: :BROWN, weight: 3, close: true, cap: :ROUND})
57
57
  Nyle.draw_shape(para_star(320, 240), {color: :BROWN, weight: 3, close: true, fill: true})
58
58
  Nyle.draw_shape(para_star(480, 240), {color: :BROWN, a: 0.5, weight: 3, close: true, fill: true})
59
59
 
@@ -66,5 +66,5 @@ end
66
66
 
67
67
 
68
68
  Screen.new.show_all
69
- Gtk.main
69
+ Nyle.main
70
70
 
@@ -59,5 +59,5 @@ end
59
59
 
60
60
 
61
61
  Screen.new.show_all
62
- Gtk.main
62
+ Nyle.main
63
63
 
@@ -29,5 +29,5 @@ end
29
29
 
30
30
 
31
31
  Screen.new.show_all
32
- Gtk.main
32
+ Nyle.main
33
33
 
@@ -38,5 +38,5 @@ end
38
38
 
39
39
 
40
40
  Screen.new.show_all
41
- Gtk.main
41
+ Nyle.main
42
42
 
@@ -94,5 +94,5 @@ end
94
94
 
95
95
 
96
96
  Screen.new.show_all
97
- Gtk.main
97
+ Nyle.main
98
98
 
@@ -80,5 +80,5 @@ end
80
80
 
81
81
 
82
82
  Screen.new.show_all
83
- Gtk.main
83
+ Nyle.main
84
84
 
@@ -0,0 +1,34 @@
1
+ require 'nyle'
2
+
3
+ class Screen < Nyle::Screen
4
+ def initialize
5
+ super(320, 320, {bgcolor: :ALICE_BLUE, trace: true})
6
+ @draw = true
7
+ @rt_last = 0
8
+ end
9
+
10
+ def draw
11
+ if @draw
12
+ x = rand(Nyle.w)
13
+ y = rand(Nyle.h)
14
+ r = rand(3..50)
15
+ c = rand(0..0xFFFFFF)
16
+ a = rand(1..5)
17
+ Nyle.draw_circle(x, y, r, {fill: true, color: "#%06x" % c, a: a / 10.0})
18
+ end
19
+ end
20
+
21
+ def update
22
+ @rt = Nyle.running_time
23
+ if (@rt - @rt_last) >= 2000
24
+ @rt_last = @rt
25
+ @draw = !@draw
26
+ Nyle.clear if @draw
27
+ end
28
+ end
29
+ end
30
+
31
+
32
+ Screen.new.show_all({interval: nil})
33
+ Nyle.main
34
+
@@ -25,7 +25,7 @@ class Walker
25
25
  end
26
26
 
27
27
  def draw
28
- Nyle.draw_circle(@x, @y, RADIUS, {color: :BLUE, fill: true})
28
+ Nyle.draw_circle(@x, @y, RADIUS, {color: :YELLOW, fill: true})
29
29
  end
30
30
  end
31
31
 
@@ -33,7 +33,7 @@ end
33
33
  class Screen < Nyle::Screen
34
34
 
35
35
  def initialize
36
- super(64 * 5, 48 * 5, {bgcolor: :IVORY})
36
+ super(64 * 5, 48 * 5, {bgcolor: :BLACK})
37
37
  @walker = Walker.new(@width, @height)
38
38
  end
39
39
 
@@ -49,6 +49,6 @@ class Screen < Nyle::Screen
49
49
  end
50
50
 
51
51
 
52
- Screen.new.show_all
53
- Gtk.main
52
+ Screen.new.show_all({interval: 30})
53
+ Nyle.main
54
54
 
@@ -25,7 +25,7 @@ class Walker
25
25
  end
26
26
 
27
27
  def draw
28
- Nyle.draw_circle(@x, @y, RADIUS, {color: :BLUE, fill: true})
28
+ Nyle.draw_circle(@x, @y, RADIUS, {color: :YELLOW, fill: true})
29
29
  end
30
30
  end
31
31
 
@@ -33,7 +33,7 @@ end
33
33
  class Screen < Nyle::Screen
34
34
 
35
35
  def initialize
36
- super(64 * 5, 48 * 5, {bgcolor: :IVORY, trace: true})
36
+ super(64 * 5, 48 * 5, {bgcolor: :BLACK, trace: true})
37
37
  @walker = Walker.new(@width, @height)
38
38
  end
39
39
 
@@ -49,6 +49,6 @@ class Screen < Nyle::Screen
49
49
  end
50
50
 
51
51
 
52
- Screen.new.show_all
53
- Gtk.main
52
+ Screen.new.show_all({interval: 30})
53
+ Nyle.main
54
54
 
@@ -0,0 +1,55 @@
1
+ require 'nyle'
2
+
3
+ class Walker
4
+ RADIUS = 4
5
+ def initialize(max_x, max_y)
6
+ @max_x = max_x
7
+ @max_y = max_y
8
+ @x = max_x / 2.0
9
+ @y = max_y / 2.0
10
+ @step = 5
11
+ end
12
+
13
+ # Randomly move up, down, left, right
14
+ def move
15
+ stepx = rand(3) - 1
16
+ stepy = rand(3) - 1
17
+ @x += stepx * @step
18
+ @y += stepy * @step
19
+
20
+ # x,y limitter
21
+ @x = 0 if @x < 0
22
+ @x = @max_x if @x > @max_x
23
+ @y = 0 if @y < 0
24
+ @y = @max_y if @y > @max_y
25
+ end
26
+
27
+ def draw
28
+ Nyle.draw_circle(@x, @y, RADIUS, {color: :YELLOW, fill: true})
29
+ end
30
+ end
31
+
32
+
33
+ class Screen < Nyle::Screen
34
+
35
+ def initialize
36
+ super(64 * 5, 48 * 5, {bgcolor: :BLACK, trace: true})
37
+ @walker = Walker.new(@width, @height)
38
+ end
39
+
40
+ def draw
41
+ @walker.draw
42
+ Nyle.draw_rect(0, 0, @width, @height, {fill: true, color: :BLACK, a: 0.02})
43
+ end
44
+
45
+ def update
46
+ @walker.move
47
+ Nyle.quit if Nyle.key_press?(KEY_Escape)
48
+ end
49
+
50
+ end
51
+
52
+
53
+ Screen.new.show_all({interval: 30})
54
+ Nyle.main
55
+
@@ -0,0 +1,35 @@
1
+ require 'nyle'
2
+
3
+ class Screen < Nyle::Screen
4
+ def initialize
5
+ super(320, 320, {bgcolor: :BLACK, trace: true})
6
+ @th = 0
7
+ @c1 = :RED
8
+ @c2 = :ORANGE
9
+ @c3 = :GOLD
10
+ @x = Nyle.w / 2
11
+ @y = Nyle.h / 2
12
+ @rt_last = 0
13
+ end
14
+
15
+ def draw
16
+ Nyle.draw_circle(@x + Math::cos(@th) * 30, @y + Math::sin(@th) * 30, 30, {weight: 10, color: @c1})
17
+ Nyle.draw_circle(@x + Math::cos(@th) * 75, @y + Math::sin(@th) * 75, 30, {weight: 10, color: @c2})
18
+ Nyle.draw_circle(@x + Math::cos(@th) * 120, @y + Math::sin(@th) * 120, 30, {weight: 10, color: @c3})
19
+ Nyle.draw_rect(0, 0, Nyle.w, Nyle.h, {color: :BLACK, fill: true, a: 0.05})
20
+ end
21
+
22
+ def update
23
+ @rt = Nyle.running_time
24
+ if (@rt - @rt_last) >= 3000
25
+ @rt_last = @rt
26
+ @c1, @c2, @c3 = @c2, @c3, @c1
27
+ end
28
+ @th += Math::PI / 128
29
+ end
30
+ end
31
+
32
+
33
+ Screen.new.show_all({interval: nil})
34
+ Nyle.main
35
+
data/samples/launcher.rb CHANGED
@@ -3,7 +3,7 @@ require 'gtk3'
3
3
  module Samples
4
4
  class Launcher < Gtk::Window
5
5
  def initialize
6
- super()
6
+ super
7
7
  set_title('Nyle samples')
8
8
 
9
9
  tree = create_tree
@@ -7,4 +7,4 @@ class Screen < Nyle::Screen
7
7
  end
8
8
 
9
9
  Screen.new.show_all
10
- Gtk.main
10
+ Nyle.main
@@ -10,4 +10,4 @@ class Screen < Nyle::Screen
10
10
  end
11
11
 
12
12
  Screen.new.show_all
13
- Gtk.main
13
+ Nyle.main
@@ -15,4 +15,4 @@ class Screen < Nyle::Screen
15
15
  end
16
16
 
17
17
  Screen.new.show_all
18
- Gtk.main
18
+ Nyle.main
@@ -16,4 +16,4 @@ class Screen < Nyle::Screen
16
16
  end
17
17
 
18
18
  Screen.new.show_all
19
- Gtk.main
19
+ Nyle.main
@@ -18,4 +18,4 @@ class Screen < Nyle::Screen
18
18
  end
19
19
 
20
20
  Screen.new.show_all
21
- Gtk.main
21
+ Nyle.main
@@ -22,4 +22,4 @@ class Screen < Nyle::Screen
22
22
  end
23
23
 
24
24
  Screen.new.show_all
25
- Gtk.main
25
+ Nyle.main
@@ -27,4 +27,4 @@ class Screen < Nyle::Screen
27
27
  end
28
28
 
29
29
  Screen.new.show_all
30
- Gtk.main
30
+ Nyle.main
@@ -31,4 +31,4 @@ class Screen < Nyle::Screen
31
31
  end
32
32
 
33
33
  Screen.new.show_all
34
- Gtk.main
34
+ Nyle.main
@@ -11,4 +11,4 @@ class Screen < Nyle::Screen
11
11
  end
12
12
 
13
13
  Screen.new.show_all
14
- Gtk.main
14
+ Nyle.main
@@ -11,4 +11,4 @@ class Screen < Nyle::Screen
11
11
  end
12
12
 
13
13
  Screen.new.show_all
14
- Gtk.main
14
+ Nyle.main
@@ -11,4 +11,4 @@ class Screen < Nyle::Screen
11
11
  end
12
12
 
13
13
  Screen.new.show_all
14
- Gtk.main
14
+ Nyle.main
@@ -15,4 +15,4 @@ class Screen < Nyle::Screen
15
15
  end
16
16
 
17
17
  Screen.new.show_all
18
- Gtk.main
18
+ Nyle.main
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nyle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koki Kitamura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-09 00:00:00.000000000 Z
11
+ date: 2019-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gtk3
@@ -52,6 +52,7 @@ files:
52
52
  - samples/application/clock.rb
53
53
  - samples/application/falling.rb
54
54
  - samples/application/flight.rb
55
+ - samples/application/pendulum.rb
55
56
  - samples/application/sketch.rb
56
57
  - samples/application/sugar.rb
57
58
  - samples/application/tree.rb
@@ -66,8 +67,11 @@ files:
66
67
  - samples/basic/image_rotate.rb
67
68
  - samples/basic/image_rpg.rb
68
69
  - samples/basic/keyboard.rb
70
+ - samples/basic/pause.rb
69
71
  - samples/basic/random_walk.rb
70
72
  - samples/basic/random_walk_trace.rb
73
+ - samples/basic/random_walk_trace_fadeout.rb
74
+ - samples/basic/rotation.rb
71
75
  - samples/image/n_b_crocodile.png
72
76
  - samples/image/n_c_mogura.png
73
77
  - samples/image/n_f_banana.png
@@ -78,7 +82,6 @@ files:
78
82
  - samples/image/n_i_bg.jpg
79
83
  - samples/image/n_i_chara.png
80
84
  - samples/launcher.rb
81
- - samples/tips/.gitkeep
82
85
  - samples/tutorial/img.jpg
83
86
  - samples/tutorial/tut_a10.rb
84
87
  - samples/tutorial/tut_a20.rb
@@ -111,8 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
114
  - !ruby/object:Gem::Version
112
115
  version: '0'
113
116
  requirements: []
114
- rubyforge_project:
115
- rubygems_version: 2.7.8
117
+ rubygems_version: 3.0.1
116
118
  signing_key:
117
119
  specification_version: 4
118
120
  summary: minimal graphics framework using Ruby/GTK3 and rcairo
File without changes