Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--helpers.py103
-rw-r--r--physics.py18
-rw-r--r--tools.py182
3 files changed, 151 insertions, 152 deletions
diff --git a/helpers.py b/helpers.py
index 3348f15..889534b 100644
--- a/helpers.py
+++ b/helpers.py
@@ -24,37 +24,37 @@
import math
# distance calculator, pt1 and pt2 are ordred pairs
def distance(pt1, pt2):
- return math.sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] -pt2[1]) ** 2)
+ return math.sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2)
# returns the angle between the line segment from pt1 --> pt2 and the x axis, from -pi to pi
def getAngle(pt1,pt2):
xcomp = pt2[0] - pt1[0]
ycomp = pt1[1] - pt2[1]
- return math.atan2(ycomp,xcomp)
+ return math.atan2(ycomp, xcomp)
# returns a list of ordered pairs that describe an equilteral triangle around the segment from pt1 --> pt2
def constructTriangleFromLine(p1,p2):
- halfHeightVector = (0.57735*(p2[1] - p1[1]), 0.57735*(p2[0] - p1[0]))
+ halfHeightVector = (0.57735 * (p2[1] - p1[1]), 0.57735 * (p2[0] - p1[0]))
p3 = (p1[0] + halfHeightVector[0], p1[1] - halfHeightVector[1])
p4 = (p1[0] - halfHeightVector[0], p1[1] + halfHeightVector[1])
- return [p2,p3,p4]
+ return [p2, p3, p4]
# returns the area of a polygon
def polyArea(vertices):
n = len(vertices)
A = 0
- p=n-1
+ p=n - 1
q=0
- while q<n:
- A+=vertices[p][0]*vertices[q][1] - vertices[q][0]*vertices[p][1]
+ while q < n:
+ A+=vertices[p][0] * vertices[q][1] - vertices[q][0] * vertices[p][1]
p=q
q += 1
- return A/2.0
+ return A / 2.0
#Some polygon magic, thanks to John W. Ratcliff on www.flipcode.com
# returns true if pt is in triangle
-def insideTriangle(pt,triangle):
+def insideTriangle(pt, triangle):
ax = triangle[2][0] - triangle[1][0]
ay = triangle[2][1] - triangle[1][1]
@@ -68,74 +68,73 @@ def insideTriangle(pt,triangle):
bpy= pt[1] - triangle[1][1]
cpx= pt[0] - triangle[2][0]
cpy= pt[1] - triangle[2][1]
-
- aCROSSbp = ax*bpy - ay*bpx
- cCROSSap = cx*apy - cy*apx
- bCROSScp = bx*cpy - by*cpx
- return aCROSSbp >= 0.0 and bCROSScp >= 0.0 and cCROSSap >= 0.0
-def polySnip(vertices,u,v,w,n):
+ aCROSSbp = ax * bpy - ay * bpx
+ cCROSSap = cx * apy - cy * apx
+ bCROSScp = bx * cpy - by * cpx
+ return aCROSSbp >= 0.0 and bCROSScp >= 0.0 and cCROSSap >= 0.0
+
+def polySnip(vertices, u, v, w, n):
EPSILON = 0.0000000001
-
+
Ax = vertices[u][0]
Ay = vertices[u][1]
-
+
Bx = vertices[v][0]
By = vertices[v][1]
-
+
Cx = vertices[w][0]
Cy = vertices[w][1]
-
- if EPSILON > (((Bx-Ax)*(Cy-Ay)) - ((By-Ay)*(Cx-Ax))): return False
-
- for p in range(0,n):
+
+ if EPSILON > (((Bx-Ax) * (Cy - Ay)) - ((By - Ay) * (Cx - Ax))): return False
+
+ for p in range(0, n):
if p == u or p == v or p == w: continue
- Px = vertices[p][0];
- Py = vertices[p][1];
- if insideTriangle((Px,Py),((Ax,Ay),(Bx,By),(Cx,Cy))): return False;
-
- return True;
-
-
+ Px = vertices[p][0]
+ Py = vertices[p][1]
+ if insideTriangle((Px, Py), ((Ax, Ay), (Bx, By), (Cx, Cy))): return False
+
+ return True
+
+
# decomposes a polygon into its triangles
def decomposePoly(vertices):
vertices = list(vertices)
n = len(vertices)
result = []
if(n < 3): return [] # not a poly!
-
+
# force a counter-clockwise polygon
if 0 >= polyArea(vertices):
vertices.reverse()
-
- # remove nv-2 vertices, creating 1 triangle every time
+
+ # remove nv-2 vertices, creating 1 triangle every time
nv = n
- count = 2*nv # error detection
- m=0
- v=nv-1
- while nv>2:
+ count = 2 * nv # error detection
+ m = 0
+ v = nv - 1
+ while nv > 2:
count -= 1
- if 0>= count:
+ if 0 >= count:
return [] # Error -- probably bad polygon
-
+
# three consecutive vertices
u = v
- if nv<=u: u = 0 # previous
- v = u+1
- if nv<=v: v = 0 # new v
- w = v+1
- if nv<=w: w = 0 # next
-
- if(polySnip(vertices,u,v,w,nv)):
-
+ if nv <= u: u = 0 # previous
+ v = u + 1
+ if nv <= v: v = 0 # new v
+ w = v + 1
+ if nv <= w: w = 0 # next
+
+ if(polySnip(vertices, u, v, w, nv)):
+
# record this triangle
- result.append((vertices[u],vertices[v],vertices[w]))
-
- m+=1
+ result.append((vertices[u], vertices[v], vertices[w]))
+
+ m += 1
# remove v from remaining polygon
vertices.pop(v)
nv -= 1
# reset error detection
- count = 2*nv
- return result
-
+ count = 2 * nv
+ return result \ No newline at end of file
diff --git a/physics.py b/physics.py
index 521e552..5e64a68 100644
--- a/physics.py
+++ b/physics.py
@@ -57,7 +57,7 @@ class PhysicsGame:
self.box2d = box2d
self.world = elements.Elements(self.screen.get_size())
self.world.renderer.set_surface(self.screen)
-
+
# Set up static environment
self.world.add.ground()
@@ -65,7 +65,7 @@ class PhysicsGame:
self.show_fake_cursor = False
pygame.mouse.set_cursor((8, 8), (0, 0), (0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 0))
self.cursor_picture = pygame.image.load('standardcursor.png')
- self.cursor_picture.convert_alpha()
+ self.cursor_picture.convert_alpha()
self.canvas.connect("enter_notify_event", self.switch_on_fake_pygame_cursor_cb)
self.canvas.connect("leave_notify_event", self.switch_off_fake_pygame_cursor_cb)
self.canvas.add_events(gtk.gdk.ENTER_NOTIFY_MASK
@@ -76,9 +76,9 @@ class PhysicsGame:
def switch_on_fake_pygame_cursor_cb(self, panel, event):
self.show_fake_cursor = True
-
+
def run(self):
- self.running = True
+ self.running = True
while self.running:
for event in pygame.event.get():
self.currentTool.handleEvents(event)
@@ -90,24 +90,24 @@ class PhysicsGame:
if body.userData.has_key('rollMotor'):
diff = body.userData['rollMotor']['targetVelocity'] - body.GetAngularVelocity()
body.ApplyTorque(body.userData['rollMotor']['strength'] * diff * body.getMassData().I)
-
+
# Update & Draw World
self.world.update()
self.screen.fill((255, 255, 255)) # 255 for white
self.world.draw()
-
+
# Draw output from tools
self.currentTool.draw()
# Show Sugar like cursor for UI consistancy
if self.show_fake_cursor:
self.screen.blit(self.cursor_picture, pygame.mouse.get_pos())
-
+
# Flip Display
pygame.display.flip()
-
+
# Try to stay at 30 FPS
- self.clock.tick(30) # Originally 50
+ self.clock.tick(30) # Originally 50
def setTool(self, tool):
self.currentTool.cancel()
diff --git a/tools.py b/tools.py
index 3d05c42..79558a2 100644
--- a/tools.py
+++ b/tools.py
@@ -35,11 +35,11 @@ class Tool(object):
icon = 'icon'
toolTip = "Tool Tip"
toolAccelerator = None
-
+
def __init__(self, gameInstance):
self.game = gameInstance
self.name = self.__class__.name
-
+
def handleEvents(self, event):
handled = True
# Default event handling
@@ -50,7 +50,7 @@ class Tool(object):
if hasattr(event,"action"):
if event.action == "stop_start_toggle":
# Stop/start simulation
- self.game.world.run_physics = not self.game.world.run_physics
+ self.game.world.run_physics = not self.game.world.run_physics
elif self.game.toolList.has_key(event.action):
self.game.setTool(event.action)
elif hasattr(event,"code"):
@@ -70,42 +70,42 @@ class Tool(object):
return handled
else:
return self.handleToolEvent(event)
-
+
def handleToolEvent(self, event):
# Overload to handel events for Tool subclasses
pass
-
+
def draw(self):
# Default drawing method is don't draw anything
pass
-
+
def cancel(self):
# Default cancel doesn't do anything
pass
-# The circle creation tool
-class CircleTool(Tool):
+# The circle creation tool
+class CircleTool(Tool):
name = 'Circle'
icon = 'circle'
toolTip = _("Circle")
toolAccelerator = _("<ctrl>c")
-
+
def __init__(self, gameInstance):
Tool.__init__(self, gameInstance)
self.pt1 = None
self.radius = 40
-
+
def handleToolEvent(self,event):
if event.type == MOUSEBUTTONDOWN:
if event.button == 1:
- self.pt1 = pygame.mouse.get_pos()
+ self.pt1 = pygame.mouse.get_pos()
elif event.type == MOUSEBUTTONUP:
- if event.button == 1:
+ if event.button == 1:
if self.radius > 1: # Elements doesn't like tiny shapes :(
- self.game.world.add.ball(self.pt1, self.radius, dynamic=True, density=1.0, restitution=0.16, friction=0.5)
- self.pt1 = None
-
+ self.game.world.add.ball(self.pt1, self.radius, dynamic=True, density=1.0, restitution=0.16,friction=0.5)
+ self.pt1 = None
+
def draw(self):
# Draw a circle from pt1 to mouse
if self.pt1 != None:
@@ -116,15 +116,15 @@ class CircleTool(Tool):
thick = 3
else:
thick = 0
- pygame.draw.circle(self.game.screen, (100, 180, 255), self.pt1, self.radius,thick)
+ pygame.draw.circle(self.game.screen, (100, 180, 255), self.pt1, self.radius, thick)
pygame.draw.line(self.game.screen, (100, 180, 255), self.pt1, pygame.mouse.get_pos(), 1)
-
+
def cancel(self):
- self.pt1 = None
+ self.pt1 = None
-
-# The box creation tool
-class BoxTool(Tool):
+
+# The box creation tool
+class BoxTool(Tool):
name = 'Box'
icon = 'box'
toolTip = _("Box")
@@ -132,15 +132,15 @@ class BoxTool(Tool):
def __init__(self, gameInstance):
Tool.__init__(self, gameInstance)
- self.pt1 = None
+ self.pt1 = None
self.rect = None
self.width = 80
self.height = 80
-
+
def handleToolEvent(self, event):
if event.type == MOUSEBUTTONDOWN:
if event.button == 1:
- self.pt1 = pygame.mouse.get_pos()
+ self.pt1 = pygame.mouse.get_pos()
elif event.type == MOUSEBUTTONUP:
if event.button == 1 and self.pt1 != None:
mouse_x_y = pygame.mouse.get_pos()
@@ -148,9 +148,9 @@ class BoxTool(Tool):
self.rect = pygame.Rect(self.pt1, (-self.width, -self.height))
self.rect.normalize()
if self.rect.width > 10 and self.rect.height > 10: # Elements doesn't like small shapes :(
- self.game.world.add.rect(self.rect.center, self.rect.width / 2, self.rect.height / 2, dynamic=True, density=1.0, restitution=0.16, friction=0.5)
- self.pt1 = None
-
+ self.game.world.add.rect(self.rect.center, self.rect.width / 2, self.rect.height / 2, dynamic=True, density=1.0, restitution=0.16, friction=0.5)
+ self.pt1 = None
+
def draw(self):
# Draw a box from pt1 to mouse
if self.pt1 != None:
@@ -159,31 +159,31 @@ class BoxTool(Tool):
self.width = mouse_x_y[0] - self.pt1[0]
self.height = mouse_x_y[1] - self.pt1[1]
self.rect = pygame.Rect(self.pt1, (self.width, self.height))
- self.rect.normalize()
- pygame.draw.rect(self.game.screen, (100, 180, 255), self.rect, 3)
-
+ self.rect.normalize()
+ pygame.draw.rect(self.game.screen, (100, 180, 255), self.rect, 3)
+
def cancel(self):
- self.pt1 = None
- self.rect = None
+ self.pt1 = None
+ self.rect = None
+
-
-# The triangle creation tool
-class TriangleTool(Tool):
+# The triangle creation tool
+class TriangleTool(Tool):
name = 'Triangle'
icon = 'triangle'
toolTip = _("Triangle")
toolAccelerator = _("<ctrl>t")
-
+
def __init__(self, gameInstance):
Tool.__init__(self, gameInstance)
self.pt1 = None
self.vertices = None
self.line_delta = [0, -80]
-
+
def handleToolEvent(self,event):
if event.type == MOUSEBUTTONDOWN:
if event.button == 1:
- self.pt1 = pygame.mouse.get_pos()
+ self.pt1 = pygame.mouse.get_pos()
elif event.type == MOUSEBUTTONUP:
if event.button == 1 and self.pt1 != None:
mouse_x_y = pygame.mouse.get_pos()
@@ -191,9 +191,9 @@ class TriangleTool(Tool):
self.pt1 = [mouse_x_y[0] - self.line_delta[0], mouse_x_y[1] - self.line_delta[1]]
self.vertices = constructTriangleFromLine(self.pt1, mouse_x_y)
if distance(self.pt1,pygame.mouse.get_pos()) > 15: # Elements doesn't like tiny shapes :(
- self.game.world.add.convexPoly(self.vertices, dynamic=True, density=1.0, restitution=0.16, friction=0.5)
+ self.game.world.add.convexPoly(self.vertices, dynamic=True, density=1.0, restitution=0.16,friction=0.5)
self.pt1 = None
- self.vertices = None
+ self.vertices = None
def draw(self):
# Draw a triangle from pt1 to mouse
@@ -203,25 +203,25 @@ class TriangleTool(Tool):
self.vertices = constructTriangleFromLine(self.pt1, mouse_x_y)
self.line_delta = [mouse_x_y[0] - self.pt1[0], mouse_x_y[1] - self.pt1[1]]
pygame.draw.polygon(self.game.screen, (100, 180, 255), self.vertices, 3)
- pygame.draw.line(self.game.screen, (100, 180, 255), self.pt1, mouse_x_y, 1)
-
+ pygame.draw.line(self.game.screen, (100, 180, 255), self.pt1, mouse_x_y, 1)
+
def cancel(self):
- self.pt1 = None
+ self.pt1 = None
self.vertices = None
-# The Polygon creation tool
-class PolygonTool(Tool):
+# The Polygon creation tool
+class PolygonTool(Tool):
name = 'Polygon'
icon = 'polygon'
toolTip = _("Polygon")
toolAccelerator = _("<ctrl>p")
-
+
def __init__(self, gameInstance):
Tool.__init__(self, gameInstance)
self.vertices = None
self.previous_vertices = None
-
+
def handleToolEvent(self,event):
if event.type == MOUSEBUTTONDOWN and event.button == 1 and self.vertices is None:
self.vertices = [event.pos]
@@ -240,7 +240,7 @@ class PolygonTool(Tool):
if self.vertices is None or (event.pos[0] == self.vertices[-1][0] and event.pos[1] == self.vertices[-1][1]):
# Skip if coordinate is same as last one
return
- if distance(event.pos,self.vertices[0]) < 15 and self.safe:
+ if distance(event.pos,self.vertices[0]) < 15 and self.safe:
self.vertices.append(self.vertices[0]) # Connect the polygon
self.game.world.add.complexPoly(self.vertices, dynamic=True, density=1.0, restitution=0.16, friction=0.5)
self.previous_vertices = self.vertices[:]
@@ -258,24 +258,24 @@ class PolygonTool(Tool):
for i in range(len(self.vertices) - 1):
pygame.draw.line(self.game.screen, (100, 180, 255), self.vertices[i], self.vertices[i + 1], 3)
pygame.draw.line(self.game.screen, (100, 180, 255), self.vertices[-1], pygame.mouse.get_pos(), 3)
- pygame.draw.circle(self.game.screen, (100, 180, 255), self.vertices[0], 15, 3)
-
- def cancel(self):
+ pygame.draw.circle(self.game.screen, (100, 180, 255), self.vertices[0], 15, 3)
+
+ def cancel(self):
self.vertices = None
-# The magic pen tool
+# The magic pen tool
class MagicPenTool(Tool):
name = 'Magicpen'
icon = 'magicpen'
toolTip = _("Draw")
toolAccelerator = _("<ctrl>d")
-
+
def __init__(self, gameInstance):
Tool.__init__(self, gameInstance)
self.vertices = None
self.previous_vertices = None
-
+
def handleToolEvent(self,event):
if event.type == MOUSEBUTTONDOWN and event.button == 1:
self.vertices = [event.pos]
@@ -296,7 +296,7 @@ class MagicPenTool(Tool):
self.vertices.append(event.pos)
if distance(event.pos, self.vertices[0]) >= 55 and len(self.vertices) > 3:
self.safe = True
-
+
def draw(self):
# Draw the poly being created
if self.vertices:
@@ -304,19 +304,19 @@ class MagicPenTool(Tool):
for i in range(len(self.vertices) - 1):
pygame.draw.line(self.game.screen, (100, 180, 255), self.vertices[i], self.vertices[i + 1], 3)
pygame.draw.line(self.game.screen, (100, 180, 255), self.vertices[-1], pygame.mouse.get_pos(), 3)
- pygame.draw.circle(self.game.screen, (100, 180, 255), self.vertices[0], 15, 3)
-
- def cancel(self):
+ pygame.draw.circle(self.game.screen, (100, 180, 255), self.vertices[0], 15, 3)
+
+ def cancel(self):
self.vertices = None
-# The grab tool
+# The grab tool
class GrabTool(Tool):
name = 'Grab'
icon = 'grab'
toolTip = _("Grab")
toolAccelerator = _("<ctrl>g")
-
+
def __init__(self, gameInstance):
Tool.__init__(self, gameInstance)
self._current_body = None
@@ -326,7 +326,7 @@ class GrabTool(Tool):
if event.type == MOUSEBUTTONDOWN:
if event.button == 1:
# Grab the first object at the mouse pointer
- bodylist = self.game.world.get_bodies_at_pos(event.pos, include_static=False)
+ bodylist = self.game.world.get_bodies_at_pos(event.pos, include_static=False)
if bodylist and len(bodylist) > 0:
if self.game.world.run_physics:
self.game.world.add.mouseJoint(bodylist[0], event.pos)
@@ -351,22 +351,22 @@ class GrabTool(Tool):
x /= self.game.world.ppm
y /= self.game.world.ppm
self._current_body.position = (x, y)
-
+
def cancel(self):
- self.game.world.add.remove_mouseJoint()
+ self.game.world.add.remove_mouseJoint()
+
-
-# The joint tool
+# The joint tool
class JointTool(Tool):
name = 'Joint'
icon = 'joint'
toolTip = _("Joint")
toolAccelerator = "<ctrl>j"
-
+
def __init__(self, gameInstance):
Tool.__init__(self, gameInstance)
self.jb1 = self.jb2 = self.jb1pos = self.jb2pos = None
-
+
def handleToolEvent(self,event):
if event.type == MOUSEBUTTONDOWN:
if event.button >= 1:
@@ -388,26 +388,26 @@ class JointTool(Tool):
# self.game.world.add.joint(self.jb1[0],groundBody,self.jb1pos,self.jb2pos)
# 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)
-
+
def cancel(self):
- self.jb1 = self.jb2 = self.jb1pos = self.jb2pos = None
+ self.jb1 = self.jb2 = self.jb1pos = self.jb2pos = None
-# The pin tool
+# The pin tool
class PinTool(Tool):
name = 'Pin'
icon = 'pin'
toolTip = _("Pin")
toolAccelerator = _("<ctrl>o")
-
+
def __init__(self, gameInstance):
Tool.__init__(self, gameInstance)
self.jb1 = self.jb1pos = None
-
+
def handleToolEvent(self,event):
if event.type == MOUSEBUTTONDOWN:
self.jb1pos = event.pos
@@ -418,19 +418,19 @@ class PinTool(Tool):
def cancel(self):
self.jb1 = self.jb1pos = None
-
-
-# The motor tool
+
+
+# The motor tool
class MotorTool(Tool):
name = 'Motor'
icon = 'motor'
toolTip = _("Motor")
toolAccelerator = _("<ctrl>m")
-
+
def __init__(self, gameInstance):
Tool.__init__(self, gameInstance)
self.jb1 = self.jb1pos = None
-
+
def handleToolEvent(self,event):
if event.type == MOUSEBUTTONDOWN:
if event.button >= 1:
@@ -440,7 +440,7 @@ class MotorTool(Tool):
if self.jb1:
self.game.world.add.motor(self.jb1[0], self.jb1pos)
self.jb1 = self.jb1pos = None
-
+
def cancel(self):
self.jb1 = self.jb1pos = None
@@ -454,7 +454,7 @@ class RollTool(Tool):
def __init__(self, gameInstance):
Tool.__init__(self, gameInstance)
self.jb1 = self.jb1pos = None
-
+
def handleToolEvent(self,event):
if event.type == MOUSEBUTTONDOWN:
if event.button == 1:
@@ -466,22 +466,22 @@ class RollTool(Tool):
self.jb1[0].userData['rollMotor']['targetVelocity'] = -10
self.jb1[0].userData['rollMotor']['strength'] = 40
self.jb1 = self.jb1pos = None
-
+
def cancel(self):
self.jb1 = self.jb1pos = None
-
-
-# The destroy tool
+
+
+# The destroy tool
class DestroyTool(Tool):
name = 'Destroy'
icon = 'destroy'
toolTip = _("Erase")
toolAccelerator = _("<ctrl>e")
-
+
def __init__(self, gameInstance):
Tool.__init__(self, gameInstance)
self.vertices = None
-
+
def handleToolEvent(self,event):
if pygame.mouse.get_pressed()[0]:
if not self.vertices: self.vertices = []
@@ -490,8 +490,8 @@ class DestroyTool(Tool):
self.vertices.pop(0)
tokill = self.game.world.get_bodies_at_pos(pygame.mouse.get_pos())
-
- if tokill:
+
+ if tokill:
jointnode = tokill[0].GetJointList()
if jointnode:
joint = jointnode.joint
@@ -500,7 +500,7 @@ class DestroyTool(Tool):
self.game.world.world.DestroyBody(tokill[0])
elif event.type == MOUSEBUTTONUP and event.button == 1:
self.cancel()
-
+
def draw(self):
# Draw the trail
if self.vertices:
@@ -508,7 +508,7 @@ class DestroyTool(Tool):
pygame.draw.lines(self.game.screen, (255, 0, 0), False, self.vertices, 3)
def cancel(self):
- self.vertices = None
+ self.vertices = None
def getAllTools():
@@ -522,5 +522,5 @@ def getAllTools():
PinTool,
JointTool,
DestroyTool]
-
+
allTools = getAllTools()