pbox2d 0.4.1-java → 0.4.2-java

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
  SHA1:
3
- metadata.gz: 484938096a6218ebe38a1b79215bf8f0e1062b91
4
- data.tar.gz: 71f92da9c98bc3a5a73753ae6d63a0dfb0225bba
3
+ metadata.gz: 1ff8899781cd0308635cb95b3f78b9e3789d345d
4
+ data.tar.gz: 37b9df883bb1730e4f7129aebe65acd7c8b6a86e
5
5
  SHA512:
6
- metadata.gz: d63ff12ca750102d8e68927f3af4f64fc6c41b2fa9db8a4deb1f4036904263f83e2a57de5d146a66a3bb873449358d21a3962360197bf4d5a87c589f5a080138
7
- data.tar.gz: 7e404dd6bcf9f5af267aefaef8e8b4facb1508096c946ca9dd3fd90436a4f30af9fe071d997a86ee5689d854f22713faba3c237af733a02ecb3648a09d592fa3
6
+ metadata.gz: 9c6218dacd978b3c530fea1d4df318d6281c4e265a4140c9bc0a376487dbd9f76e1e8aedd28d06736b40d59c00da33421030e1ebe765431c102eeaeccccc26f1
7
+ data.tar.gz: 6ed60e48763528a00bdad9f0d6a93e49dfa8b5802d3acac0293bf49c13dd84161930f5bc37fad65efa4786acc5c536db3ce8ee5930131c89eaa6657fc822cb2d
data/README.md CHANGED
@@ -30,7 +30,7 @@ Copyright (c) 2014 Daniel Shiffman
30
30
 
31
31
  This gem was created by Martin Prout
32
32
 
33
- Copyright (c) 2014 Martin Prout
33
+ Copyright (c) 2014-2015 Martin Prout
34
34
 
35
35
  ### To compile
36
36
 
@@ -60,6 +60,6 @@ The other thing you should know is there is a mismatch between the physics world
60
60
  [Nature of Code book]:http://natureofcode.com/
61
61
  [Sandi Metz]:http://www.poodr.com/
62
62
  [this book]:http://www.crcpress.com/product/isbn/9781466565760
63
- [zip]:https://github.com/ruby-processing/jbox2d/archive/0.3.0.zip
64
- [tar]:https://github.com/ruby-processing/jbox2d/archive/0.3.0.tar.gz
63
+ [zip]:https://github.com/ruby-processing/jbox2d/archive/0.4.2.zip
64
+ [tar]:https://github.com/ruby-processing/jbox2d/archive/0.4.2.tar.gz
65
65
  [Wiki]:https://github.com/ruby-processing/jbox2d/wiki
@@ -37,5 +37,5 @@ def draw
37
37
  particles.reject!(&:done)
38
38
  # Just drawing the framerate to see how many particles it can handle
39
39
  fill(0)
40
- text("framerate: #{frame_rate.to_i}", 12, 16)
40
+ text(format('framerate: %d', frame_rate), 12, 16)
41
41
  end
@@ -1,7 +1,6 @@
1
1
  # The Nature of Code
2
2
  # Daniel Shiffman
3
3
  # http://natureofcode.com
4
- require 'forwardable'
5
4
 
6
5
  # A fixed boundary class
7
6
  class Boundary
@@ -9,24 +8,24 @@ class Boundary
9
8
  def_delegators(:@app, :box2d, :rect_mode, :rect, :fill, :stroke)
10
9
  # A boundary is a simple rectangle with x, y, width, and height
11
10
  attr_reader :x, :y, :w, :h
12
-
11
+
13
12
  def initialize(x, y, w, h)
14
13
  @x, @y, @w, @h = x, y, w, h
15
14
  @app = $app
16
15
  # Define the polygon
17
16
  sd = PolygonShape.new
18
17
  # Figure out the box2d coordinates
19
- box2dW = box2d.scale_to_world(w / 2)
20
- box2dH = box2d.scale_to_world(h / 2)
18
+ box2dw = box2d.scale_to_world(w / 2)
19
+ box2dh = box2d.scale_to_world(h / 2)
21
20
  # We're just a box
22
- sd.setAsBox(box2dW, box2dH)
21
+ sd.setAsBox(box2dw, box2dh)
23
22
  # Create the body
24
23
  bd = BodyDef.new
