Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian <brian@laptop.org>2008-07-10 19:49:14 (GMT)
committer Brian <brian@laptop.org>2008-07-10 19:49:14 (GMT)
commit91e065f49dae9d7afe5e3a53c191b1b6926b8b16 (patch)
tree17aaeee2d3fc17bd9fc4599cd934a5118a5de080
parent25452a24cfb3bea22d2b90ccc2eb0adf5e61329f (diff)
parent1772023f122fe0ceab52edd0124272247a144c5b (diff)
Merge branch 'master' of git+ssh://bjordan@dev.laptop.org/git/activities/physics
-rw-r--r--elements/add_objects.py92
-rw-r--r--tools.py18
2 files changed, 85 insertions, 25 deletions
diff --git a/elements/add_objects.py b/elements/add_objects.py
index 72dc21e..c89c273 100644
--- a/elements/add_objects.py
+++ b/elements/add_objects.py
@@ -445,8 +445,77 @@ class Add:
# Define the body
x, y = c = tools_poly.calc_center(vertices_orig_reduced)
return self.poly((x,y), vertices, dynamic, density, restitution, friction)
-
- def joint(self, *args):
+
+ # Alex Levenson's added joint methods:
+ def distanceJoint(self,b1,b2,p1,p2):
+ # Distance Joint
+ p1 = self.parent.to_world(p1)
+ p2 = self.parent.to_world(p2)
+ p1x, p1y = p1
+ p2x, p2y = p2
+ p1x /= self.parent.ppm
+ p1y /= self.parent.ppm
+ p2x /= self.parent.ppm
+ p2y /= self.parent.ppm
+ p1 = box2d.b2Vec2(p1x, p1y)
+ p2 = box2d.b2Vec2(p2x, p2y)
+ jointDef = box2d.b2DistanceJointDef()
+ jointDef.Initialize(b1, b2, p1, p2)
+ jointDef.collideConnected = True
+ self.parent.world.CreateJoint(jointDef)
+
+ def fixedJoint(self, *args):
+ if len(args) == 2:
+ # Fixed Joint to the Background, don't assume the center of the body
+ b1 = self.parent.world.GetGroundBody()
+ b2 = args[0]
+ p1 = self.parent.to_world(args[1])
+ p1x, p1y = p1
+ p1x /= self.parent.ppm
+ p1y /= self.parent.ppm
+ p1 = box2d.b2Vec2(p1x, p1y)
+
+ jointDef = box2d.b2RevoluteJointDef()
+ jointDef.Initialize(b1, b2, p1)
+
+ self.parent.world.CreateJoint(jointDef)
+ elif len(args) == 1:
+ # Fixed Joint to the Background, assume the center of the body
+ b1 = self.parent.world.GetGroundBody()
+ b2 = args[0]
+ p1 = b2.GetWorldCenter()
+
+ jointDef = box2d.b2RevoluteJointDef()
+ jointDef.Initialize(b1, b2, p1)
+
+ self.parent.world.CreateJoint(jointDef)
+
+ def revoluteJoint(self,b1,b2,p1):
+ # revolute joint between to bodies
+ p1 = self.parent.to_world(p1)
+ p1x, p1y = p1
+ p1x /= self.parent.ppm
+ p1y /= self.parent.ppm
+ p1 = box2d.b2Vec2(p1x, p1y)
+
+ jointDef = box2d.b2RevoluteJointDef()
+ jointDef.Initialize(b1, b2, p1)
+
+ self.parent.world.CreateJoint(jointDef)
+
+ def prismaticJoint(self,b1,b2,Axis=(0.0,1.0),lower=-2,upper=2):
+ jointDef = box2d.b2PrismaticJointDef()
+ worldAxis = box2d.b2Vec2(Axis[0],Axis[1])
+ jointDef.Initialize(b1, b2, b1.GetWorldCenter(), worldAxis)
+ jointDef.lowerTranslation = lower
+ jointDef.upperTranslation = upper
+ jointDef.enableLimit = True
+
+ self.parent.world.CreateJoint(jointDef)
+
+ def
+
+ def joint(self, *args):
print "* Add Joint:", args
if len(args) == 4:
@@ -476,24 +545,9 @@ class Add:
elif len(args) == 3:
# Revolute Joint
pass
-
- elif len(args) == 2:
-
- # Revolute Joint to the Background, don't assume the center of the body
- b1 = self.parent.world.GetGroundBody()
- b2 = args[0]
- p1 = self.parent.to_world(args[1])
- p1x, p1y = p1
- p1x /= self.parent.ppm
- p1y /= self.parent.ppm
- p1 = box2d.b2Vec2(p1x, p1y)
-
- jointDef = box2d.b2RevoluteJointDef()
- jointDef.Initialize(b1, b2, p1)
-
- self.parent.world.CreateJoint(jointDef)
+
elif len(args) == 1:
- # Revolute Joint to the Background, assume the center of the body
+ # Fixed Joint to the Background, assume the center of the body
b1 = self.parent.world.GetGroundBody()
b2 = args[0]
p1 = b2.GetWorldCenter()
diff --git a/tools.py b/tools.py
index be0b3b7..125d033 100644
--- a/tools.py
+++ b/tools.py
@@ -259,25 +259,31 @@ class JointTool(Tool):
# grab the first body
self.jb1pos = event.pos
self.jb1 = self.game.world.get_bodies_at_pos(event.pos)
- self.jb2 = self.jb2pos = None
+ self.jb2 = self.jb2pos = None
+ if event.button == 2:
+ bodies = self.game.world.get_bodies_at_pos(event.pos)
+ if len(bodies) >=2:
+ self.game.world.add.revoluteJoint(bodies[0],bodies[1],event.pos)
elif event.type == MOUSEBUTTONUP:
if event.button == 1:
# grab the second body
self.jb2pos = event.pos
self.jb2 = self.game.world.get_bodies_at_pos(event.pos)
- # if we have two distinct bodies, add a joint!
+ # if we have two distinct bodies, add a distance joint!
if self.jb1 and self.jb2 and str(self.jb1) != str(self.jb2):
- self.game.world.add.joint(self.jb1[0],self.jb2[0],self.jb1pos,self.jb2pos)
+ self.game.world.add.distanceJoint(self.jb1[0],self.jb2[0],self.jb1pos,self.jb2pos)
# If there's only one body, add a fixed joint
elif self.jb2:
- self.game.world.add.joint(self.jb2[0],self.jb2pos)
+ self.game.world.add.fixedJoint(self.jb2[0],self.jb2pos)
# regardless, clean everything up
self.jb1 = self.jb2 = self.jb1pos = self.jb2pos = None
if event.button == 3:
- # add a centered fisxed joint
+ # add a centered fixed joint
self.jb2 = self.game.world.get_bodies_at_pos(event.pos)
if self.jb2:
- self.game.world.add.joint(self.jb2[0])
+ self.game.world.add.fixedJoint(self.jb2[0])
+ # regardless, clean everything up
+ self.jb1 = self.jb2 = self.jb1pos = self.jb2pos = None
def draw(self):
if self.jb1:
pygame.draw.line(self.game.screen,(100,180,255),self.jb1pos,pygame.mouse.get_pos(),3)