nyle 0.7.2 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 874f7f0908c736a7ce019bbbb4ef5e051e467bbbd678e258e76dcd6b5007c19a
4
- data.tar.gz: efe32f88f521412100b605a33569506665f346ff8e852e49c3d63fa779858155
3
+ metadata.gz: d1ea6c2dc4893acc0c29c5670805d471eb5376086885b2180b7673745c5b5358
4
+ data.tar.gz: 150ed2bd0c2fb320bdcae3b1f158910f0aa92fb6362e7443dabf6d745510bd57
5
5
  SHA512:
6
- metadata.gz: 948a2be8d3330f63f9066b10b41075cd87988b718c951cde2bb36bc544762779469a059b41ca692acd1eaf94b5134bacfc3511c8ff31aefcd57f7c7f84ab728d
7
- data.tar.gz: a9a60aac68010cce74351a2dea287128fc4e00306602b23e87715f8976ea0b5c67236e70521ce08634d433fc768158024c0725d7489a8f916d0fb1cf8020d64c
6
+ metadata.gz: b1995964a2ddc2e9bed684cb42e40014d11856fd3e419aeec9a742c3f65fc1ee529f9eae24a9369994c1f49871942fa5cddad18e22ba8b6e0d3b50b623099a61
7
+ data.tar.gz: a35c20b4e7caeb0d23778a5f4adaf78e379c85bd75c706cb50a6312c7d26a171fe149dc92dadf8fc7070e4937f796959d1b7a21cb510d4bed250c73e996d2cfb
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ### 0.7.3 (2019/05/26)
2
+ #### New features
3
+ * add `Nyle.layer` method
4
+
5
+ #### Bug fixes, etc.
6
+ * adjust `Nyle.draw_text`
7
+
8
+ #### Samples
9
+ * add `random_walk_trace_layer.rb`
10
+ * add `fourier_series.rb`
11
+ * adjust `pendulum.rb` to use `Nyle.layer`
12
+
13
+
1
14
  ### 0.7.2 (2019/04/14)
2
15
  #### Bug fixes, etc.
3
16
  * adjust color names due to update `rcairo 1.16.3`
data/lib/nyle.rb CHANGED
@@ -171,6 +171,10 @@ module Nyle
171
171
  private def _clear_running_time
172
172
  @__running_time = 0
173
173
  end
174
+
175
+ private def _clear_layer
176
+ Screen::Layer.clear
177
+ end
174
178
  end
175
179
 
176
180
 
@@ -297,6 +301,7 @@ module Nyle
297
301
  delta = (Nyle.module_eval{ @__os } == :mac ? size * (72.0 / 96.0) : size)
298
302
  cr.move_to(x, y - delta) # Why :mac?
299
303
  cr.show_pango_layout(pango_layout)
304
+ cr.new_path
300
305
  end
301
306
  end
302
307
 
@@ -405,6 +410,24 @@ module Nyle
405
410
  cr.scale(sx, sy)
406
411
  end
407
412
 
413
+ module_function def layer(id = :__)
414
+ if block_given?
415
+ cr = Nyle.cr
416
+ layer = Screen::Layer.create(id, Nyle.w, Nyle.h)
417
+ Cairo::Context.new(layer) do |cr_layer|
418
+ Nyle.module_eval {
419
+ _set_cr(cr_layer)
420
+ }
421
+ yield(layer)
422
+ end
423
+ Nyle.module_eval {
424
+ _set_cr(cr)
425
+ }
426
+ Nyle.cr.set_source(layer, 0, 0)
427
+ Nyle.cr.paint
428
+ end
429
+ end
430
+
408
431
  module_function def create_screen(*args)
409
432
  Nyle::Screen.new(*args)
410
433
  end
data/lib/nyle/frame.rb CHANGED
@@ -149,6 +149,7 @@ module Nyle
149
149
  _clear_mouse_state
150
150
  _clear_key_state
151
151
  _clear_running_time
152
+ _clear_layer
152
153
  }
153
154
  self.hide
154
155
  Gtk.main_quit
data/lib/nyle/screen.rb CHANGED
@@ -13,6 +13,30 @@ module Nyle
13
13
 
14
14
  # Screen
15
15
  class Screen < Gtk::DrawingArea