25
24
  bd.type = BodyType::STATIC
26
- bd.position.set(box2d.processing_to_world(x,y))
25
+ bd.position.set(box2d.processing_to_world(x, y))
27
26
  b = box2d.createBody(bd)
28
27
  # Attached the shape to the body using a Fixture
29
- b.createFixture(sd,1)
28
+ b.create_fixture(sd, 1)
30
29
  end
31
30
 
32
31
  # Draw the boundary, if it were at an angle we'd have to do something fancier
@@ -2,31 +2,33 @@
2
2
  # Daniel Shiffman
3
3
  # http://natureofcode.com
4
4
 
5
- # Example demonstrating distance joints
5
+ # Example demonstrating distance joints
6
6
  # A bridge is formed by connected a series of particles with joints
7
7
 
8
8
  require 'pbox2d'
9
+ require 'forwardable'
9
10
  require_relative 'boundary'
10
11
  require_relative 'pair'
11
12
  require_relative 'particle'
13
+ require_relative 'particle_system'
12
14
 
13
- attr_reader :box2d, :boundaries, :pairs
15
+ attr_reader :box2d, :boundaries, :system
14
16
 
15
17
  def setup
16
18
  size(640, 360)
17
19
  # Initialize box2d physics and create the world
18
20
  @box2d = Box2D.new(self)
19
21
  box2d.create_world
20
- @pairs = []
21
- @boundaries = []
22
- # Add a bunch of fixed boundaries
23
- boundaries << Boundary.new(width / 4, height - 5, width / 2 - 50, 10)
24
- boundaries << Boundary.new(3 * width / 4, height - 50, width / 2 - 50, 10)
22
+ @system = ParticleSystem.new
23
+ @boundaries = [
24
+ Boundary.new(width / 4, height - 5, width / 2 - 50, 10),
25
+ Boundary.new(3 * width / 4, height - 50, width / 2 - 50, 10)
26
+ ]
25
27
  end
26
28
 
27
29
  def draw
28
30
  background(255)
29
- pairs.each(&:display)
31
+ system.run
30
32
  # Display all the boundaries
31
33
  boundaries.each(&:display)
32
34
  fill(0)
@@ -34,5 +36,5 @@ def draw
34
36
  end
35
37
 
36
38
  def mouse_pressed
37
- pairs << Pair.new(mouse_x, mouse_y)
39
+ system.add_pair(mouse_x, mouse_y)
38
40
  end
@@ -1,13 +1,12 @@
1
1
  # The Nature of Code
2
2
  # Daniel Shiffman
3
3
  # http://natureofcode.com
4
- require 'forwardable'
5
4
 
6
5
  # Series of Particles connected with distance joints
7
6
  class Pair
8
7
  extend Forwardable
9
8
  def_delegators(:@app, :box2d, :stroke, :line, :stroke_weight)
10
- attr_reader :p1, :p2, :len
9
+ attr_reader :p1, :p2, :len, :joint
11
10
  # Chain constructor
12
11
  def initialize(x, y)
13
12
  @app = $app
@@ -19,13 +18,34 @@ class Pair
19
18
  djd.bodyA = p1.body
20
19
  djd.bodyB = p2.body
21
20
  # Equilibrium length
22
- djd.length = box2d.scale_to_world(len)
23
- # These properties affect how springy the joint is
21
+ djd.length = box2d.scale_to_world(len)
22
+ # These properties affect how springy the joint is
24
23
  djd.frequencyHz = 3 # Try a value less than 5 (0 for no elasticity)
25
24
  djd.dampingRatio = 0.1 # Ranges between 0 and 1 (1 for no springiness)
26
- # Make the joint. Note we aren't storing a reference to the joint ourselves anywhere!
27
- # We might need to someday, but for now it's ok
28
- box2d.world.create_joint(djd)
25
+ # Make the joint.
26
+ @joint = box2d.world.create_joint(djd)
27
+ end
28
+
29
+ def kill_bodies
30
+ box2d.world.destroy_joint(joint)
31
+ @joint = nil
32
+ box2d.destroy_body(p1.body)
33
+ box2d.destroy_body(p2.body)
34
+ end
35
+
36
+ # Is the pair ready for deletion?
37
+ def done?
38
+ # Let's find the screen position of the particle
39
+ pos1 = box2d.body_coord(p1.body)
40
+ pos2 = box2d.body_coord(p2.body)
41
+ # Is it off the screen?
42
+ if (0..@app.width).include?(pos1.x) || (0..@app.width).include?(pos2.x)
43
+ if (0..@app.height).include?(pos1.y) || (0..@app.height).include?(pos2.y)
44
+ return false
45
+ end
46
+ end
47
+ kill_bodies
48
+ true
29
49
  end
