gosu_extensions 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2
@@ -12,143 +12,26 @@ module Moveable extend Trait
12
12
  Backwards = :backwards; def self.backwards strength = 1.0; [Backwards, strength] end
13
13
  # TODO Jump = :jump
14
14
 
15
- def self.included klass
16
- klass.extend ClassMethods
17
- end
18
-
19
- module ClassMethods
20
-
21
- # Initial setting.
22
- #
23
- def friction amount = nil, &block
24
- to_execute = block_given? ? block : lambda { amount }
25
- InitializerHooks.register self do
26
- self.friction = to_execute[]
27
- end
28
- end
29
- def velocity amount = nil, &block
30
- to_execute = block_given? ? block : lambda { amount }
31
- InitializerHooks.register self do
32
- self.velocity = to_execute[]
33
- end
34
- end
35
- def rotation amount = nil, &block
36
- to_execute = block_given? ? block : lambda { amount }
37
- InitializerHooks.register self do
38
- self.rotation = to_execute[]
39
- end
40
- end
41
-
42
- def random_rotation
43
- rotation { 2*Math::PI*rand }
44
- end
45
-
46
- end
47
-
48
- # Directly set the position of our Moveable using a vector.
49
- #
50
- def warp vector
51
- @shape.body.p = vector
52
- end
53
-
54
- # Directly set the position of our Moveable.
55
- #
56
- def warp_to x, y
57
- @shape.body.p = CP::Vec2.new(x, y)
58
- end
59
-
60
- # Directly set the position of our Moveable.
61
- #
62
- def position= position
63
- @shape.body.p = position
64
- end
65
- def position
66
- @shape.body.p
67
- end
68
-
69
- # Directly set the torque of our Moveable.
70
- #
71
- def torque= torque
72
- @shape.body.t = torque
73
- end
74
- def torque
75
- @shape.body.t
76
- end
77
-
78
- # Directly set the speed of our Moveable.
79
- #
80
- def speed= v
81
- @shape.body.v = v
82
- end
83
- def speed
84
- @shape.body.v
85
- end
86
- def current_speed
87
- speed.length
88
- end
89
-
90
- # Directly set the rotation of our Moveable.
91
- #
92
- def rotation= rotation
93
- @shape.body.a = rotation % (2*Math::PI)
94
- end
95
- def rotation
96
- @shape.body.a
97
- end
98
- def drawing_rotation
99
- self.rotation.radians_to_gosu
100
- end
101
- def rotation_vector
102
- @shape.body.a.radians_to_vec2
103
- end
104
-
105
- def friction= friction
106
- @shape.u = friction
107
- end
108
- def friction
109
- @shape.u
110
- end
111
-
112
- # Length is the vector length you want.
113
- #
114
- # Note: radians_to_vec2
115
- #
116
- def rotation_as_vector length
117
- rotation = -self.rotation + Math::PI / 2
118
- x = Math.sin rotation
119
- y = Math.cos rotation
120
- total_length = Math.sqrt(x**2 + y**2)
121
- multiplier = length / total_length
122
- CP::Vec2.new(x * multiplier, y * multiplier)
123
- end
124
-
125
- def move
126
-
127
- end
128
-
129
- # Methods for controls.
15
+ # Default methods for controls.
130
16
  #
131
17
  def accelerate strength = 1.0
132
18
  self.speed += self.rotation_vector * strength/SUBSTEPS
133
19
  end
134
20
  def move_left strength = 1.0
135
- self.speed += CP::Vec2.new(-strength.to_f/SUBSTEPS, 0)
21
+ self.speed += CP::Vec2.new(-strength.to_f/SUBSTEPS, 0)
136
22
  end
137
23
  def move_right strength = 1.0
138
- self.speed += CP::Vec2.new(strength.to_f/SUBSTEPS, 0)
24
+ self.speed += CP::Vec2.new(strength.to_f/SUBSTEPS, 0)
139
25
  end
140
26
  def move_up strength = 1.0
141
- self.speed += CP::Vec2.new(0, -strength.to_f/SUBSTEPS)
27
+ self.speed += CP::Vec2.new(0, -strength.to_f/SUBSTEPS)
142
28
  end
143
29
  def move_down strength = 1.0
144
- self.speed += CP::Vec2.new(0, strength.to_f/SUBSTEPS)
30
+ self.speed += CP::Vec2.new(0, strength.to_f/SUBSTEPS)
145
31
  end