16
+ class Layer < Cairo::ImageSurface
17
+ @@layers = {}
18
+ private_class_method :new # refuse to make an instance using 'new' from outside, so 'create' instead.
19
+ def initialize(w, h)
20
+ super(w, h)
21
+ end
22
+ def self.create(id, w, h)
23
+ #puts "#{id} #{w} #{h}"
24
+ if @@layers.has_key?(id)
25
+ @@layers[id] # existing instance
26
+ else
27
+ layer = new(w, h)
28
+ @@layers[id] = layer
29
+ layer # new instance
30
+ end
31
+ end
32
+ def self.clear
33
+ @@layers.clear
34
+ end
35
+ def self.status
36
+ p @@layers
37
+ end
38
+ end
39
+
16
40
  attr_reader :width, :height, :status
17
41
  def initialize(width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT, bgcolor: :WHITE, trace: false)
18
42
  super()
@@ -80,8 +104,10 @@ module Nyle
80
104
 
81
105
  # Clear
82
106
  def clear_screen
83
- Nyle.cr.set_operator(Cairo::Operator::CLEAR)
84
- Nyle.cr.paint
107
+ Nyle.save do
108
+ Nyle.cr.set_operator(Cairo::Operator::CLEAR)
109
+ Nyle.cr.paint
110
+ end
85
111
  end
86
112
 
87
113
  # When single screen, create frame to show self
data/lib/nyle/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nyle
2
- VERSION = "0.7.2"
2
+ VERSION = "0.7.3"
3
3
  end
@@ -0,0 +1,110 @@
1
+ require 'nyle'
2
+
3
+
4
+ class Slider
5
+ def initialize(low, high, default)
6
+ @low = low
7
+ @high = high
8
+ @val = default
9
+ @label = ""
10
+ end
11
+
12
+ def position(x, y)
13
+ @x = x
14
+ @y = y
15
+ @rectx = @x + _map(@val, @low, @high, 0, 120)
16
+ @recty = @y - 10
17
+ self
18
+ end
19
+
20
+ def set_label(label)
21
+ @label = label
22
+ self
23
+ end
24
+
25
+ def value
26
+ Nyle.draw_line(@x, @y, @x + 120, @y, {color: :GRAY, weight: 4})
27
+
28
+ if Nyle.mouse_down?(MOUSE_L) and _dist(Nyle.mouse_x, Nyle.mouse_y, @rectx, @recty) < 20
29
+ @rectx = Nyle.mouse_x - 5
30
+ end
31
+ @rectx = _constrain(@rectx, (@x..@x + 120))
32
+
33
+ Nyle.draw_rect(@rectx, @recty, 10, 20, {color: :GRAY, fill: true})
34
+ Nyle.draw_rect(@rectx, @recty, 10, 20, {color: :BLACK, weight: 1})
35
+
36
+ @val = _map(@rectx, @x, @x + 120, @low, @high)
37
+ Nyle.draw_text(@rectx, @recty - 5, "#{@val.to_i}", {size: 12})
38
+ Nyle.draw_text(@x + 135, @y + 5, @label, {size: 12})
39
+
40
+ return @val
41
+ end
42
+
43
+ private def _dist(x1, y1, x2, y2)
44
+ diffx = x1 - x2
45
+ diffy = y1 - y2
46
+ Math.sqrt(diffx * diffx + diffy * diffy)
47
+ end
48
+
49
+ private def _map(v, s1, e1, s2, e2)
50
+ v = v.to_f if v.integer?
51
+ (v - s1) / (e1 - s1) * (e2 - s2) + s2
52
+ end
53
+
54
+ private def _constrain(x, rang)
55
+ minx = rang.min
56
+ maxx = rang.max
57
+ x = minx if x <= minx
58
+ x = maxx if x >= maxx
59
+ x
60
+ end
61
+ end
62
+
63
+
64
+ class Screen < Nyle::Screen
65
+ def initialize
66
+ super(600, 400, {bgcolor: :WHITE})
67
+ @time = 0
68
+ @wave = []
69
+ @points = []
70
+ @slider = Slider.new(1, 20, 5).position(70, 50).set_label('N')
71
+ end
72
+
73
+ def draw
74
+ @n = @slider.value.to_i
75
+
76
+ Nyle.translate(150, 200)
77
+ x = 0
78
+ y = 0
79
+ @n.times do |i|
80
+ prevx = x
81
+ prevy = y
82
+ m = i * 2 + 1
83
+ radius = 75 * (4 / (m * Math::PI))
84
+ x += radius * Math.cos(m * @time)
85
+ y += radius * Math.sin(m * @time)
86
+
87
+ Nyle.draw_circle(prevx, prevy, radius, {color: :GRAY})
88
+ Nyle.draw_line(prevx, prevy, x, y, {color: :BLACK})
89
+ end
90
+
91
+ @wave.unshift(y)
92
+ Nyle.translate(200, 0)
93
+ Nyle.draw_circle(x - 200, y, 2, {color: :RED})
94
+ Nyle.draw_line(x - 200, y, 0, @wave[0], {color: :RED})
95
+ (0...@wave.size).each do |i|
96
+ @points << [i, @wave[i]]
97
+ end
98
+ Nyle.draw_shape(@points, {color: :BLUE})
99
+ @points.clear
100
+
101
+ @time += 0.05
102
+ @wave.pop if @wave.size > 250
103
+
104
+ Nyle.quit if Nyle.key_press?(KEY_Escape)
105
+ end
106
+ end
107
+
108
+ Screen.new.show_all
109
+ Nyle.main
110
+
@@ -169,7 +169,8 @@ class Screen < Nyle::Screen
169
169
  @a2_v = 0