30
50
 
31
51
  def display
@@ -38,4 +58,3 @@ class Pair
38
58
  p2.display
39
59
  end
40
60
  end
41
-
@@ -1,7 +1,6 @@
1
1
  # The Nature of Code
2
2
  # Daniel Shiffman
3
3
  # http://natureofcode.com
4
- require 'forwardable'
5
4
 
6
5
  # A circular particle
7
6
  class Particle
@@ -10,28 +9,28 @@ class Particle
10
9
  :push_matrix, :pop_matrix, :ellipse, :rotate, :translate)
11
10
  # We need to keep track of a Body and a radius
12
11
  attr_reader :body, :r
13
-
12
+
14
13
  def initialize(x, y)
15
14
  @r = 8
16
15
  @app = $app
17
16
  # Define a body
18
17
  bd = BodyDef.new
19
18
  # Set its position
20
- bd.position = box2d.processing_to_world(x,y)
19
+ bd.position = box2d.processing_to_world(x, y)
21
20
  bd.type = BodyType::DYNAMIC
22
21
  @body = box2d.world.createBody(bd)
23
22
 
24
23
  # Make the body's shape a circle
25
24
  cs = CircleShape.new
26
25
  cs.m_radius = box2d.scale_to_world(r)
27
-
26
+
28
27
  fd = FixtureDef.new
29
28
  fd.shape = cs
30
29
  # Parameters that affect physics
31
30
  fd.density = 1
32
31
  fd.friction = 0.01
33
32
  fd.restitution = 0.3
34
-
33
+
35
34
  # Attach fixture to body
36
35
  body.createFixture(fd)
37
36
  body.setLinearVelocity(Vec2.new(rand(-5..5), rand(2..5)))
@@ -41,7 +40,7 @@ class Particle
41
40
  def kill_body
42
41
  box2d.destroy_body(body)
43
42
  end
44
-
43
+
45
44
  # Is the particle ready for deletion?
46
45
  def done
47
46
  # Let's find the screen position of the particle
@@ -71,5 +70,3 @@ class Particle
71
70
  pop_matrix
72
71
  end
73
72
  end
74
-
75
-
@@ -0,0 +1,22 @@
1
+ # run system with a single command
2
+ module Runnable
3
+ def run
4
+ reject!(&:done?)
5
+ each(&:display)
6
+ end
7
+ end
8
+
9
+ # A custom enumerable class, it is so easy in ruby
10
+ class ParticleSystem
11
+ include Enumerable, Runnable
12
+ extend Forwardable
13
+ def_delegators(:@pairs, :each, :reject!, :<<)
14
+
15
+ def initialize
16
+ @pairs = []
17
+ end
18
+
19
+ def add_pair(x, y)
20
+ self << Pair.new(x, y)
21
+ end
22
+ end
@@ -1,10 +1,8 @@
1
- require 'forwardable'
2
-
3
1
  # The boundary class is used to create fixtures
4
2
  class Boundary
5
3
  extend Forwardable
6
4
  def_delegators(:@app, :fill, :stroke, :rect, :rect_mode, :box2d)
7
- attr_reader :x, :y, :w, :h, :b
5
+ attr_reader :pos, :size, :b, :x, :y, :w, :h
8
6
  def initialize(app, x, y, w, h)
9
7
  @app, @x, @y, @w, @h = app, x, y, w, h
10
8
  sd = PolygonShape.new
data/examples/lib/box.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # A Box class, note how to access class ParticleGroupDef in jruby
2
- # which is currently not on an included path for pbox2d
2
+ # which is imported into the PB module and not into global namespace
3
+ # mainly because of probable name conflict with ParticleSystem
3
4
  class Box
4
5
  attr_accessor :pg
5
6
  def initialize(b2d, x, y)
@@ -8,8 +9,8 @@ class Box
8
9
  shape = PolygonShape.new
9
10
  pos = b2d.processing_to_world(x, y)
