reflexion 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/application.cpp +5 -1
  3. data/.doc/ext/reflex/arc_shape.cpp +89 -0
  4. data/.doc/ext/reflex/body.cpp +91 -12
  5. data/.doc/ext/reflex/contact_event.cpp +90 -0
  6. data/.doc/ext/reflex/ellipse_shape.cpp +89 -0
  7. data/.doc/ext/reflex/image_view.cpp +0 -16
  8. data/.doc/ext/reflex/native.cpp +18 -6
  9. data/.doc/ext/reflex/rect_shape.cpp +83 -0
  10. data/.doc/ext/reflex/shape_view.cpp +153 -0
  11. data/.doc/ext/reflex/view.cpp +63 -26
  12. data/.doc/ext/reflex/window.cpp +5 -1
  13. data/VERSION +1 -1
  14. data/ext/reflex/application.cpp +6 -2
  15. data/ext/reflex/arc_shape.cpp +94 -0
  16. data/ext/reflex/body.cpp +101 -13
  17. data/ext/reflex/contact_event.cpp +95 -0
  18. data/ext/reflex/ellipse_shape.cpp +94 -0
  19. data/ext/reflex/image_view.cpp +0 -18
  20. data/ext/reflex/native.cpp +18 -6
  21. data/ext/reflex/rect_shape.cpp +86 -0
  22. data/ext/reflex/shape_view.cpp +161 -0
  23. data/ext/reflex/view.cpp +71 -30
  24. data/ext/reflex/window.cpp +5 -1
  25. data/include/reflex/body.h +42 -12
  26. data/include/reflex/event.h +27 -1
  27. data/include/reflex/fixture.h +6 -5
  28. data/include/reflex/image_view.h +5 -5
  29. data/include/reflex/ruby/application.h +27 -6
  30. data/include/reflex/ruby/event.h +11 -0
  31. data/include/reflex/ruby/shape_view.h +96 -0
  32. data/include/reflex/ruby/view.h +60 -5
  33. data/include/reflex/ruby/window.h +12 -3
  34. data/include/reflex/shape_view.h +146 -0
  35. data/include/reflex/view.h +17 -5
  36. data/lib/reflex/application.rb +9 -9
  37. data/lib/reflex/body.rb +2 -0
  38. data/lib/reflex/contact_event.rb +38 -0
  39. data/lib/reflex/image_view.rb +1 -1
  40. data/lib/reflex/shape_view.rb +25 -0
  41. data/lib/reflex/view.rb +19 -9
  42. data/lib/reflex/window.rb +11 -10
  43. data/lib/reflex.rb +15 -13
  44. data/lib/reflexion.rb +25 -18
  45. data/samples/osx/hello/hello/main.cpp +6 -0
  46. data/samples/physics.rb +22 -12
  47. data/samples/reflexion/breakout.rb +52 -0
  48. data/samples/reflexion/hello.rb +5 -7
  49. data/samples/reflexion/paint.rb +10 -11
  50. data/samples/reflexion/physics.rb +28 -0
  51. data/samples/reflexion/pulse.rb +10 -8
  52. data/samples/shapes.rb +2 -2
  53. data/src/body.cpp +241 -40
  54. data/src/event.cpp +32 -2
  55. data/src/shape_view.cpp +306 -0
  56. data/src/view.cpp +232 -66
  57. data/src/world.cpp +110 -30
  58. data/src/world.h +61 -14
  59. metadata +24 -7
  60. data/lib/reflex/arc_shape.rb +0 -20
  61. data/lib/reflex/ellipse_shape.rb +0 -20
  62. data/lib/reflex/line_shape.rb +0 -20
  63. data/lib/reflex/rect_shape.rb +0 -20
  64. data/lib/reflex/shape.rb +0 -34