170
170
  @a1 = Math::PI / 2
171
171
  @a2 = Math::PI / 2
172
- @points = []
172
+ @last_x = nil
173
+ @last_y = nil
173
174
  end
174
175
 
175
176
  def update
@@ -201,12 +202,14 @@ class Screen < Nyle::Screen
201
202
  x2 = x1 + @L2 * Math.sin(@a2)
202
203
  y2 = y1 + @L2 * Math.cos(@a2)
203
204
 
204
- Nyle.save do
205
- Nyle.translate(@cx, @cy)
206
- Nyle.draw_shape(@points, {weight: 1, color: :BLUE})
205
+ Nyle.layer do
206
+ Nyle.save do
207
+ Nyle.translate(@cx, @cy)
208
+ Nyle.draw_line(@last_x, @last_y, x2, y2, {weight: 1, color: :BLUE}) if @last_x and @last_y
209
+ end
207
210
  end
208
- @points << [x2, y2]
209
- @points.shift if @points.length > 2000
211
+ @last_x = x2
212
+ @last_y = y2
210
213
 
211
214
  Nyle.save do
212
215
  Nyle.translate(@cx, @cy)
@@ -218,6 +221,8 @@ class Screen < Nyle::Screen
218
221
  Nyle.draw_line(x1, y1, x2, y2)
219
222
  Nyle.draw_circle(x2, y2, @M2, {color: :BLACK, fill: true})
220
223
  end
224
+
225
+ Nyle.quit if Nyle.key_press?(KEY_Escape)
221
226
  end
222
227
  end
223
228
 
@@ -2,12 +2,13 @@ require 'nyle'
2
2
 
3
3
  class Walker
4
4
  RADIUS = 4
5
- def initialize(max_x, max_y)
5
+ def initialize(max_x, max_y, color = :YELLOW)
6
6
  @max_x = max_x
7
7
  @max_y = max_y
8
8
  @x = max_x / 2.0
9
9
  @y = max_y / 2.0
10
10
  @step = 5
11
+ @color = color
11
12
  end
12
13
 
13
14
  # Randomly move up, down, left, right
@@ -25,7 +26,7 @@ class Walker
25
26
  end
26
27
 
27
28
  def draw
28
- Nyle.draw_circle(@x, @y, RADIUS, {color: :YELLOW, fill: true})
29
+ Nyle.draw_circle(@x, @y, RADIUS, {color: @color, fill: true})
29
30
  end
30
31
  end
31
32
 
@@ -33,7 +34,7 @@ end
33
34
  class Screen < Nyle::Screen
34
35
 
35
36
  def initialize
36
- super(64 * 5, 48 * 5, {bgcolor: :BLACK})
37
+ super(320, 240, {bgcolor: :BLACK})
37
38
  @walker = Walker.new(@width, @height)
38
39
  end
39
40
 
@@ -2,12 +2,13 @@ require 'nyle'
2
2
 
3
3
  class Walker
4
4
  RADIUS = 4
5
- def initialize(max_x, max_y)
5
+ def initialize(max_x, max_y, color = :YELLOW)
6
6
  @max_x = max_x
7
7
  @max_y = max_y
8
8
  @x = max_x / 2.0
9
9
  @y = max_y / 2.0
10
10
  @step = 5
11
+ @color = color
11
12
  end
12
13
 
13
14
  # Randomly move up, down, left, right
@@ -25,7 +26,7 @@ class Walker
25
26
  end
26
27
 
27
28
  def draw
28
- Nyle.draw_circle(@x, @y, RADIUS, {color: :YELLOW, fill: true})
29
+ Nyle.draw_circle(@x, @y, RADIUS, {color: @color, fill: true})
29
30
  end
30
31
  end
31
32
 
@@ -33,7 +34,7 @@ end
33
34
  class Screen < Nyle::Screen