146
32
  def backwards strength = 1.0
147
33
  accelerate -0.5*strength
148
34
  end
149
- # def jump strength = 100
150
- # self.speed += CP::Vec2.new(0, -strength.to_f/SUBSTEPS) if self.current_speed <= 1
151
- # end
152
35
 
153
36
  # Movement rules
154
37
  #
data/lib/traits/pod.rb CHANGED
@@ -26,6 +26,7 @@ module Pod extend Trait
26
26
 
27
27
  def holds_attachments
28
28
  class_inheritable_accessor :prototype_attachments
29
+ self.prototype_attachments ||= []
29
30
  hook = lambda do
30
31
  self.class.prototype_attachments.each do |type, x, y|
31
32
  attach type.new(self.window), x, y
@@ -42,7 +43,6 @@ module Pod extend Trait
42
43
  # attach Cannon, 30, 10
43
44
  #
44
45
  def attach type, x, y
45
- self.prototype_attachments ||= []
46
46
  self.prototype_attachments << [type, x, y]
47
47
  end
48
48
 
@@ -50,18 +50,7 @@ module Pod extend Trait
50
50
 
51
51
  module InstanceMethods
52
52
 
53
- def materialize attachment
54
- attachment.extend Attachable # This is where Ruby shines.
55
- window.register attachment
56
- end
57
-
58
- #
59
- #
60
- def attachments
61
- @attachments || @attachments = []
62
- end
63
-
64
- #
53
+ # Attach an instance to this.
65
54
  #
66
55
  def attach attachment, x, y
67
56
  # TODO Move to better place.
@@ -72,12 +61,24 @@ module Pod extend Trait
72
61
  attachments << attachment
73
62
  end
74
63
 
75
- #
64
+ # Detach an instance from this.
76
65
  #
77
66
  def detach attachment
78
67
  self.attachments.delete attachment if self.attachments
79
68
  end
80
69
 
70
+
71
+ def materialize attachment
72
+ attachment.extend Attachable # This is where Ruby shines.
73
+ window.register attachment
74
+ end
75
+
76
+ #
77
+ #
78
+ def attachments
79
+ @attachments || @attachments = [] # TODO use Attachments.new
80
+ end
81
+
81
82
  #
82
83
  #
83
84
  def move_attachments
data/lib/units/sprite.rb CHANGED
@@ -1,5 +1,164 @@
1
+ # Sprite is the basic object in Gosu Extensions.
2
+ #
3
+ # It is different from Thing in that it has no body. It's just a bodyless, displayed sprite.
4
+ #
1
5
  class Sprite
2
6
 
3
7
  include VectorUtilities