10
11
  shape.setAsBox(w, h, pos, 0)
11
- pd = Java::OrgJbox2dParticle::ParticleGroupDef.new
12
+ pd = PB::ParticleGroupDef.new
12
13
  pd.shape = shape
13
14
  @pg = b2d.world.create_particle_group(pd)
14
15
  end
15
- end
16
+ end
@@ -0,0 +1,72 @@
1
+ class CustomShape
2
+ include Processing::Proxy
3
+ # We need to keep track of a Body and a width and height
4
+ attr_reader :body, :box2d
5
+
6
+ # Constructor
7
+ def initialize(app, x, y)
8
+ # Add the box to the box2d world
9
+ @box2d = app.box2d
10
+ make_body(Vec2.new(x, y))
11
+ end
12
+
13
+ # This function removes the particle from the box2d world
14
+ def kill_body!
15
+ box2d.destroy_body(body)
16
+ end
17
+
18
+ # Is the particle ready for deletion?
19
+ def done
20
+ # Let's find the screen position of the particle
21
+ pos = box2d.body_coord(body)
22
+ # Is it off the bottom of the screen?
23
+ return false unless pos.y > box2d.height
24
+ kill_body!
25
+ true
26
+ end
27
+
28
+ # Drawing the box
29
+ def display
30
+ # We look at each body and get its screen position
31
+ pos = box2d.body_coord(body)
32
+ # Get its angle of rotation
33
+ a = body.get_angle
34
+ f = body.get_fixture_list
35
+ ps = f.get_shape
36
+ rect_mode(CENTER)
37
+ push_matrix
38
+ translate(pos.x, pos.y)
39
+ rotate(-a)
40
+ fill(175)
41
+ stroke(0)
42
+ begin_shape
43
+ # For every vertex, convert to pixel vector
44
+ ps.get_vertex_count.times do |i|
45
+ v = box2d.vector_to_processing(ps.get_vertex(i))
46
+ vertex(v.x, v.y)
47
+ end
48
+ end_shape(CLOSE)
49
+ pop_matrix
50
+ end
51
+
52
+ # This function adds the rectangle to the box2d world
53
+ def make_body(center)
54
+ # Define a polygon (this is what we use for a rectangle)
55
+ sd = PolygonShape.new
56
+ vertices = []
57
+ vertices << box2d.vector_to_world(Vec2.new(-15, 25))
58
+ vertices << box2d.vector_to_world(Vec2.new(15, 0))
59
+ vertices << box2d.vector_to_world(Vec2.new(20, -15))
60
+ vertices << box2d.vector_to_world(Vec2.new(-10, -10))
61
+ sd.set(vertices.to_java(Java::OrgJbox2dCommon::Vec2), vertices.length)
62
+ # Define the body and make it from the shape
63
+ bd = BodyDef.new
64
+ bd.type = BodyType::DYNAMIC
65
+ bd.position.set(box2d.processing_to_world(center))
66
+ @body = box2d.create_body(bd)
67
+ body.create_fixture(sd, 1.0)
68
+ # Give it some initial random velocity
69
+ body.set_linear_velocity(Vec2.new(rand(-5.0..5), rand(2.0..5)))
70
+ body.set_angular_velocity(rand(-5.0..5))
71
+ end
72
+ end
@@ -16,17 +16,13 @@ class ParticleSystem
16
16
  attr_reader :x, :y
17
17
 
18
18
  def initialize(app, num, x, y)
19
- @particles = [] # Initialize the Array
20
19
  @x, @y = x, y # Store the origin point
21
- num.times do
22
- self << Particle.new(app, x, y)
23
- end
20
+ # initialize array with some particles
21
+ @particles = Array.new(num, Particle.new(app, x, y))
24
22
  end
25
23
 
26
24
  def add_particles(app, n)
27
- n.times do
28
- self << Particle.new(app, x, y)
29
- end
25
+ n.times { self << Particle.new(app, x, y) }
30
26
  end
31
27
  end
32
28
 
