chippunk 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,3 @@
1
+ # CHIPPUNK
2
+
3
+ Is coming soon...
@@ -0,0 +1,25 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |spec|
4
+ spec.name = "chippunk"
5
+ spec.summary = "Wrapper For Chipmunk Physics"
6
+ spec.description = "No long description available but is probably coming soon"
7
+ spec.email = "mhennig@hgb-leipzig.de"
8
+ spec.homepage = "http://github.com/mhennig/chippunk"
9
+ spec.authors = ["Matthias Hennig"]
10
+ spec.post_install_message = %q{
11
+ ========================================================================
12
+ Thanks for installing Chippunk!
13
+ ------------------------------------------------------------------------
14
+ }
15
+ spec.require_path = 'lib'
16
+ spec.files = %w(README Rakefile init.rb) + Dir.glob("{lib}/**/*")
17
+
18
+ # Runtime dependencies: When installing Formtastic these will be checked if they are installed.
19
+ # Will be offered to install these if they are not already installed.
20
+ spec.add_dependency 'gosu', '>= 0.7.0'
21
+ spec.add_dependency 'chipmunk', '>= 5.2.0'
22
+ end
23
+ rescue LoadError
24
+ puts "Jeweler not available. Install it with: gem install jeweler"
25
+ end
@@ -0,0 +1,94 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require "../lib/chippunk"
5
+
6
+ module Dimensions
7
+ Mothership = [
8
+ [-30.0, 60.0],
9
+ [30, 60.0],
10
+ [30, -60],
11
+ [-30, -60]
12
+ ]
13
+ end
14
+
15
+ class Game < Gosu::Window
16
+
17
+ include Chippunk::Builder
18
+
19
+ def initialize
20
+ super(1024, 768, false)
21
+ self.caption = "WORLD!!"
22
+
23
+ @world = Chippunk::World.new do |config|
24
+ config.gravity = CP::Vec2.new(0.0, 1800.0)
25
+ config.damping = 0.3
26
+ config.iterations = 20
27
+ config.substeps = 20
28
+ config.dt = (1.0/60) / 20
29
+ end
30
+
31
+ ground = build_segment_object(1024, CP::INFINITY, CP::INFINITY) do |config|
32
+ config.position = [1024/2, 760]
33
+ config.friction = 0.9
34
+ config.static!
35
+ end
36
+
37
+ @ship = build_polygon_object(Dimensions::Mothership, 10, 900) do |ship|
38
+ ship.position = [600 + rand(300), 10 + rand(30)]
39
+ ship.elasticity = 0.5
40
+ ship.friction = 0.3
41
+ end
42
+
43
+ balls = Array.new(50) do |n|
44
+ build_circle_object(rand(30)+10, rand(3)+1, 0.4) do |ball|
45
+ ball.position = [200+rand(400), 10 + rand(10)]
46
+ ball.elasticity = 0.9
47
+ ball.friction = 0.1
48
+ end
49
+ end
50
+
51
+ @world.add_objects(@ship)
52
+ @world.add_objects(*balls)
53
+ @world.add_objects(ground)
54
+ end
55
+
56
+ def update
57
+ @world.update do
58
+ @ship.body.reset_forces
59
+ @ship.body.apply_force(vec2(0, -18000), vec2(0,0))
60
+ if self.button_down?(Gosu::KbUp)
61
+ @ship.body.apply_force(vec2(0, -10000), vec2(0,0))
62
+ puts "btn down"
63
+ end
64
+ if self.button_down?(Gosu::KbDown)
65
+ @ship.body.apply_force(vec2(0, 9000), vec2(0,0))
66
+ end
67
+ if self.button_down?(Gosu::KbLeft)
68
+ @ship.body.apply_force(vec2(-9000,0), vec2(0,0))
69
+ end
70
+ if self.button_down?(Gosu::KbRight)
71
+ @ship.body.apply_force(vec2(9000,0), vec2(0,0))
72
+ end
73
+
74
+ puts @ship.body.vel
75
+ end
76
+ end
77
+
78
+ def button_down(id)
79
+ case id
80
+ when Gosu::KbEscape
81
+ close
82
+ when Gosu::KbUp
83
+ #@ship.body.apply_force(vec2(0, -10), vec2(0,0))
84
+ end
85
+ end
86
+
87
+ def draw
88
+ self.draw_quad(0, 0, Gosu::Color.new(0xff002040), 1024, 0, Gosu::Color.new(0xff002040), 0, 768, Gosu::Color.new(0xff002040), 1024, 768, Gosu::Color.new(0xff002040), 0)
89
+ @world.draw(self)
90
+ end
91
+ end
92
+
93
+ window = Game.new.show
94
+
@@ -0,0 +1,89 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require "rubygems"
5
+ require "gosu"
6
+ #require 'chipmunk-ffi'
7
+ require 'chipmunk'
8
+
9
+ require 'chippunk/helper.rb'
10
+ require 'chippunk/world.rb'
11
+ require 'chippunk/object.rb'
12
+ require 'chippunk/builder.rb'
13
+
14
+ unless [].respond_to?(:enum_cons)
15
+ module Enumerable
16
+ alias :enum_cons :each_cons
17
+ end
18
+ end
19
+
20
+ class Numeric
21
+ def radians_to_vec2
22
+ CP::Vec2.new(Math::cos(self), Math::sin(self))
23
+ end
24
+ end
25
+
26
+ module CP
27
+ module Shape
28
+
29
+ class Segment
30
+ attr_reader :a, :b, :radius
31
+ alias_method :orig_init, :initialize
32
+
33
+ def initialize(body, a, b, radius)
34
+ @a, @b, @radius = a, b, radius
35
+ orig_init(body, a, b, radius)
36
+ end
37
+
38
+ def draw(canvas)
39
+ v1 = body.p + self.a.rotate(body.rot)
40
+ v2 = body.p + self.b.rotate(body.rot)
41
+ canvas.draw_line(v1.x, v1.y, Gosu::Color.new(0xffff0000), v2.x, v2.y, Gosu::Color.new(0xffff0000))
42
+ end
43
+ end
44
+
45
+ class Circle
46
+ attr_reader :radius, :center
47
+ alias_method :orig_init, :initialize
48
+
49
+ def initialize(body, radius, center)
50
+ @radius, @center = radius, center
51
+ orig_init(body,radius,center)
52
+ end
53
+
54
+ def draw(canvas)
55
+ c = body.p + self.center.rotate(body.rot)
56
+ a = body.a
57
+ segs = 20
58
+ coef = 2.0*Math::PI/(segs.to_f)
59
+
60
+ points = Array.new(segs) do |n|
61
+ rads = n*coef
62
+ [radius*Math.cos(rads+a) + c.x, radius*Math.sin(rads + a) + c.y]
63
+ end
64
+
65
+ points.enum_cons(2) do |v1,v2|
66
+ canvas.draw_line(v1[0], v1[1], Gosu::Color.new(0xffff0000), v2[0], v2[1], Gosu::Color.new(0xffff0000))
67
+ end
68
+ end
69
+ end
70
+
71
+ class Poly
72
+ attr_reader :verts, :offset
73
+ alias_method :orig_init, :initialize
74
+
75
+ def initialize(body, verts, offset)
76
+ @verts, @offset = verts, offset
77
+ orig_init(body, verts, offset)
78
+ end
79
+
80
+ def draw(canvas)
81
+ ary = verts.map {|v| body.p + self.offset + v.rotate(body.rot)}
82
+ segs = ary.enum_cons(2).to_a << [ary[-1],ary[0]]
83
+ segs.each do |v1,v2|
84
+ canvas.draw_line(v1.x,v1.y,Gosu::Color.new(0xffff0000),v2.x,v2.y,Gosu::Color.new(0xffff0000))
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,41 @@
1
+ require 'chippunk/object.rb'
2
+ require 'chippunk/helper.rb'
3
+
4
+ module Chippunk
5
+ module Builder
6
+
7
+ include Chippunk::Helper
8
+
9
+ def build_segment_object(width, mass=0, inertia=0, radius=0.0)
10
+ obj = Chippunk::Object.new
11
+ a = vec2(width/2,0)
12
+ b = vec2(width/2*-1,0)
13
+ obj.shape = CP::Shape::Segment.new(obj.body(mass, inertia), a, b, radius)
14
+ yield(obj) if block_given?
15
+ obj
16
+ end
17
+
18
+ def build_circle_object(size, mass=0, moment=0, offset=[0,0], &block)
19
+ obj = Chippunk::Object.new
20
+ moment = CP.moment_for_circle(mass, size/2, 0.0, vec2(0,0))
21
+ obj.shape = CP::Shape::Circle.new(obj.body(mass, 100000), size/2, vec2(0,0))
22
+ yield(obj) if block_given?
23
+ obj
24
+ end
25
+
26
+ def build_polygon_object(list_of_coords, mass=0, inertia=0)
27
+ obj = Chippunk::Object.new
28
+ verts = coords_to_verts(list_of_coords)
29
+ moment = CP.moment_for_poly(mass, verts, vec2(0,0))
30
+ obj.shape = CP::Shape::Poly.new(obj.body(mass, CP::INFINITY), verts, vec2(0,0))
31
+ obj.angle = (3*Math::PI/2.0)
32
+ yield(obj) if block_given?
33
+ obj
34
+ end
35
+
36
+ def build_rectangle_object(width, height, mass=0, inertia=0)
37
+
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,25 @@
1
+
2
+ require "pp"
3
+
4
+ module Chippunk
5
+ module Helper
6
+
7
+ include Enumerable
8
+
9
+ def coords_to_verts(list_of_coords)
10
+ verts = []
11
+
12
+ #puts list_of_coords
13
+
14
+ #puts " + + + + + + + +"
15
+
16
+ list_of_coords.flatten.each_slice(2) do |coords|
17
+ x,y = coords.values_at(0,1)
18
+ verts.push(vec2(x,y))
19
+ end
20
+ #puts verts
21
+ #exit
22
+ verts
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,80 @@
1
+ module Chippunk
2
+ class Object
3
+ include Chippunk::Helper
4
+
5
+ attr :body
6
+ attr_reader :shape, :view
7
+ attr_accessor :world
8
+
9
+ def initialize(*args)
10
+ super
11
+ @is_static = false
12
+ end
13
+
14
+ def shape=(shape)
15
+ @shape ||= shape
16
+ end
17
+
18
+ def body(mass=0, inertia=0)
19
+ @body ||= CP::Body.new(mass, inertia)
20
+ end
21
+
22
+ def position=(coords)
23
+ x, y = coords.values_at(0, 1)
24
+ puts x, y
25
+
26
+ body.pos = CP::Vec2.new(x.to_f,y.to_f)
27
+ end
28
+
29
+ def mass=(m)
30
+ body.mass = m
31
+ end
32
+
33
+ def angle=(a)
34
+ body.angle = a
35
+ end
36
+
37
+ def inertia=(i)
38
+ body.i = 0
39
+ end
40
+
41
+ def velocity=(v)
42
+ x_direction, y_direction = v.values_at(0,1)
43
+ body.vel = vec2(x_direction, y_direction)
44
+ end
45
+
46
+ def elasticity=(e)
47
+ shape.e = e
48
+ end
49
+
50
+ def friction=(u)
51
+ shape.u = u
52
+ end
53
+
54
+ def collision_type=(type)
55
+ shape.collision_type = type.to_sym
56
+ end
57
+
58
+ def static!
59
+ @is_static = true
60
+ end
61
+
62
+ def static?
63
+ @is_static
64
+ end
65
+
66
+ def draw(canvas)
67
+ unless view.respond_to?(:draw)
68
+ @shape.draw(canvas)
69
+ end
70
+
71
+ end
72
+ end
73
+
74
+ class StaticObject < Chippunk::Object
75
+ def initialize(*args)
76
+ super
77
+ @is_static = true
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,41 @@
1
+ module Chippunk
2
+ class World
3
+ attr_reader :space, :objects
4
+ attr_accessor :dt, :substeps
5
+
6
+ def initialize(&block)
7
+ @space = CP::Space.new
8
+ @objects = []
9
+ yield(self) if block_given?
10
+ end
11
+
12
+ def method_missing(method, *args, &block)
13
+ @space.send(method, *args, &block)
14
+ end
15
+
16
+ def add_object(obj)
17
+ obj.world = self
18
+ obj.shape.obj = obj
19
+ @space.add_shape(obj.shape)
20
+ @space.add_body(obj.shape.body) unless obj.static?
21
+ @objects << obj
22
+ end
23
+
24
+ def add_objects(*objects)
25
+ objects.each{ |obj| self.add_object(obj) }
26
+ end
27
+
28
+ def update(&block)
29
+ @substeps.times do
30
+ @objects.each{ |o| o.body.reset_forces }
31
+ yield(self) if block_given?
32
+ @space.step(@dt)
33
+ end
34
+ end
35
+
36
+ def draw(canvas)
37
+ @objects.each{ |obj| obj.draw(canvas) }
38
+ end
39
+ end
40
+ end
41
+
File without changes
File without changes
File without changes
File without changes
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chippunk
3
+ version: !ruby/object:Gem::Version
4
+ hash: 31
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 0
10
+ version: 0.0.0
11
+ platform: ruby
12
+ authors:
13
+ - Matthias Hennig
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-09-16 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: gosu
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ - 7
33
+ - 0
34
+ version: 0.7.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: chipmunk
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 63
46
+ segments:
47
+ - 5
48
+ - 2
49
+ - 0
50
+ version: 5.2.0
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ description: No long description available but is probably coming soon
54
+ email: mhennig@hgb-leipzig.de
55
+ executables: []
56
+
57
+ extensions: []
58
+
59
+ extra_rdoc_files:
60
+ - README
61
+ files:
62
+ - README
63
+ - Rakefile
64
+ - lib/chippunk.rb
65
+ - lib/chippunk/builder.rb
66
+ - lib/chippunk/helper.rb
67
+ - lib/chippunk/object.rb
68
+ - lib/chippunk/world.rb
69
+ - lib/cp/shape.rb
70
+ - lib/cp/shape/circle.rb
71
+ - lib/cp/shape/poly.rb
72
+ - lib/cp/shape/segment.rb
73
+ - examples/world.rb
74
+ has_rdoc: true
75
+ homepage: http://github.com/mhennig/chippunk
76
+ licenses: []
77
+
78
+ post_install_message: "\n ========================================================================\n Thanks for installing Chippunk!\n ------------------------------------------------------------------------\n "
79
+ rdoc_options:
80
+ - --charset=UTF-8
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ hash: 3
89
+ segments:
90
+ - 0
91
+ version: "0"
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ hash: 3
98
+ segments:
99
+ - 0
100
+ version: "0"
101
+ requirements: []
102
+
103
+ rubyforge_project:
104
+ rubygems_version: 1.3.7
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: Wrapper For Chipmunk Physics
108
+ test_files:
109
+ - examples/world.rb