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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
import sys
sys.path.insert(0, "..") # if Elements has yet to be installed
import elements
from elements.locals import *
import pygtk
pygtk.require('2.0')
import gtk
import cairo
import gobject
import time
# just found this, need to take a look:
# ---> http://cairographics.org/threaded_animation_with_cairo/
# ----> http://www.tortall.net/mu/wiki/PyGTKCairoTutorial
#class myScreen(gtk.DrawingArea):
# # Draw in response to an expose-event
# __gsignals__ = { "expose-event": "override" }
# is there a possible problem with the timers and threading?
# i'm not exactly sure how these GTK timers work. could require some looking into.
# but i guess i won't worry about that for now since it doesn't seem like it's crashing *cough*
class myWindow(object):
draw_poly = False
points = [] #
mousex = 0 #
mousey = 0 #
fps_all = [] # array of the "most recent fps" -- how long each draw call took
fps_count=25 # how many samples to hold
fps =0 # the actual approximate fps
def contact_add(self, c):
#print "Any Contact"
pass
def contact_add_ball(self, c):
print "Contact with Ball"
def contact_add_poly(self, c):
print "Polygon Contact"
def destroy(self, widget, data=None):
print "Quitting..."
gtk.main_quit()
def keydown(self, widget, event):
keystr = gtk.gdk.keyval_name(event.keyval)
if keystr == 'Escape':
gtk.main_quit()
#elif
#else:
# print gtk.gdk.keyval_name(event.keyval)
def keyup(self, widget, event):
pass
def mousemove(self, widget, event):
self.mousex, self.mousey = event.x, event.y
if self.draw_poly:
pos = (event.x, event.y)
self.points.append( pos )
def mousedown(self, widget, event):
pos = (event.x, event.y)
print pos
#return
if event.button == 3:
self.world.add.triangle( pos, sidelength=50)
elif event.button == 1:
# Start/Stop Wall-Drawing
if not self.draw_poly:
self.draw_poly = True
self.points = []
self.points.append(pos)
def mouseup(self, widget, event):
self.mousex, self.mousey = event.x, event.y
pos = (event.x, event.y)
if event.button == 1 and self.draw_poly:
# Create Polygon
self.draw_poly = False
self.points.append(pos)
if len(self.points) > 2:
body, self.points = self.world.add.complexPoly(self.points)
else:
self.world.add.rect(pos, width=80, height=30)
def __init__(self, size = (640, 480)):
print "Initializing the window..."
# Create a new window
self.window = win = gtk.Window(gtk.WINDOW_TOPLEVEL)
win.set_title("Demo 11 - Using GTK+/Cairo")
# Connect the destroy function with the destruction of the window
win.set_default_size(size[0], size[1])
# Add the drawing area to the window
da = gtk.DrawingArea()
win.add(da)
win.connect("destroy", self.destroy)
win.connect("key_press_event", self.keydown)
win.connect("key_release_event", self.keyup)
da.set_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK |
gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK )
da.connect("button_press_event", self.mousedown)
da.connect("button_release_event", self.mouseup)
win.connect("motion_notify_event", self.mousemove)
# show the window
win.show_all()
# Create the Physical Space Class
self.world = world = elements.Elements(screen_size=size, renderer="cairo")
#self.world.set_inputAxisOrigin(left=True, top=True)
self.world.renderer.set_drawing_area(da)
world.callbacks.add(CALLBACK_DRAWING_END, self.custom_draw)
b1 = world.add.ball((101, 101), 50)
b2 = world.add.ball((100, 100), 50)
# Add contact callbacks
world.callbacks.add(CALLBACK_CONTACT_ADD, self.contact_add)
world.callbacks.add(CALLBACK_CONTACT_ADD, self.contact_add_ball, [b1])
# Add the ground
world.add.ground()
gobject.timeout_add(1000/60, self.physics_update)
gobject.timeout_add(1000/60, self.draw_update)
def custom_draw(self):
r = self.world.renderer
r.draw_circle((255,0,0), (self.mousex, self.mousey), 1)
if self.points:
r.draw_lines((1,0,0), False, self.points)
for p in self.points:
r.draw_circle((0.1,0.1,0.1), p, 5)
r.draw_text("FPS: %d" % self.fps, center=(50,50))
def physics_update(self):
self.world.update()
return True
def draw_update(self):
start = time.clock()
ret = self.world.draw()
elapsed = time.clock() - start
if elapsed == 0: return ret
self.fps_all.append(1 / elapsed)
if len(self.fps_all) > self.fps_count:
del self.fps_all[0]
self.fps = 0
for i in self.fps_all:
self.fps += i
self.fps /= self.fps_count
return ret
def main(self):
gtk.main()
# If the program is run directly or passed as an argument to the python
# interpreter then create a HelloWorld instance and show it
if __name__ == "__main__":
hello = myWindow()
hello.main()
|