1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#!/usr/bin/python
"""
This file is part of the 'Physics' Project
Physics is a 2D Physics Playground for Kids (supporting Box2D2)
Physics Copyright (C) 2008, Alex Levenson, Brian Jordan
Elements Copyright (C) 2008, The Elements Team, <elements@linuxuser.at>
Wiki: http://wiki.laptop.org/wiki/Physics
IRC: #olpc-physics on irc.freenode.org
Code: http://dev.laptop.org/git?p=activities/physics
git clone git://dev.laptop.org/activities/physics
License: GPLv3 http://gplv3.fsf.org/
"""
import sys
import math
import pygame
from pygame.locals import *
from pygame.color import *
sys.path.append("lib/")
import pkg_resources
sys.path.append("lib/Elements-0.13-py2.5.egg")
sys.path.append("lib/Box2D-2.0.2b1-py2.5-linux-i686.egg")
import Box2D as box2d
import elements
import tools
from helpers import *
import gtk
class PhysicsGame:
def __init__(self):
# create the name --> instance map for components
self.toolList = {}
for c in tools.allTools:
self.toolList[c.name] = c(self)
self.currentTool = self.toolList[tools.allTools[0].name]
def setup(self):
self.screen = pygame.display.get_surface()
# get everything set up
self.clock = pygame.time.Clock()
self.font = pygame.font.Font(None, 24) # font object
# set up the world (instance of Elements)
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()
def stop_start_toggle(self):
self.world.run_physics = not self.world.run_physics
def set_tool(self, tool):
self.setTool(tool)
def write_file(self, file_path):
self.world.add.remove_mouseJoint()
self.world.json_save(file_path)
def read_file(self, file_path):
self.world.json_load(file_path)
def run(self):
self.setup()
self.running = True
while self.running:
# Pump GTK messages.
while gtk.events_pending():
gtk.main_iteration()
# Pump PyGame messages.
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
self.currentTool.handleEvents(event)
# Clear Display
self.screen.fill((255,255,255)) #255 for white
if self.world.run_physics:
for body in self.world.world.GetBodyList():
if type(body.userData) == type({}):
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.world.draw()
# draw output from tools
self.currentTool.draw()
# Flip Display
pygame.display.flip()
# Try to stay at 30 FPS
self.clock.tick(30) # originally 50
def setTool(self,tool):
self.currentTool.cancel()
self.currentTool = self.toolList[tool]
def main():
pygame.init()
pygame.display.init()
width, height = pygame.display.list_modes()[0]
pygame.display.set_mode((width,height))
game = PhysicsGame()
game.run()
# make sure that main get's called
if __name__ == '__main__':
main()
|