pbox2d 0.4.2-java → 0.5.0-java
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.
- checksums.yaml +4 -4
- data/.gitignore +15 -0
- data/CHANGELOG.md +37 -0
- data/CONTRIBUTING.md +30 -0
- data/Gemfile +4 -0
- data/LICENCE +25 -0
- data/LICENSE.md +1 -3
- data/README.md +3 -3
- data/Rakefile +19 -81
- data/examples/README.md +7 -0
- data/examples/bumpy_surface_noise.rb +11 -7
- data/examples/collision_listening.rb +30 -0
- data/examples/data/java_args.txt +2 -0
- data/examples/distance_joint/distance_joint.rb +8 -5
- data/examples/lib/boundary.rb +22 -13
- data/examples/lib/box.rb +1 -2
- data/examples/lib/custom_listener.rb +29 -0
- data/examples/lib/custom_shape.rb +5 -3
- data/examples/lib/particle.rb +77 -0
- data/examples/lib/particle_system.rb +25 -65
- data/examples/lib/shape_system.rb +5 -3
- data/examples/lib/surface.rb +1 -1
- data/examples/liquid_fun_test.rb +11 -5
- data/examples/liquidy.rb +18 -14
- data/examples/mouse_joint/boundary.rb +1 -1
- data/examples/mouse_joint/box.rb +1 -1
- data/examples/mouse_joint/dummy_spring.rb +2 -3
- data/examples/mouse_joint/mouse_joint.rb +7 -8
- data/examples/polygons.rb +16 -16
- data/examples/quick_test.rb +33 -63
- data/examples/revolute_joint/revolute_joint.rb +5 -1
- data/examples/test_contact/README.md +6 -0
- data/examples/test_contact/lib/boundary.rb +1 -1
- data/examples/test_contact/lib/particle.rb +3 -3
- data/examples/test_contact/test_contact.rb +2 -1
- data/lib/box2d.jar +0 -0
- data/lib/jbox2d-library-2.3.1-SNAPSHOT.jar +0 -0
- data/lib/pbox2d/box2d.rb +1 -1
- data/lib/pbox2d/version.rb +2 -3
- data/pbox2d.gemspec +33 -0
- data/pom.xml +146 -0
- data/src/processing/box2d/Box2DProcessing.java +319 -0
- data/src/processing/box2d/Options.java +52 -0
- data/src/processing/box2d/Step.java +44 -0
- metadata +46 -34
- data/lib/jbox2d-library-2.2.1-ds.jar +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 892dc4c6bb63dfa90f257605378cf40da48bed18
|
4
|
+
data.tar.gz: 58a5e3b1de46dad55499d945ca32f8bfc5dbe623
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc18b5cb955557edc6e2989591201cd8d397afe6317bf787816eafcf444b31d9f3a53412e9e65a872b0c52af1d906abd181545d43d5cf1b4348f11939d74b70d
|
7
|
+
data.tar.gz: 75b35aabdbe6c41bed94efeab684b5c533e8461106c488464c4a6bb74899eb83a860d0886ed77b78a6fe95c8a6f4a23985e5d5e31b04b9526d9898c839aca4f3
|
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
### v0.5.0.pre
|
2
|
+
|
3
|
+
Break compatability with ruby-processing. New build uses maven. Works with JRuby-9.0.3.0, processing-3.0.1 and jdk8.
|
4
|
+
|
5
|
+
|
6
|
+
### v0.4.2
|
7
|
+
|
8
|
+
Re-factor extension class, last release for ruby-processing (processing-2.2.1) getting read for JRubyArt version.
|
9
|
+
|
10
|
+
### v0.4.1
|
11
|
+
|
12
|
+
Favour explicit import of classes to package include. Use forwardable in examples to make usable in both JRubyArt and ruby-processing, further to demonstrate alternative to including Processing::Proxy to get 'inner class' like access to processing methods, in own classes.
|
13
|
+
|
14
|
+
### v0.3.1
|
15
|
+
|
16
|
+
Need to be less specific about ruby-processing version
|
17
|
+
|
18
|
+
### v0.3.0 (was v0.2.1 but bumped version because it features new functionality)
|
19
|
+
|
20
|
+
Finally got ContactListener to work (currently best plan is to create your own CustomListener, see example test_contact)
|
21
|
+
|
22
|
+
### v0.2.0
|
23
|
+
|
24
|
+
Moving away from Shiffman Box2D design, to create a more ruby like interface added Step and Option classes to make it easier to initialize runtime and step options. On the ruby side options may/should be set with hash input. Gravity may still be set dynamically, but unless it is going to change it should be set via `init_options`. Unless `init_options` or `step_options` are set, defaults on java side are used.
|
25
|
+
|
26
|
+
### v0.1.1
|
27
|
+
|
28
|
+
Make common classes avaiable directly, expose sketch eight.
|
29
|
+
|
30
|
+
### v0.1.0
|
31
|
+
|
32
|
+
Now require 'pbox2d' matches gem name, refactor java methods by removing unnecessary get/set/pixel. Also prefer to world and to processing. Adjust examples, bump version to denote significant change.
|
33
|
+
|
34
|
+
|
35
|
+
### v0.0.1
|
36
|
+
|
37
|
+
First release, works but require name 'box2d' doesn't match gem name it is confusing
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
## Contributing
|
2
|
+
In the spirit of [free software][free-sw], **everyone** is encouraged to help improve this project.
|
3
|
+
|
4
|
+
Here are some ways *you* can contribute:
|
5
|
+
|
6
|
+
* by reporting bugs
|
7
|
+
* by suggesting/implementing new features
|
8
|
+
* by writing or editing documentation
|
9
|
+
* by contributing examples ( _show your creativity, or translate someone elses masterpiece_ )
|
10
|
+
* by closing [issues][]
|
11
|
+
* by supporting [Processing.org][], nothing to do with us but we rely on them
|
12
|
+
|
13
|
+
## Submitting an Issue
|
14
|
+
We use the [GitHub issue tracker][issues] to track bugs and features. Before
|
15
|
+
submitting a bug report or feature request, check to make sure it hasn't
|
16
|
+
already been submitted. When submitting a bug report, ideally include a [Gist][]
|
17
|
+
that includes a stack trace and any details that may be necessary to reproduce
|
18
|
+
the bug, including your gem version, Ruby version, and operating system.
|
19
|
+
|
20
|
+
|
21
|
+
## Submitting a Pull Request
|
22
|
+
1. [Fork the repository.][fork]
|
23
|
+
2. [Submit a pull request.][pr]
|
24
|
+
|
25
|
+
[free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
|
26
|
+
[issues]: https://github.com/ruby-processing/jbox2d/issues
|
27
|
+
[gist]: https://gist.github.com/
|
28
|
+
[fork]: http://help.github.com/fork-a-repo/
|
29
|
+
[pr]: http://help.github.com/send-pull-requests/
|
30
|
+
[processing.org]: http://processing.org/foundation/
|
data/Gemfile
ADDED
data/LICENCE
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
JBox2d binary licence
|
2
|
+
|
3
|
+
Copyright (c) 2014, Daniel Murphy
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without modification,
|
7
|
+
are permitted provided that the following conditions are met:
|
8
|
+
|
9
|
+
* Redistributions of source code must retain the above copyright notice, this
|
10
|
+
list of conditions and the following disclaimer.
|
11
|
+
|
12
|
+
* Redistributions in binary form must reproduce the above copyright notice, this
|
13
|
+
list of conditions and the following disclaimer in the documentation and/or
|
14
|
+
other materials provided with the distribution.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
17
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
20
|
+
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
23
|
+
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/LICENSE.md
CHANGED
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)
|
33
|
+
Copyright (c) 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.
|
64
|
-
[tar]:https://github.com/ruby-processing/jbox2d/archive/0.
|
63
|
+
[zip]:https://github.com/ruby-processing/jbox2d/archive/0.5.0-pre.zip
|
64
|
+
[tar]:https://github.com/ruby-processing/jbox2d/archive/0.5.0-pre.tar.gz
|
65
65
|
[Wiki]:https://github.com/ruby-processing/jbox2d/wiki
|
data/Rakefile
CHANGED
@@ -2,100 +2,38 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'rake/clean'
|
4
4
|
require 'rubygems/package_task'
|
5
|
-
require 'rdoc/task'
|
6
5
|
require 'rake/testtask'
|
7
|
-
require 'rspec/core/rake_task'
|
8
|
-
require_relative 'lib/pbox2d/version'
|
9
|
-
|
10
|
-
spec = Gem::Specification.new do |s|
|
11
|
-
s.name = 'pbox2d'
|
12
|
-
s.version = Pbox2D::VERSION
|
13
|
-
s.has_rdoc = true
|
14
|
-
s.extra_rdoc_files = ['README.md', 'LICENSE.md']
|
15
|
-
s.summary = 'jbox2d wrapped in a gem for ruby-processing'
|
16
|
-
s.description = <<-EOF
|
17
|
-
"An exemplar for how processing/java libraries can be made available
|
18
|
-
for use in ruby-processing. In this example avoiding an overdose of java
|
19
|
-
reflection by letting jruby sugar implement an interface"
|
20
|
-
EOF
|
21
|
-
s.license = 'MIT'
|
22
|
-
s.authors = ['Martin Prout']
|
23
|
-
s.email = 'martin_p@lineone.net'
|
24
|
-
s.homepage = 'https://github.com/ruby-processing/jbox2d'
|
25
|
-
s.files = %w(LICENSE.md README.md Rakefile) + FileList['lib/**/*.rb', 'examples/**/*.rb']
|
26
|
-
s.files << 'lib/box2d.jar'
|
27
|
-
s.files << 'lib/jbox2d-library-2.2.1-ds.jar'
|
28
|
-
s.require_path = 'lib'
|
29
|
-
s.add_dependency 'ruby-processing', '~> 2.6', '>= 2.6.4'
|
30
|
-
s.add_development_dependency "rake", "~> 10.3"
|
31
|
-
s.add_development_dependency "rake-compiler", "~> 0.9"
|
32
|
-
s.platform='java'
|
33
|
-
s.requirements << 'A decent graphics card'
|
34
|
-
s.requirements << 'java runtime >= 1.7+'
|
35
|
-
s.requirements << 'processing = 2.2.1+'
|
36
|
-
end
|
37
|
-
|
38
|
-
# -*- ruby -*-
|
39
|
-
|
40
|
-
require 'java'
|
41
|
-
require 'rake/javaextensiontask'
|
42
6
|
|
43
|
-
|
44
|
-
require 'psych'
|
7
|
+
require_relative 'lib/pbox2d/version'
|
45
8
|
|
46
|
-
def
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
rescue
|
53
|
-
raise "WARNING: you must set PROCESSING_ROOT in #{conf} compile"
|
9
|
+
def create_manifest
|
10
|
+
title = 'Implementation-Title: box2d (pbox2d java extension for JRubyArt)'
|
11
|
+
version = format('Implementation-Version: %s', Pbox2d::VERSION)
|
12
|
+
file = File.open('MANIFEST.MF', 'w') do |f|
|
13
|
+
f.puts(title)
|
14
|
+
f.puts(version)
|
54
15
|
end
|
55
|
-
body = proc {
|
56
|
-
Dir["#{source}/core.jar"].each do |f|
|
57
|
-
puts "Copying #{f} To #{dest}"
|
58
|
-
FileUtils.cp f, dest
|
59
|
-
end
|
60
|
-
}
|
61
|
-
Rake::Task.define_task(name, &body)
|
62
16
|
end
|
63
17
|
|
64
|
-
|
18
|
+
task default: [:init, :compile, :gem]
|
65
19
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
ext.name = 'box2d'
|
70
|
-
ext.debug = true
|
71
|
-
ext.lib_dir = 'lib'
|
72
|
-
ext.source_version='1.7'
|
73
|
-
ext.target_version='1.7'
|
20
|
+
desc 'Create Manifest'
|
21
|
+
task :init do
|
22
|
+
create_manifest
|
74
23
|
end
|
75
24
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
25
|
+
desc 'Compile'
|
26
|
+
task :compile do
|
27
|
+
sh "mvn package"
|
28
|
+
sh "mvn dependency:copy"
|
29
|
+
sh "mv target/box2d.jar lib"
|
80
30
|
end
|
81
31
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
rdoc.rdoc_files.add(files)
|
86
|
-
rdoc.main = "README.md" # page to start on
|
87
|
-
rdoc.title = "Box2D Docs"
|
88
|
-
rdoc.rdoc_dir = 'doc/rdoc' # rdoc output folder
|
89
|
-
rdoc.options << '--line-numbers'
|
32
|
+
desc 'Build Gem'
|
33
|
+
task :gem do
|
34
|
+
sh "gem build pbox2d.gemspec"
|
90
35
|
end
|
91
36
|
|
92
37
|
Rake::TestTask.new do |t|
|
93
38
|
t.test_files = FileList['test/**/*.rb']
|
94
39
|
end
|
95
|
-
|
96
|
-
RSpec::Core::RakeTask.new do |spec|
|
97
|
-
spec.pattern = 'spec/*_spec.rb'
|
98
|
-
spec.rspec_opts = [Dir["lib"].to_a.join(':')]
|
99
|
-
end
|
100
|
-
|
101
|
-
|
data/examples/README.md
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
### Source of Sketches
|
2
|
+
|
3
|
+
These sketches have been translated from 'vanilla processing sketches' by Dan Shiffman. The original sketches were designed to run with the Box2D-for-processing library which has a subtlely different interface from the pbox2d gem. There is probably scope for further refactoring of most of the sketches to make them more ruby-like (the mouse_joint example has perhaps travelled furthest from the original version).
|
4
|
+
|
5
|
+
### java_args.txt
|
6
|
+
|
7
|
+
The `data` folder contains java_args.txt, which currently silently enables the OpenGl-based pipeline using `-Dsun.java2d.opengl=true` add any other java args here, use `True` instead of `true` to get a message.
|
@@ -5,11 +5,10 @@
|
|
5
5
|
require 'pbox2d'
|
6
6
|
require_relative 'lib/surface'
|
7
7
|
|
8
|
-
attr_reader :
|
8
|
+
attr_reader :srface, :box2d, :particles
|
9
9
|
|
10
10
|
def setup
|
11
|
-
|
12
|
-
smooth 4
|
11
|
+
sketch_title 'Bumpy Surface Noise'
|
13
12
|
# Initialize box2d physics and create the world
|
14
13
|
@box2d = Box2D.new(self)
|
15
14
|
box2d.init_options(gravity: [0, -20])
|
@@ -18,16 +17,16 @@ def setup
|
|
18
17
|
# box2d.gravity([0, -20])
|
19
18
|
# Create the empty list
|
20
19
|
@particles = []
|
21
|
-
# Create the
|
22
|
-
@
|
20
|
+
# Create the srface
|
21
|
+
@srface = Surface.new(self)
|
23
22
|
end
|
24
23
|
|
25
24
|
def draw
|
26
25
|
# If the mouse is pressed, we make new particles
|
27
26
|
# We must always step through time!
|
28
27
|
background(138, 66, 54)
|
29
|
-
# Draw the
|
30
|
-
|
28
|
+
# Draw the srface
|
29
|
+
srface.display
|
31
30
|
# NB ? reqd to call mouse_pressed value, else method gets called.
|
32
31
|
particles << Particle.new(self, mouse_x, mouse_y, rand(2.0..6)) if mouse_pressed?
|
33
32
|
# Draw all particles
|
@@ -39,3 +38,8 @@ def draw
|
|
39
38
|
fill(0)
|
40
39
|
text(format('framerate: %d', frame_rate), 12, 16)
|
41
40
|
end
|
41
|
+
|
42
|
+
def settings
|
43
|
+
size(500, 300)
|
44
|
+
smooth 4
|
45
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'pbox2d'
|
2
|
+
require 'forwardable'
|
3
|
+
require_relative 'lib/custom_listener'
|
4
|
+
require_relative 'lib/particle'
|
5
|
+
require_relative 'lib/boundary'
|
6
|
+
|
7
|
+
attr_reader :box2d, :particles, :wall
|
8
|
+
|
9
|
+
Vect = Struct.new(:x, :y)
|
10
|
+
|
11
|
+
def settings
|
12
|
+
size 400, 400
|
13
|
+
end
|
14
|
+
|
15
|
+
def setup
|
16
|
+
sketch_title 'Collision Listening'
|
17
|
+
@box2d = Box2D.new(self)
|
18
|
+
box2d.create_world
|
19
|
+
box2d.add_listener(CustomListener.new)
|
20
|
+
@particles = []
|
21
|
+
@wall = Boundary.new(box2d, Vect.new(width / 2, height - 5), Vect.new(width, 10))
|
22
|
+
end
|
23
|
+
|
24
|
+
def draw
|
25
|
+
background(255)
|
26
|
+
particles << Particle.new(self, rand(width), 20, rand(4..8)) if rand < 0.1
|
27
|
+
particles.each(&:display)
|
28
|
+
particles.reject!(&:done)
|
29
|
+
wall.display
|
30
|
+
end
|
@@ -14,16 +14,19 @@ require_relative 'particle_system'
|
|
14
14
|
|
15
15
|
attr_reader :box2d, :boundaries, :system
|
16
16
|
|
17
|
-
def
|
17
|
+
def settings
|
18
18
|
size(640, 360)
|
19
|
+
end
|
20
|
+
|
21
|
+
def setup
|
19
22
|
# Initialize box2d physics and create the world
|
20
23
|
@box2d = Box2D.new(self)
|
21
24
|
box2d.create_world
|
22
25
|
@system = ParticleSystem.new
|
23
|
-
@boundaries = [
|
24
|
-
|
25
|
-
|
26
|
-
|
26
|
+
@boundaries = []
|
27
|
+
# Add a bunch of fixed boundaries
|
28
|
+
boundaries << Boundary.new(width / 4, height - 5, width / 2 - 50, 10)
|
29
|
+
boundaries << Boundary.new(3 * width / 4, height - 50, width / 2 - 50, 10)
|
27
30
|
end
|
28
31
|
|
29
32
|
def draw
|
data/examples/lib/boundary.rb
CHANGED
@@ -1,28 +1,37 @@
|
|
1
|
-
# The boundary class is used to create fixtures
|
2
1
|
class Boundary
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
def initialize(
|
7
|
-
@
|
2
|
+
include Processing::Proxy
|
3
|
+
attr_reader :box2d, :b, :pos, :size, :a
|
4
|
+
|
5
|
+
def initialize(b2d, pos, sz, a = 0)
|
6
|
+
@box2d, @pos, @size, @a = b2d, pos, sz, a
|
7
|
+
# Define the polygon
|
8
8
|
sd = PolygonShape.new
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
# Figure out the box2d coordinates
|
10
|
+
box2d_w = box2d.scale_to_world(size.x / 2)
|
11
|
+
box2d_h = box2d.scale_to_world(size.y / 2)
|
12
|
+
# We're just a box
|
13
|
+
sd.set_as_box(box2d_w, box2d_h)
|
12
14
|
# Create the body
|
13
15
|
bd = BodyDef.new
|
14
16
|
bd.type = BodyType::STATIC
|
15
|
-
bd.
|
17
|
+
bd.angle = a
|
18
|
+
bd.position.set(box2d.processing_to_world(pos.x, pos.y))
|
16
19
|
@b = box2d.create_body(bd)
|
17
20
|
# Attached the shape to the body using a Fixture
|
18
21
|
b.create_fixture(sd, 1)
|
19
22
|
end
|
20
23
|
|
21
|
-
# Draw the boundary,
|
24
|
+
# Draw the boundary, it doesn't move so we don't have to ask the Body for location
|
22
25
|
def display
|
23
26
|
fill(0)
|
24
27
|
stroke(0)
|
25
|
-
|
26
|
-
|
28
|
+
stroke_weight(1)
|
29
|
+
rect_mode(CENTER)
|
30
|
+
a = b.get_angle
|
31
|
+
push_matrix
|
32
|
+
translate(pos.x, pos.y)
|
33
|
+
rotate(-a)
|
34
|
+
rect(0, 0, size.x,size.y)
|
35
|
+
pop_matrix
|
27
36
|
end
|
28
37
|
end
|
data/examples/lib/box.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# A Box class, note how to access class ParticleGroupDef in jruby
|
2
|
-
# which is imported into
|
3
|
-
# mainly because of probable name conflict with ParticleSystem
|
2
|
+
# which is imported into PB module (not in global namespace)
|
4
3
|
class Box
|
5
4
|
attr_accessor :pg
|
6
5
|
def initialize(b2d, x, y)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# A custom listener allows us to get the physics engine to
|
2
|
+
# to call our code, on say contact (collisions)
|
3
|
+
class CustomListener
|
4
|
+
include ContactListener
|
5
|
+
|
6
|
+
def begin_contact(cp)
|
7
|
+
# Get both fixtures
|
8
|
+
f1 = cp.getFixtureA
|
9
|
+
f2 = cp.getFixtureB
|
10
|
+
# Get both bodies
|
11
|
+
b1 = f1.getBody
|
12
|
+
b2 = f2.getBody
|
13
|
+
# Get our objects that reference these bodies
|
14
|
+
o1 = b1.getUserData
|
15
|
+
o2 = b2.getUserData
|
16
|
+
return unless [o1, o2].all? { |obj| obj.respond_to?(:change) }
|
17
|
+
o1.change
|
18
|
+
o2.change
|
19
|
+
end
|
20
|
+
|
21
|
+
def end_contact(_cp)
|
22
|
+
end
|
23
|
+
|
24
|
+
def pre_solve(_cp, _m)
|
25
|
+
end
|
26
|
+
|
27
|
+
def post_solve(_cp, _ci)
|
28
|
+
end
|
29
|
+
end
|
@@ -4,9 +4,9 @@ class CustomShape
|
|
4
4
|
attr_reader :body, :box2d
|
5
5
|
|
6
6
|
# Constructor
|
7
|
-
def initialize(
|
7
|
+
def initialize(b2d, x, y)
|
8
8
|
# Add the box to the box2d world
|
9
|
-
@box2d =
|
9
|
+
@box2d = b2d
|
10
10
|
make_body(Vec2.new(x, y))
|
11
11
|
end
|
12
12
|
|
@@ -69,4 +69,6 @@ class CustomShape
|
|
69
69
|
body.set_linear_velocity(Vec2.new(rand(-5.0..5), rand(2.0..5)))
|
70
70
|
body.set_angular_velocity(rand(-5.0..5))
|
71
71
|
end
|
72
|
-
end
|
72
|
+
end
|
73
|
+
|
74
|
+
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# Note the particle class change method is use to change color to red
|
2
|
+
# when two particles collide (no change just hitting boundary)
|
3
|
+
class Particle
|
4
|
+
extend Forwardable
|
5
|
+
def_delegators(:@app, :box2d, :begin_shape, :color, :end_shape, :line, :pop_matrix,
|
6
|
+
:ellipse, :translate, :rotate, :stroke, :push_matrix, :fill,
|
7
|
+
:no_fill, :stroke_weight)
|
8
|
+
attr_accessor :body
|
9
|
+
attr_reader :radius, :col
|
10
|
+
|
11
|
+
def initialize(app, x, y, r)
|
12
|
+
@app, @x, @y, @radius = app, x, y, r
|
13
|
+
# This function puts the particle in the Box2d world
|
14
|
+
make_body(x, y, radius)
|
15
|
+
@col = color('#c0c0c0') # silvergrey
|
16
|
+
body.setUserData(self)
|
17
|
+
end
|
18
|
+
|
19
|
+
# This function removes the particle from the box2d world
|
20
|
+
def kill_body
|
21
|
+
box2d.destroy_body(body)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Change color when hit
|
25
|
+
def change
|
26
|
+
@col = color('#cc0000') # red
|
27
|
+
end
|
28
|
+
|
29
|
+
# Is the particle ready for deletion?
|
30
|
+
def done
|
31
|
+
# Let's find the screen position of the particle
|
32
|
+
pos = box2d.body_coord(body)
|
33
|
+
# Is it off the bottom of the screen?
|
34
|
+
return false unless pos.y > (box2d.height + radius * 2)
|
35
|
+
kill_body
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def display
|
40
|
+
# We look at each body and get its screen position
|
41
|
+
pos = box2d.body_coord(body)
|
42
|
+
# Get its angle of rotation
|
43
|
+
a = body.get_angle
|
44
|
+
push_matrix
|
45
|
+
translate(pos.x, pos.y)
|
46
|
+
rotate(a)
|
47
|
+
fill(col)
|
48
|
+
stroke(0)
|
49
|
+
stroke_weight(1)
|
50
|
+
ellipse(0, 0, radius * 2, radius * 2)
|
51
|
+
# Let's add a line so we can see the rotation
|
52
|
+
line(0, 0, radius, 0)
|
53
|
+
pop_matrix
|
54
|
+
end
|
55
|
+
|
56
|
+
# Here's our function that adds the particle to the Box2D world
|
57
|
+
def make_body(x, y, r)
|
58
|
+
# Define a body
|
59
|
+
bd = BodyDef.new
|
60
|
+
# Set its position
|
61
|
+
bd.position = box2d.processing_to_world(x, y)
|
62
|
+
bd.type = BodyType::DYNAMIC
|
63
|
+
@body = box2d.create_body(bd)
|
64
|
+
# Make the body's shape a circle
|
65
|
+
cs = CircleShape.new
|
66
|
+
cs.m_radius = box2d.scale_to_world(r)
|
67
|
+
fd = FixtureDef.new
|
68
|
+
fd.shape = cs
|
69
|
+
# Parameters that affect physics
|
70
|
+
fd.density = 1
|
71
|
+
fd.friction = 0.01
|
72
|
+
fd.restitution = 0.3
|
73
|
+
# Attach fixture to body
|
74
|
+
body.create_fixture(fd)
|
75
|
+
body.set_angular_velocity(rand(-10.0..10))
|
76
|
+
end
|
77
|
+
end
|