@@ -0,0 +1,23 @@
1
+ module Runnable
2
+ def run
3
+ reject! { |item| item.done? }
4
+ each { |item| item.display }
5
+ end
6
+ end
7
+
8
+ class ShapeSystem
9
+ include Enumerable, Runnable
10
+ extend Forwardable
11
+ def_delegators(:@polygons, :each, :reject!, :<<)
12
+
13
+ attr_reader :bd
14
+
15
+ def initialize(bd)
16
+ @bd = bd
17
+ @polygons = [] # Initialize the Array
18
+ end
19
+
20
+ def add_polygon(x, y)
21
+ self << CustomShape.new(bd, x, y)
22
+ end
23
+ end
@@ -14,12 +14,13 @@ def setup
14
14
  @box2d = Box2D.new(self)
15
15
  box2d.init_options(gravity: [0, -10])
16
16
  box2d.create_world
17
- @boundaries = []
18
17
  @boxes = []
19
18
  box2d.world.set_particle_radius(0.15)
20
19
  box2d.world.set_particle_damping(0.2)
21
- boundaries << Boundary.new(self, width / 4, height - 5, width / 2 - 50, 10)
22
- boundaries << Boundary.new(self, 3 * width / 4, height - 50, width / 2 - 50, 10)
20
+ @boundaries = [
21
+ Boundary.new(self, width / 4, height - 5, width / 2 - 50, 10),
22
+ Boundary.new(self, 3 * width / 4, height - 50, width / 2 - 50, 10)
23
+ ]
23
24
  end
24
25
 
25
26
  def mouse_pressed
data/examples/liquidy.rb CHANGED
@@ -11,23 +11,23 @@ def setup
11
11
  # box2d.gravity([0, -20])
12
12
  # Create Arrays
13
13
  @systems = []
14
- @boundaries = []
15
- # Add a bunch of fixed boundaries
16
- boundaries << Boundary.new(self, 50, 100, 5, -0.3)
17
- boundaries << Boundary.new(self, 250, 175, 5, 0.5)
14
+ @boundaries = [
15
+ Boundary.new(self, 50, 100, 5, -0.3),
16
+ Boundary.new(self, 250, 175, 5, 0.5)
17
+ ]
18
18
  end
19
19
 
20
20
  def draw
21
21
  background(255)
22
- # Run all the particle systems
23
- if systems.size > 0
24
- systems.each do |system|
25
- system.run
26
- system.add_particles(self, rand(0..2))
27
- end
28
- end
29
22
  # Display all the boundaries
30
23
  boundaries.each(&:display)
24
+ # Run all the particle systems
25
+ return unless systems.size > 0
26
+ systems.each do |system|
27
+ system.run
28
+ # refresh particles (else we'll run out)
29
+ system.add_particles(self, rand(0..2))
30
+ end
31
31
  end
32
32
 
33
33
  def mouse_pressed
@@ -1,19 +1,19 @@
1
- # The Nature of Code
2
- # Daniel Shiffman
3
- # http://natureofcode.com
1
+ # dummy_spring.rb by Martin Prout
2
+ # An example of duck-typing in ruby-processing
4
3
 
5
- # This class avoids test for nil
4
+ # This class avoids the tests for null seen in vanilla processing version
6
5
  class DummySpring
7
6
  def initialize; end
8
-
9
- # If it exists we set its target to the mouse location
10
7
  def update(_x, _y); end
11
-
12
8
  def display; end
13
-
9
+
14
10
  # This is the key function where
15
- # we attach the spring to an x,y location
16
- # and the Box object's location
11
+ # we attach a real spring between an x, y location
12
+ # and the box object's location
13
+ # @param x (will be mouse_x)
14
+ # @param y (will be mouse_y)
15
+ # @param box Box
16
+ # @return new bound Spring
17
17
  def bind(x, y, box)
18
18
  spring = Spring.new
19
19
  spring.bind(x, y, box)
@@ -21,14 +21,15 @@ def setup
21
21
  box2d.create_world
22
22
  # Make the box
23
23
  @box = Box.new(width / 2, height / 2)
24
- # Make a dummy spring
24
+ # Make a dummy spring, that returns a real spring on :bind
25
25
  @spring = DummySpring.new
26
- # Add a bunch of fixed boundaries
27
- @boundaries = []
28
- boundaries << Boundary.new(width / 2, height - 5, width, 10, 0)
29
- boundaries << Boundary.new(width / 2, 5, width, 10, 0)
30
- boundaries << Boundary.new(width - 5, height / 2, 10, height, 0)
31
- boundaries << Boundary.new(5, height / 2, 10, height, 0)
26
+ # Create a bunch of fixed boundaries
27
+ @boundaries = [
28
+ Boundary.new(width / 2, height - 5, width, 10, 0),
29
+ Boundary.new(width / 2, 5, width, 10, 0),
30
+ Boundary.new(width - 5, height / 2, 10, height, 0),
31
+ Boundary.new(5, height / 2, 10, height, 0)
32
+ ]
32
33
  end