8
+ include Imageable
9
+ include InitializerHooks
10
+ include ItIsA
11
+ it_is Moveable
12
+
13
+ attr_reader :window
14
+
15
+ # Every thing knows the window it is attached to.
16
+ #
17
+ def initialize window
18
+ @window = window
19
+ self.destroyed = false
20
+ after_initialize
21
+ end
22
+
23
+ # Default layer is Layer::Players.
24
+ #
25
+ def layer
26
+ Layer::Players
27
+ end
28
+ # Default rotation is upwards.
29
+ #
30
+ def rotation
31
+ @rotation || -Math::PI/2
32
+ end
33
+
34
+ class << self
35
+
36
+ # Define a layer.
37
+ #
38
+ def layer layer
39
+ define_method :layer do
40
+ layer
41
+ end
42
+ end
43
+
44
+ #
45
+ #
46
+ def rotation amount = nil, &block
47
+ # Override default.
48
+ #
49
+ to_execute = block_given? ? block : lambda { amount }
50
+ InitializerHooks.append self do
51
+ self.rotation = to_execute[]
52
+ end
53
+ end
54
+ def random_rotation
55
+ rotation { 2*Math::PI*rand }
56
+ end
57
+
58
+ # Plays a random sound of the given sounds.
59
+ #
60
+ def plays paths, options = {}
61
+ paths = [*paths]
62
+ InitializerHooks.register self do
63
+ sound = Gosu::Sample.new self.window, File.join(Resources.root, paths[rand(paths.size)])
64
+ sound.play options[:volume] || 1.0
65
+ end
66
+ end
67
+
68
+ end
69
+
70
+ # Override this.
71
+ #
72
+ def move
73
+
74
+ end
75
+
76
+ # Do something threaded.
77
+ #
78
+ # Default is: Instantly, in the next step.
79
+ #
80
+ def threaded time = 1, &code
81
+ self.window.threaded time, &code
82
+ end
83
+
84
+ # Some things you can only do every x time units.
85
+ #
86
+ # Example:
87
+ # sometimes :loading, self.frequency do
88
+ # projectile = self.shot.shoot_from self
89
+ # projectile.rotation = self.muzzle_rotation[target]
90
+ # projectile.speed = self.muzzle_velocity[target] * projectile.velocity
91
+ # end
92
+ #
93
+ def sometimes variable, units = 1, &block
94
+ name = :"@#{variable}"
95
+ return if instance_variable_get(name)
96
+ instance_variable_set name, true
97
+ result = block.call
98
+ threaded units.to_i do
99
+ self.instance_variable_set name, false
100
+ end
101
+ result
102
+ end
103
+
104
+ #
105
+ #
106
+ def add_to environment
107
+ # A sprite is not added to the physical environment.
108
+ end
109
+
110
+ # Destroy this thing.
111
+ #
112
+ attr_writer :destroyed
113
+ def destroyed?
114
+ @destroyed
115
+ end
116
+ def destroyed!
117
+ # Override
118
+ end
119
+ def destroy!
120
+ return if self.destroyed?
121
+ self.destroyed!
122
+ self.destroyed = true
123
+ end
124
+
125
+ # Draws its image.
126
+ #
127
+ def draw
128
+ self.image.draw_rot self.position.x, self.position.y, self.layer, self.drawing_rotation, 0.5, 0.5, *self.current_size
129
+ end
130
+ def current_size
131
+ [1.0, 1.0] # default implementation - change this to [1.0, 2.0] if you want a "light" version ;)
132
+ end
133
+
134
+ # Derived Position/Movement methods.
135
+ #
136
+ def warp vector
137
+ self.position = vector
138
+ end
139
+ # Directly set the position of our Moveable.
140
+ #
141
+ def warp_to x, y
142
+ warp CP::Vec2.new(x, y)
143
+ end
144
+ def drawing_rotation
145
+ self.rotation.radians_to_gosu
146
+ end
147
+ def rotation_vector
148
+ self.rotation.radians_to_vec2
149
+ end
150
+ def current_speed
151
+ speed.length
152
+ end
153
+
154
+ # Movement and Position.
155
+ #
156
+
157
+ #
158
+ #
159
+ attr_accessor :position, :speed
160
+ def rotation= rotation
161
+ @rotation = rotation % (2*Math::PI)
162
+ end
4
163
 
5
164
  end
data/lib/units/thing.rb CHANGED
@@ -1,34 +1,8 @@
1
+ # Thing is a physical version of a sprite. Collides and has a mass and a moment.
2
+ #
1
3
  class Thing < Sprite
2
4
 
3
- include InitializerHooks
4
- include ItIsA
5
-
6
- # TODO Move these.
7
- #
8
- it_is Imageable
9
- it_is Moveable
10
-
11
- attr_writer :layer
12
- attr_reader :window, :shape
13
-
14
- # Every thing knows the window it is attached to.
15
- #
16
- def initialize window
17
- @window = window
18
- self.destroyed = false
19
- after_initialize
20
- end
21
-
22
- # Default layer is Layer::Players.
23
- #
24
- def self.layer layer
25
- InitializerHooks.register self do
26
- self.layer = layer
27
- end
28
- end
29
- def layer
30
- @layer || Layer::Players
31
- end
5
+ attr_reader :shape
32
6
 
33
7
  def mass
34
8
  0.1
@@ -36,6 +10,9 @@ class Thing < Sprite
36
10
  def moment
37
11
  0.1
38
12
  end
13
+ def friction
14
+ 100.0
15
+ end
39
16
 
40
17
  class << self