@@ -0,0 +1,146 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __REFLEX_SHAPE_VIEW_H__
4
+ #define __REFLEX_SHAPE_VIEW_H__
5
+
6
+
7
+ #include <xot/pimpl.h>
8
+ #include <reflex/view.h>
9
+
10
+
11
+ namespace Reflex
12
+ {
13
+
14
+
15
+ class ShapeView : public View
16
+ {
17
+
18
+ typedef View Super;
19
+
20
+ public:
21
+
22
+ ShapeView (const char* name = NULL);
23
+
24
+ virtual ~ShapeView ();
25
+
26
+ virtual void set_fill (float red, float green, float blue, float alpha = 1);
27
+
28
+ virtual void set_fill (const Color& color);
29
+
30
+ virtual void no_fill ();
31
+
32
+ virtual const Color& fill () const;
33
+
34
+ virtual void set_stroke (float red, float green, float blue, float alpha = 1);
35
+
36
+ virtual void set_stroke (const Color& color);
37
+
38
+ virtual void no_stroke ();
39
+
40
+ virtual const Color& stroke () const;
41
+
42
+ virtual Point content_size () const;
43
+
44
+ virtual void on_draw (DrawEvent* e);
45
+
46
+ virtual void on_draw_shape (DrawEvent* e);
47
+
48
+ struct Data;
49
+
50
+ Xot::PImpl<Data> self;
51
+
52
+ };// ShapeView
53
+
54
+
55
+ class RectShape : public ShapeView
56
+ {
57
+
58
+ typedef ShapeView Super;
59
+
60
+ public:
61
+
62
+ RectShape (const char* name = NULL);
63
+
64
+ virtual ~RectShape ();
65
+
66
+ virtual void set_round (coord round);
67
+
68
+ virtual void set_round (coord width, coord height);
69
+
70
+ virtual void set_round (const Point& round);
71
+
72
+ virtual const Point& round () const;
73
+
74
+ virtual void on_draw_shape (DrawEvent* e);
75
+
76
+ struct Data;
77
+
78
+ Xot::PImpl<Data> self;
79
+
80
+ };// RectShape
81
+
82
+
83
+ class EllipseShape : public ShapeView
84
+ {
85
+
86
+ typedef ShapeView Super;
87
+
88
+ public:
89
+
90
+ EllipseShape (const char* name = NULL);
91
+
92
+ virtual ~EllipseShape ();
93
+
94
+ virtual void set_radius_min (coord radius);
95
+
96
+ virtual coord radius_min () const;
97
+
98
+ virtual void set_nsegment (uint num_of_segments);
99
+
100
+ virtual uint nsegment() const;
101
+
102
+ virtual void make_body ();
103
+
104
+ virtual void on_draw_shape (DrawEvent* e);
105
+
106
+ struct Data;
107
+
108
+ Xot::PImpl<Data> self;
109
+
110
+ };// EllipseShape
111
+
112
+
113
+ class ArcShape : public EllipseShape
114
+ {
115
+
116
+ typedef EllipseShape Super;
117
+
118
+ public:
119
+
120
+ ArcShape (const char* name = NULL);
121
+
122
+ virtual ~ArcShape ();
123
+
124
+ virtual void set_angle_from (float degree);
125
+
126
+ virtual float angle_from () const;
127
+
128
+ virtual void set_angle_to (float degree);
129
+
130
+ virtual float angle_to () const;
131
+
132
+ virtual void make_body ();
133
+
134
+ virtual void on_draw_shape (DrawEvent* e);
135
+
136
+ struct Data;
137
+
138
+ Xot::PImpl<Data> self;
139
+
140
+ };// ArcShape
141
+
142
+
143
+ }// Reflex
144
+
145
+
146
+ #endif//EOH
@@ -154,6 +154,8 @@ namespace Reflex
154
154
 
155
155
  virtual const Bounds& frame () const;
156
156
 
157
+ virtual float angle () const;
158
+
157
159
  virtual void scroll_to (coord x, coord y, coord z = 0);
158
160
 
159
161
  virtual void scroll_to (const Point& scroll);
@@ -180,11 +182,9 @@ namespace Reflex
180
182
 
181
183
  virtual const Body* body () const;
182
184
 
183
- virtual void set_density (float density);
184
-
185
- virtual void set_friction (float friction);
185
+ virtual float meter2pixel (float meter = 1, bool create_world = true);
186
186
 
