#!/usr/bin/python
"""
Physics, a 2D Physics Playground for Kids
Copyright (C) 2008 Alex Levenson and Brian Jordan
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
--
Elements is Copyright (C) 2008, The Elements Team,
Wiki: http://wiki.sugarlabs.org/go/Activities/Physics
Code: git://git.sugarlabs.org/physics/mainline.git
"""
import sys
import math
import pygame
from pygame.locals import *
from pygame.color import *
import olpcgames
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,screen):
self.screen = screen
# get everything set up
self.clock = pygame.time.Clock()
self.font = pygame.font.Font(None, 24) # font object
self.canvas = olpcgames.ACTIVITY.canvas
# 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]
# 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()
# Fake a Sugar cursor for the pyGame canvas area
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.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
| gtk.gdk.LEAVE_NOTIFY_MASK)
def switch_off_fake_pygame_cursor_cb(self, panel, event):
self.show_fake_cursor = False
def switch_on_fake_pygame_cursor_cb(self, panel, event):
self.show_fake_cursor = True
def run(self):
self.running = True
while self.running:
for event in pygame.event.get():
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()
# 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
def setTool(self,tool):
self.currentTool.cancel()
self.currentTool = self.toolList[tool]
def main():
toolbarheight = 75
tabheight = 45
pygame.init()
pygame.display.init()
x,y = pygame.display.list_modes()[0]
screen = pygame.display.set_mode((x,y-toolbarheight-tabheight))
# create an instance of the game
game = PhysicsGame(screen)
# start the main loop
game.run()
# make sure that main get's called
if __name__ == '__main__':
main()