33
34
 
34
35
  # When the mouse is released we're done with the spring
@@ -1,6 +1,7 @@
1
1
  # The Nature of Code
2
2
  # Daniel Shiffman
3
3
  # http://natureofcode.com
4
+ # refactored to avoid suspicious null checking see dummy_spring.rb
4
5
 
5
6
  # Class to describe the spring joint (displayed as a line)
6
7
  class Spring
data/examples/polygons.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # Basic example of falling rectangles
2
2
  require 'pbox2d'
3
3
  require_relative 'lib/custom_shape'
4
+ require_relative 'lib/boundary'
4
5
 
5
6
  attr_reader :box2d, :boundaries, :polygons
6
7
 
@@ -15,12 +16,12 @@ def setup
15
16
  # box2d.gravity([0, -20]
16
17
  # Create Arrays
17
18
  @polygons = []
18
- @boundaries = []
19
- # Add a bunch of fixed boundaries
20
- boundaries << Boundary.new(self, width / 4, height - 5, width / 2 - 50, 10, 0)
21
- boundaries << Boundary.new(self, 3 * width / 4, height - 50, width / 2 - 50, 10, 0)
22
- boundaries << Boundary.new(self, width - 5, height / 2, 10, height, 0)
23
- boundaries << Boundary.new(self, 5, height / 2, 10, height, 0)
19
+ @boundaries = [
20
+ Boundary.new(self, width / 4, height - 5, width / 2 - 50, 10),
21
+ Boundary.new(self, 3 * width / 4, height - 50, width / 2 - 50, 10),
22
+ Boundary.new(self, width - 5, height / 2, 10, height),
23
+ Boundary.new(self, 5, height / 2, 10, height)
24
+ ]
24
25
  end
25
26
 
26
27
  def draw
@@ -19,10 +19,10 @@ def setup
19
19
  # box2d.gravity(0, -20)
20
20
  # Create ArrayLists
21
21
  @boxes = []
22
- @boundaries = []
23
- # Add a bunch of fixed boundaries
24
- boundaries << Boundary.new(self, width / 4, height - 5, width / 2 - 50, 10)
25
- boundaries << Boundary.new(self, 3 * width / 4, height - 50, width / 2 - 50, 10)
22
+ @boundaries = [
23
+ Boundary.new(self, width / 4, height - 5, width / 2 - 50, 10),
24
+ Boundary.new(self, 3 * width / 4, height - 50, width / 2 - 50, 10)
25
+ ]
26
26
  end
27
27
 
28
28
  def draw
@@ -0,0 +1,24 @@
1
+ module Runnable
2
+ def run
3
+ reject!(&:done?)
4
+ each(&:display)
5
+ end
6
+ end
7
+
8
+ class ParticleSystem
9
+ include Enumerable, Runnable
10
+ extend Forwardable
11
+ def_delegators(:@particles, :each, :reject!, :<<)
12
+
13
+ attr_reader :particles
14
+
15
+ def initialize
16
+ @particles = [] # Initialize the Array
17
+ end
18
+
19
+ def add_particles(width)
20
+ return unless rand < 0.1
21
+ sz = rand(4.0..8)
22
+ particles << Particle.new(rand(width / 2 - 100..width / 2 + 100), -20, sz)
23
+ end
24
+ end
@@ -6,15 +6,16 @@
6
6
  require 'pbox2d'
7
7
  require_relative 'windmill'
8
8
  require_relative 'particle'
9
+ require_relative 'particle_system'
9
10
 
10
- attr_reader :box2d, :windmill, :particles
11
+ attr_reader :box2d, :windmill, :system
11
12
 
12
13
  def setup
13
14
  size(640,360)
14
15
  @box2d = Box2D.new(self)
15
16
  box2d.createWorld
16
17
  @windmill = Windmill.new(width / 2, 175)
17
- @particles = []
18
+ @system = ParticleSystem.new
18
19
  end
19
20
 