187
- virtual void set_restitution (float restitution);
187
+ virtual float meter2pixel (float meter = 1) const;
188
188
 
189
189
  virtual void set_gravity (coord x, coord y);
190
190
 
@@ -192,9 +192,13 @@ namespace Reflex
192
192
 
193
193
  virtual Point gravity () const;
194
194
 
195
+ virtual Body* wall ();
196
+
197
+ virtual const Body* wall () const;
198
+
195
199
  virtual void set_debug (bool state);
196
200
 
197
- virtual bool is_debug () const;
201
+ virtual bool debugging () const;
198
202
 
199
203
  virtual Point from_parent (const Point& point) const;
200
204
 
@@ -224,6 +228,8 @@ namespace Reflex
224
228
 
225
229
  virtual void on_resize (FrameEvent* e);
226
230
 
231
+ virtual void on_rotate (FrameEvent* e);
232
+
227
233
  virtual void on_scroll (ScrollEvent* e);
228
234
 
229
235
  virtual void on_focus (FocusEvent* e);
@@ -248,6 +254,12 @@ namespace Reflex
248
254
 
249
255
  virtual void on_capture (CaptureEvent* e);
250
256
 
257
+ virtual void on_contact (ContactEvent* e);
258
+
259
+ virtual void on_contact_begin (ContactEvent* e);
260
+
261
+ virtual void on_contact_end (ContactEvent* e);
262
+
251
263
  virtual operator bool () const;
252
264
 
253
265
  virtual bool operator ! () const;
@@ -18,21 +18,21 @@ module Reflex
18
18
  def initialize (opts = {}, &block)
19
19
  super()
20
20
  set opts
21
- @on_start = block if block
22
- end
23
-
24
- def on_start (e)
25
- if @on_start
26
- Xot::BlockUtil.instance_eval_or_block_call self, &@on_start
27
- @on_start = nil
28
- end
29
- on_start! e
21
+ @start_block = block if block
30
22
  end
31
23
 
32
24
  def self.start (*args, &block)
33
25
  self.new(*args, &block).start
34
26
  end
35
27
 
28
+ private
29
+
30
+ def call_start_block ()
31
+ return unless @start_block
32
+ Xot::BlockUtil.instance_eval_or_block_call self, &@start_block
33
+ @start_block = nil
34
+ end
35
+
36
36
  end# Application
37
37
 
38
38
 
data/lib/reflex/body.rb CHANGED
@@ -11,6 +11,8 @@ module Reflex
11
11
 
12
12
  include Xot::Setter
13
13
 
14
+ alias meter meter2pixel
15
+
14
16
  end# Body
15
17
 
16
18
 
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+
4
+ require 'reflex/ext'
5
+
6
+
7
+ module Reflex
8
+
9
+
10
+ class ContactEvent
11
+
12
+ def type ()
13
+ TYPE2SYM[get_type] || :none
14
+ end
15
+
16
+ def begin? ()
17
+ get_type == TYPE_BEGIN
18
+ end
19
+
20
+ def end? ()
21
+ get_type == TYPE_END
22
+ end
23
+
24
+ def inspect ()
25
+ "#<Reflex::ContactEvent type:#{type} view:#{view}>"
26
+ end
27
+
28
+ private
29
+
30
+ TYPE2SYM = {
31
+ TYPE_BEGIN => :begin,
32
+ TYPE_END => :end,
33
+ }
34
+
35
+ end# ContactEvent
36
+
37
+
38
+ end# Reflex
@@ -7,7 +7,7 @@ require 'reflex/view'
7
7
  module Reflex
8
8
 
9
9
 
10
- class ImageView < View
10
+ class ImageView
11
11
 
12
12
  has_model
13
13
 
@@ -0,0 +1,25 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+
4
+ require 'reflex/view'
5
+
6
+
7
+ module Reflex
8
+
9
+
10
+ class ShapeView
11
+
12
+ def fill= (*args)
13
+ set_fill Color.color *args
14
+ fill
15
+ end
16
+
17
+ def stroke= (*args)
18
+ set_stroke Color.color *args
19
+ stroke
20
+ end
21
+
22
+ end# ShapeView
23
+
24
+
25
+ end# Reflex
data/lib/reflex/view.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
 