34
35
 
35
36
  def initialize
36
- super(64 * 5, 48 * 5, {bgcolor: :BLACK, trace: true})
37
+ super(320, 240, {bgcolor: :BLACK, trace: true})
37
38
  @walker = Walker.new(@width, @height)
38
39
  end
39
40
 
@@ -2,12 +2,13 @@ require 'nyle'
2
2
 
3
3
  class Walker
4
4
  RADIUS = 4
5
- def initialize(max_x, max_y)
5
+ def initialize(max_x, max_y, color = :YELLOW)
6
6
  @max_x = max_x
7
7
  @max_y = max_y
8
8
  @x = max_x / 2.0
9
9
  @y = max_y / 2.0
10
10
  @step = 5
11
+ @color = color
11
12
  end
12
13
 
13
14
  # Randomly move up, down, left, right
@@ -25,7 +26,7 @@ class Walker
25
26
  end
26
27
 
27
28
  def draw
28
- Nyle.draw_circle(@x, @y, RADIUS, {color: :YELLOW, fill: true})
29
+ Nyle.draw_circle(@x, @y, RADIUS, {color: @color, fill: true})
29
30
  end
30
31
  end
31
32
 
@@ -33,7 +34,7 @@ end
33
34
  class Screen < Nyle::Screen
34
35
 
35
36
  def initialize
36
- super(64 * 5, 48 * 5, {bgcolor: :BLACK, trace: true})
37
+ super(320, 240, {bgcolor: :BLACK, trace: true})
37
38
  @walker = Walker.new(@width, @height)
38
39
  end
39
40
 
@@ -0,0 +1,72 @@
1
+ require 'nyle'
2
+
3
+ class Walker
4
+ RADIUS = 4
5
+ def initialize(max_x, max_y, color = :YELLOW)
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
+ @color = color
12
+ end
13
+
14
+ # Randomly move up, down, left, right
15
+ def move
16
+ stepx = rand(3) - 1
17
+ stepy = rand(3) - 1
18
+ @x += stepx * @step
19
+ @y += stepy * @step
20
+
21
+ # x,y limitter
22
+ @x = 0 if @x < 0
23
+ @x = @max_x if @x > @max_x
24
+ @y = 0 if @y < 0
25
+ @y = @max_y if @y > @max_y
26
+ end
27
+
28
+ def draw
29
+ Nyle.draw_circle(@x, @y, RADIUS, {color: @color, fill: true})
30
+ end
31
+ end
32
+
33
+
34
+ class Screen < Nyle::Screen
35
+
36
+ def initialize
37
+ super(320, 240, {bgcolor: :BLACK, trace: false})
38
+ @walker1 = Walker.new(@width, @height, :YELLOW)
39
+ @walker2 = Walker.new(@width, @height, :GREEN)
40
+ @walker3 = Walker.new(@width, @height, :BLUE)
41
+ @walker4 = Walker.new(@width, @height, :RED)
42
+ end
43
+
44
+ def draw
45
+ Nyle.layer(:L1) do
46
+ @walker1.draw
47
+ Nyle.draw_rect(0, 0, @width, @height, {fill: true, color: :BLACK, a: 0.02})
48
+ end
49
+ Nyle.layer(:L2) do
50
+ @walker2.draw
51
+ end
52
+ Nyle.layer(:L3) do
53
+ Nyle.clear
54
+ @walker3.draw
55
+ end
56
+ @walker4.draw
57
+ end
58
+
59
+ def update
60
+ @walker1.move
61
+ @walker2.move
62
+ @walker3.move
63
+ @walker4.move
64
+ Nyle.quit if Nyle.key_press?(KEY_Escape)
65
+ end
66
+
67
+ end
68
+
69
+
70
+ Screen.new.show_all({interval: 30})
71
+ Nyle.main
72
+
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.2
4
+ version: 0.7.3
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-04-14 00:00:00.000000000 Z
11
+ date: 2019-05-26 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/fourier_series.rb
55
56
  - samples/application/pendulum.rb
56
57
  - samples/application/sketch.rb
57
58
  - samples/application/sugar.rb
@@ -71,6 +72,7 @@ files:
71
72
  - samples/basic/random_walk.rb
72
73
  - samples/basic/random_walk_trace.rb
73
74
  - samples/basic/random_walk_trace_fadeout.rb
75
+ - samples/basic/random_walk_trace_layer.rb
74
76
  - samples/basic/rotation.rb
75
77
  - samples/image/n_b_crocodile.png
76
78
  - samples/image/n_c_mogura.png