20
21
  # Click the mouse to turn on or off the motor
@@ -24,21 +25,11 @@ end
24
25
 
25
26
  def draw
26
27
  background(255)
27
- if rand < 0.1
28
- sz = rand(4.0..8)
29
- particles << Particle.new(rand(width / 2 - 100..width / 2 + 100), -20, sz)
30
- end
31
- # Look at all particles, in reverse order
32
- particles.reverse_each do |p|
33
- p.display
34
- # Particles that leave the screen, we delete them
35
- # (note they have to be deleted from both the box2d world and our list
36
- next unless p.done?
37
- particles.shift
38
- end
28
+ system.add_particles(width)
29
+ system.run
39
30
  # Draw the windmill
40
31
  windmill.display
41
- status = windmill.motor_on? ? "ON" : "OFF"
32
+ status = windmill.motor_on? ? 'ON' : 'OFF'
42
33
  fill(0)
43
34
  text(format("Click mouse to toggle motor.\nMotor: %s", status), 10, height - 30)
44
35
  end
@@ -2,7 +2,7 @@
2
2
  # when two particles collide (no change just hitting boundary)
3
3
  class Particle
4
4
  extend Forwardable
5
- def_delegators(:@app, :box2d, :begin_shape, :end_shape, :line, :pop_matrix,
5
+ def_delegators(:@app, :box2d, :begin_shape, :color, :end_shape, :line, :pop_matrix,
6
6
  :ellipse, :translate, :rotate, :stroke, :push_matrix,
7
7
  :fill, :no_fill, :stroke_weight)
8
8
  attr_accessor :body
@@ -12,7 +12,7 @@ class Particle
12
12
  @app, @x, @y, @radius = app, x, y, r
13
13
  # This function puts the particle in the Box2d world
14
14
  make_body(x, y, radius)
15
- @col = -5_263_441 # grey
15
+ @col = color('#c0c0c0') # silver
16
16
  body.setUserData(self)
17
17
  end
18
18
 
@@ -23,7 +23,7 @@ class Particle
23
23
 
24
24
  # Change color when hit
25
25
  def change
26
- @col = -65_536 # red
26
+ @col = color('#cc0000') # red
27
27
  end
28
28
 
29
29
  # Is the particle ready for deletion?
@@ -16,8 +16,7 @@ def setup
16
16
  end
17
17
 
18
18
  def draw
19
- col = color('#ffffff')
20
- background(col)
19
+ background(color('#ffffff'))
21
20
  particles << Particle.new(self, rand(width), 20, rand(4..8)) if rand < 0.1
22
21
  particles.each(&:display)
23
22
  particles.reject!(&:done)
data/lib/box2d.jar CHANGED
Binary file
data/lib/pbox2d.rb CHANGED
@@ -7,7 +7,7 @@ end
7
7
  ContactListener = Java::OrgJbox2dCallbacks::ContactListener
8
8
 
9
9
  def import_class_list(list, string)
10
- list.each { |d| java_import format(string, d) }
10
+ list.each { |klass| java_import format(string, klass) }
11
11
  end
12
12
 
13
13
  common = %w( Vec2 Transform )
@@ -22,5 +22,12 @@ import_class_list(world, world_format)
22
22
  joint = %w( Joint JointDef DistanceJointDef RevoluteJoint RevoluteJointDef MouseJointDef)
23
23
  joint_format = 'org.jbox2d.dynamics.joints.%s'
24
24
  import_class_list(joint, joint_format)
25
+ module PB
26
+ particle = %w( ParticleBodyContact ParticleGroup ParticleType ParticleColor
27
+ ParticleGroupDef StackQueue ParticleContact ParticleGroupType VoronoiDiagram
28
+ ParticleDef ParticleSystem )
29
+ particle_format = 'org.jbox2d.particle.%s'
30
+ import_class_list(particle, particle_format)
31
+ end
25
32
 
26
33
  require_relative 'pbox2d/box2d.rb'
@@ -1,4 +1,4 @@
1
1
  # Module here just to keep namespace tidy
2
2
  module Pbox2D
3
- VERSION = '0.4.1'
3
+ VERSION = '0.4.2'
4
4
  end
metadata CHANGED
@@ -1,22 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pbox2d
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: java
6
6
  authors:
7
7
  - Martin Prout
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-17 00:00:00.000000000 Z
11
+ date: 2015-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
- - - ~>
16
+ - - "~>"
17
17
  - !ruby/object:Gem::Version
18
18
  version: '2.6'
19
- - - '>='
19
+ - - ">="
20
20
  - !ruby/object:Gem::Version
21
21
  version: 2.6.4
22
22
  name: ruby-processing
@@ -24,16 +24,16 @@ dependencies:
24
24
  type: :runtime
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - ~>
27
+ - - "~>"
28
28
  - !ruby/object:Gem::Version
29
29
  version: '2.6'
30
- - - '>='
30
+ - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 2.6.4
33
33
  - !ruby/object:Gem::Dependency
34
34
  requirement: !ruby/object:Gem::Requirement
35
35
  requirements:
36
- - - ~>
36
+ - - "~>"
37
37
  - !ruby/object:Gem::Version
38
38
  version: '10.3'
39
39
  name: rake
@@ -41,13 +41,13 @@ dependencies:
41
41
  type: :development
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ~>
44
+ - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: '10.3'
47
47
  - !ruby/object:Gem::Dependency
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  requirements:
50
- - - ~>
50
+ - - "~>"
51
51
  - !ruby/object:Gem::Version
52
52
  version: '0.9'
53
53
  name: rake-compiler
@@ -55,7 +55,7 @@ dependencies:
55
55
  type: :development
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ~>
58
+ - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0.9'
61
61
  description: "\"An exemplar for how processing/java libraries can be made available\n\
@@ -71,18 +71,17 @@ files:
71
71
  - LICENSE.md
72
72
  - README.md
73
73
  - Rakefile
74
- - lib/pbox2d.rb
75
- - lib/pbox2d/box2d.rb
76
- - lib/pbox2d/version.rb
77
74
  - examples/bumpy_surface_noise.rb
78
75
  - examples/distance_joint/boundary.rb
79
76
  - examples/distance_joint/distance_joint.rb
80
77
  - examples/distance_joint/pair.rb
81
78
  - examples/distance_joint/particle.rb
79
+ - examples/distance_joint/particle_system.rb
82
80
  - examples/lib/boundary.rb
83
81
  - examples/lib/box.rb
84
82
  - examples/lib/custom_shape.rb
85
83
  - examples/lib/particle_system.rb
84
+ - examples/lib/shape_system.rb
86
85
  - examples/lib/surface.rb
87
86
  - examples/liquid_fun_test.rb
88
87
  - examples/liquidy.rb
@@ -95,6 +94,7 @@ files:
95
94
  - examples/quick_test.rb
96
95
  - examples/revolute_joint/box.rb
97
96
  - examples/revolute_joint/particle.rb
97
+ - examples/revolute_joint/particle_system.rb
98
98
  - examples/revolute_joint/revolute_joint.rb
99
99
  - examples/revolute_joint/windmill.rb
100
100
  - examples/test_contact/lib/boundary.rb
@@ -103,6 +103,9 @@ files:
103
103
  - examples/test_contact/test_contact.rb
104
104
  - lib/box2d.jar
105
105
  - lib/jbox2d-library-2.2.1-ds.jar
106
+ - lib/pbox2d.rb
107
+ - lib/pbox2d/box2d.rb
108
+ - lib/pbox2d/version.rb
106
109
  homepage: https://github.com/ruby-processing/jbox2d
107
110
  licenses:
108
111
  - MIT
@@ -113,12 +116,12 @@ require_paths:
113
116
  - lib
114
117
  required_ruby_version: !ruby/object:Gem::Requirement
115
118
  requirements:
116
- - - '>='
119
+ - - ">="
117
120
  - !ruby/object:Gem::Version
118
121
  version: '0'
119
122
  required_rubygems_version: !ruby/object:Gem::Requirement
120
123
  requirements:
121
- - - '>='
124
+ - - ">="
122
125
  - !ruby/object:Gem::Version
123
126
  version: '0'
124
127
  requirements:
@@ -126,7 +129,7 @@ requirements:
126
129
  - java runtime >= 1.7+
127
130
  - processing = 2.2.1+
128
131
  rubyforge_project:
129
- rubygems_version: 2.1.9
132
+ rubygems_version: 2.4.8
130
133
  signing_key:
131
134
  specification_version: 4
132
135
  summary: jbox2d wrapped in a gem for ruby-processing