4
+ require 'forwardable'
4
5
  require 'xot/setter'
5
6
  require 'xot/block_util'
6
7
  require 'reflex/ext'
@@ -19,14 +20,23 @@ module Reflex
19
20
  include HasFrame
20
21
  include HasTags
21
22
 
23
+ extend Forwardable
24
+
25
+ def_delegators :body,
26
+ :static=, :static?, :dynamic=, :dynamic?,
27
+ :linear_velocity=, :linear_velocity,
28
+ :angular_velocity=, :angular_velocity,
29
+ :density=, :density, :friction=, :friction, :restitution=, :restitution
30
+
22
31
  alias add add_child
23
32
  alias remove remove_child
24
33
  alias find find_children
34
+ alias meter meter2pixel
25
35
 
26
36
  def initialize (opts = {}, &block)
27
37
  super()
28
38
  set opts
29
- @on_attach = block if block
39
+ @attach_block = block if block
30
40
  end
31
41
 
32
42
  def children ()
@@ -64,18 +74,18 @@ module Reflex
64
74
  end
65
75
  end
66
76
 
67
- def on_attach (e)
68
- on_attach! e
69
- if @on_attach
70
- Xot::BlockUtil.instance_eval_or_block_call self, &@on_attach
71
- @on_attach = nil
72
- end
73
- end
74
-
75
77
  def self.has_model ()
76
78
  include ModelView
77
79
  end
78
80
 
81
+ private
82
+
83
+ def call_attach_block ()
84
+ return unless @attach_block
85
+ Xot::BlockUtil.instance_eval_or_block_call self, &@attach_block
86
+ @attach_block = nil
87
+ end
88
+
79
89
  end# View
80
90
 
81
91
 
data/lib/reflex/window.rb CHANGED
@@ -20,7 +20,8 @@ module Reflex
20
20
  extend Forwardable
21
21
 
22
22
  def_delegators :root,
23
- :add_child, :remove_child, :find_children, :style
23
+ :add_child, :remove_child, :find_children, :style, :meter2pixel, :meter,
24
+ :gravity=, :gravity, :wall, :debug=, :debug?
24
25
 
25
26
  alias add add_child
26
27
  alias remove remove_child
@@ -29,25 +30,25 @@ module Reflex
29
30
  def initialize (opts = {}, &block)
30
31
  super()
31
32
  set opts
32
- @on_show = block if block
33
+ @show_block = block if block
33
34
  end
34
35
 
35
36
  def paint (&block)
36
37
  painter.begin &block
37
38
  end
38
39
 
39
- def on_show (e)
40
- if @on_show
41
- Xot::BlockUtil.instance_eval_or_block_call self, &@on_show
42
- @on_show = nil
43
- end
44
- on_show! e
45
- end
46
-
47
40
  def self.show (*args, &block)
48
41
  new(*args, &block).show
49
42
  end
50
43
 
44
+ private
45
+
46
+ def call_show_block ()
47
+ return unless @show_block
48
+ Xot::BlockUtil.instance_eval_or_block_call self, &@show_block
49
+ @show_block = nil
50
+ end
51
+
51
52
  end# Window
52
53
 
53
54
 
data/lib/reflex.rb CHANGED
@@ -17,24 +17,13 @@ require 'reflex/painter'
17
17
 
18
18
  require 'reflex/reflex'
19
19
  require 'reflex/helper'
20
- require 'reflex/application'
21
- require 'reflex/window'
22
- require 'reflex/view'
23
- require 'reflex/body'
24
- require 'reflex/fixture'
25
- require 'reflex/selector'
26
- require 'reflex/shape'
27
- require 'reflex/line_shape'
28
- require 'reflex/rect_shape'
29
- require 'reflex/ellipse_shape'
30
- require 'reflex/arc_shape'
31
- require 'reflex/model'
32
- require 'reflex/model_owner'
20
+
33
21
  require 'reflex/selector'
34
22
  require 'reflex/style'
35
23
  require 'reflex/style_length'
36
24
  require 'reflex/style_length2'