41
18
  @@form_shape_class_mapping = {
@@ -49,7 +26,7 @@ class Thing < Sprite
49
26
  define_method :radius do
50
27
  args.first # TODO fix!
51
28
  end
52
- InitializerHooks.append self do
29
+ InitializerHooks.prepend self do
53
30
  shape_class = form_shape_class_mapping[form]
54
31
  raise "Shape #{form} does not exist." unless shape_class
55
32
 
@@ -71,6 +48,19 @@ class Thing < Sprite
71
48
  amount
72
49
  end
73
50
  end
51
+ def friction amount
52
+ define_method :friction do
53
+ amount
54
+ end
55
+ end
56
+ # TODO needed?
57
+ #
58
+ def velocity amount = nil, &block
59
+ to_execute = block_given? ? block : lambda { amount }
60
+ InitializerHooks.register self do
61
+ self.velocity = to_execute[]
62
+ end
63
+ end
74
64
 
75
65
  def collision_type type
76
66
  to_execute = lambda do |shape|
@@ -84,60 +74,12 @@ class Thing < Sprite
84
74
  end
85
75
  end
86
76
 
87
- # Plays a random sound of the given sounds.
88
- #
89
- def plays paths, options = {}
90
- paths = [*paths]
91
- InitializerHooks.register self do
92
- sound = Gosu::Sample.new self.window, File.join(Resources.root, paths[rand(paths.size)])
93
- sound.play options[:volume] || 1.0
94
- end
95
- end
96
-
97
77
  end
98
78
 
99
- # Do something threaded.
79
+ # Unregister with the environment if destroyed.
100
80
  #
101
- # Default is: Instantly, in the next step.
102
- #
103
- def threaded time = 1, &code
104
- self.window.threaded time, &code
105
- end
106
-
107
- # Destroy this thing.
108
- #
109
- attr_writer :destroyed
110
- def destroyed?
111
- @destroyed
112
- end
113
- def destroyed!
114
- # Override
115
- end
116
81
  def destroy!
117
- return if self.destroyed?
118
- self.destroyed!
119
- self.window.unregister self
120
- self.destroyed = true
121
- end
122
-
123
- # Some things you can only do every x time units.
124
- #
125
- # Example:
126
- # sometimes :loading, self.frequency do
127
- # projectile = self.shot.shoot_from self
128
- # projectile.rotation = self.muzzle_rotation[target]
129
- # projectile.speed = self.muzzle_velocity[target] * projectile.velocity
130
- # end
131
- #
132
- def sometimes variable, units = 1, &block
133
- name = :"@#{variable}"
134
- return if instance_variable_get(name)
135
- instance_variable_set name, true
136
- result = block.call
137
- threaded units.to_i do
138
- self.instance_variable_set name, false
139
- end
140
- result
82
+ self.window.unregister self if super
141
83
  end
142
84
 
143
85
  # Add this thing to an environment.
@@ -149,13 +91,48 @@ class Thing < Sprite
149
91
  environment.add_shape self.shape
150
92
  end
151
93
 
152
- # Draws its image.
94
+ # Movement and Position
95
+ #
96
+
97
+ #
98
+ #
99
+ def speed= v
100
+ @shape.body.v = v
101
+ end
102
+ def speed
103
+ @shape.body.v
104
+ end
105
+ #
106
+ #
107
+ def rotation= rotation
108
+ @shape.body.a = rotation % (2*Math::PI)
109
+ end
110
+ def rotation
111
+ @shape.body.a
112
+ end
113
+ #
114
+ #
115
+ def position= position
116
+ @shape.body.p = position
117
+ end
118
+ def position
119
+ @shape.body.p
120
+ end
121
+ #
122
+ #
123
+ def friction= friction
124
+ @shape.u = friction
125
+ end
126
+ def friction
127
+ @shape.u
128
+ end
129
+ #
153
130
  #
154
- def draw
155
- self.image.draw_rot self.position.x, self.position.y, self.layer, self.drawing_rotation, 0.5, 0.5, *self.current_size
131
+ def torque= torque
132
+ @shape.body.t = torque
156
133
  end
157
- def current_size
158
- [1.0, 1.0] # default implementation - change this to [1.0, 2.0] if you want a "light" version ;)
134
+ def torque
135
+ @shape.body.t
159
136
  end
160
137
 
161
138
  end
@@ -116,10 +116,12 @@ describe Thing do
116
116
  end
117
117
  context 'non-default' do
118
118
  before(:each) do
119
- @thing.layer = :non_default_layer
119
+ class Thong < Thing
120
+ layer :non_default_layer
121
+ end
120
122
  end
121
123
  it "should be on the non default layer" do
122
- @thing.layer.should == :non_default_layer
124
+ Thong.new(:some_window).layer.should == :non_default_layer
123
125
  end
124
126
  end
125
127
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 1
9
- version: 0.2.1
8
+ - 2
9
+ version: 0.2.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Florian Hanke