37
25
  require 'reflex/style_length4'
26
+
38
27
  require 'reflex/update_event'
39
28
  require 'reflex/draw_event'
40
29
  require 'reflex/frame_event'
@@ -44,7 +33,20 @@ require 'reflex/key_event'
44
33
  require 'reflex/pointer_event'
45
34
  require 'reflex/wheel_event'
46
35
  require 'reflex/capture_event'
36
+ require 'reflex/contact_event'
37
+
38
+ require 'reflex/body'
39
+ require 'reflex/fixture'
40
+
41
+ require 'reflex/model'
42
+ require 'reflex/model_owner'
43
+
44
+ require 'reflex/application'
45
+ require 'reflex/window'
46
+ require 'reflex/view'
47
47
 
48
48
  require 'reflex/button'
49
49
  require 'reflex/text_view'
50
50
  require 'reflex/image_view'
51
+
52
+ require 'reflex/shape_view'
data/lib/reflexion.rb CHANGED
@@ -17,80 +17,87 @@ module Reflexion
17
17
  }
18
18
 
19
19
 
20
- class Screen < Window
20
+ class MainWindow < Window
21
21
 
22
22
  attr_accessor :update, :draw, :key, :pointer
23
23
 
24
24
  attr_reader :setup
25
25
 
26
+ attr_reader :event
27
+
26
28
  def setup= (block)
27
29
  @setup = block
28
- call_block self, &@setup
30
+ call_event nil, self, &@setup
29
31
  end
30
32
 
31
33
  def on_update (e)
32
34
  super
33
35
  redraw
34
- call_block e, &@update
36
+ call_event e, e, &@update
35
37
  end
36
38
 
37
39
  def on_draw (e)
38
40
  super
39
- call_block e, &@draw
41
+ call_event e, e.painter, &@draw
40
42
  end
41
43
 
42
44
  def on_key (e)
43
45
  super
44
- call_block e, &@key
46
+ call_event e, e, &@key
45
47
  end
46
48
 
47
49
  def on_pointer (e)
48
50
  super
49
- call_block e, &@pointer
51
+ call_event e, e, &@pointer
50
52
  end
51
53
 
52
- def call_block (*args, &block)
54
+ def call_event (event, *args, &block)
55
+ @event = event
53
56
  Xot::BlockUtil.instance_eval_or_block_call *args, &block if block
54
57
  end
55
58
 
56
- end# Screen
59
+ end# MainWindow
57
60
 
58
61
 
59
62
  module_function
60
63
 
61
- @@screen = Screen.new DEFAULTS
64
+ @@window = MainWindow.new DEFAULTS
65
+
66
+ def window ()
67
+ @@window
68
+ end
62
69
 
63
- def screen ()
64
- @@screen
70
+ def event ()
71
+ window.event
65
72
  end
66
73
 
67
74
  def setup (&block)
68
- screen.setup = block
75
+ window.setup = block
69
76
  end
70
77
 
71
78
  def update (&block)
72
- screen.update = block
79
+ window.update = block
73
80
  end
74
81
 
75
82
  def draw (&block)
76
- screen.draw = block
83
+ window.draw = block
77
84
  end
78
85
 
79
86
  def key (&block)
80
- screen.key = block
87
+ window.key = block
81
88
  end
82
89
 
83
90
  def pointer (&block)
84
- screen.pointer = block
91
+ window.pointer = block
85
92
  end
86
93
 
87
94
  def start ()
88
- screen.show
95
+ window.show
89
96
  Reflex.start
90
97
  end
91
98
 
92
99
  def quit ()
93
- screen.close
100
+ window.close
94
101
  end
95
102
 
96
103
 
@@ -40,6 +40,7 @@ class App : public Application
40
40
  win->show();
41
41
 
42
42
  win->root()->set_gravity(0, 9.8);
43
+ win->root()->set_debug(true);
43
44
 
44
45
  Image image(32, 32);
45
46
  Painter painter = image.painter();
@@ -67,6 +68,11 @@ class App : public Application
67
68
  view->body()->set_dynamic(true);
68
69
  view->body()->set_density(1);
69
70
  }
71
+
72
+ View* ground = new View();
73
+ ground->set_frame(10, 400, 300, 10);
74
+ win->root()->add_child(ground);
75
+ ground->body()->set_static(true);
70
76
  }
71
77
 
72
78
  };// App
data/samples/physics.rb CHANGED
@@ -12,26 +12,36 @@ Reflex.start name: "Physics" do |app|
12
12
  Reflex::Window.show title: app.name, frame: [100, 100, 500, 500] do
13
13
  root.set gravity: Reflex::Point.new(0, 9.8), debug: true
14
14
 
15
- image = Reflex::Image.new(32, 32).paint do |p, img|
16
- p.fill :green
17
- p.ellipse img.bounds
15
+ add_dynamic = -> size = 50, x = rand(10..400), y = rand(10..100) do
16
+ add Reflex::EllipseShape.new {
17
+ set :fill, [:red, :green, :blue, :yellow, :cyan, :magenta, :gray].sample
18
+ set :pos, [x, y]
19
+ set :size, [rand(5..size)] * 2
20
+ body.set dynamic: true, density: 1
21
+ }
18
22
  end
19
23
 
20
- add Reflex::RectShape.new {
21
- set color: :blue, frame: [5, 300, 300, 10]
22
- body.set static: true
23
- }
24
-
25
- 10.times do |n|
26
- add Reflex::ImageView.new {
27
- set image: image, size: image.size, pos: [40 * n, 20 * n]
28
- body.set dynamic: true, density: 1
24
+ add_static = -> size = 50 do
25
+ add Reflex::RectShape.new {
26
+ set :fill, :white
27
+ set :pos, [rand(10..400), rand(200..400)]
28
+ set :size, [rand(5..(size * 2)), rand(5..size)]
29
+ body.set static: true
29
30
  }
30
31
  end
31
32
 
33
+ 50.times {|n| add_dynamic.call}
34
+ 5.times {|n| add_static.call}
35
+
32
36
  after :draw do |e|
33
37
  e.painter.fill :white
34
38
  e.painter.text "#{e.fps.to_i} FPS", 10, 10
35
39
  end
40
+
41
+ on :pointer do |e|
42
+ if e.down? || e.drag?
43
+ add_dynamic.call 50, *e.pos.to_a
44
+ end
45
+ end
36
46
  end
37
47
  end
@@ -0,0 +1,52 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+
4
+ %w[xot rays reflex]
5
+ .map {|s| File.expand_path "../../../../#{s}/lib", __FILE__}
6
+ .each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
7
+
8
+ require 'reflexion/include'
9
+
10
+
11
+ $garbages = []
12
+
13
+ class View
14
+ def setup (frame: [0, 0, 100, 100], color: :white, type: :static)
15
+ set frame: frame, fill: color, density: 1, friction: 0, restitution: 1, type => true
16
+ end
17
+ end
18
+
19
+ setup do
20
+ set size: [600, 400]
21
+ wall.set friction: 0
22
+ 5.times do |y|
23
+ 10.times do |x|
24
+ add RectShape.new {
25
+ setup frame: [(x + 1) * 50, (y + 1) * 20, 30, 10], color: [:white, :red, :green, :blue, :yellow][y]
26
+ on(:contact) {$garbages << self}
27
+ }
28
+ end
29
+ end
30
+ $bar = add RectShape.new {
31
+ setup frame: [0, 350, 100, 20], color: :blue
32
+ }
33
+ end
34
+
35
+ update do
36
+ $garbages.uniq.each {|o| o.parent.remove o}
37
+ $garbages.clear
38
+ end
39
+
40
+ draw do
41
+ text "#{event.fps.to_i} FPS", 10, 10
42
+ end
43
+
44
+ pointer do |e|
45
+ $bar.x = e.x - $bar.w / 2
46
+ if e.down?
47
+ window.add [EllipseShape, RectShape].sample.new {
48
+ setup frame: [e.x, $bar.y - 20, 20, 20], type: :dynamic
49
+ set :linear_velocity, Point.new(rand(-1.0..1.0), -1).normal * 500
50
+ }
51
+ end
52
+ end