import sys import time from random import * from math import * from OpenGL.GLUT import * from OpenGL.GL import * from OpenGL.GLU import * from dmsgl import * class Circle: def __init__(self, x, y, radius, color): self.pos = Vector([x,y]) self.radius = radius self.color = color self.heading = 0 self.dheading = 0 self.speed = 0 self.lastTime = time.time() def draw(self): glColor3fv(self.color) glPushMatrix() glTranslate(self.pos[0], self.pos[1], 0) glRotate(self.heading, 0, 0, 1) glBegin(GL_TRIANGLE_FAN) glVertex2f(0,0) for i in range(0,30): glVertex2f(cos(radians(i*12.0)) * self.radius, sin(radians(i*12.0)) * self.radius) glEnd() glPopMatrix() def update(self): t = time.time() dt = t - self.lastTime self.lastTime = t self.heading += dt * self.dheading vec = Vector( [cos(radians(self.heading)), sin(radians(self.heading))] ) vec = dt * self.speed * vec self.pos = self.pos + vec class Triangle: def __init__(self, x, y, radius, color): self.pos = Vector([x,y]) self.radius = radius self.color = color self.heading = 0 self.dheading = 0 self.speed = 0 self.lastTime = time.time() def draw(self): glColor3fv(self.color) glPushMatrix() glTranslate(self.pos[0], self.pos[1], 0) glRotate(self.heading, 0, 0, 1) glBegin(GL_TRIANGLE_FAN) glVertex2f(0,0) for i in range(0,2): glVertex2f(cos(radians(i*12.0)) * self.radius, sin(radians(i*12.0)) * self.radius) glEnd() glPopMatrix() def update(self): t = time.time() dt = t - self.lastTime self.lastTime = t self.heading += dt * self.dheading vec = Vector( [cos(radians(self.heading)), sin(radians(self.heading))] ) vec = dt * self.speed * vec self.pos = self.pos + vec c = Circle(-10, 0, 5, [1,0,0]) d = Triangle(10, 0, 5, [1,1,0]) objects = [c,d] def draw(): glClear(GL_COLOR_BUFFER_BIT) glLoadIdentity() for o in objects: o.draw() glutSwapBuffers() def keyboard(key, x, y): if key == chr(27): sys.exit(0) elif key == 'a': d.speed = -1 elif key == ' ': objects.append(Circle(0, uniform(-10,10), 1, [random(), random(), random()])) def specialkey(key, x, y): if key == GLUT_KEY_UP: c.speed = 3 elif key == GLUT_KEY_DOWN: c.speed = -3 elif key == GLUT_KEY_RIGHT: c.dheading = -10 elif key == GLUT_KEY_LEFT: c.dheading = 10 def specialkeyup(key, x, y): if key == GLUT_KEY_UP: c.speed = 0 elif key == GLUT_KEY_DOWN: c.speed = 0 elif key == GLUT_KEY_RIGHT: c.dheading = 0 elif key == GLUT_KEY_LEFT: c.dheading = 0 def update(dummy): glutTimerFunc(16, update, 0) for o in objects: o.update() glutPostRedisplay() glutInit(sys.argv) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB) glutInitWindowSize(400, 400) glutInitWindowPosition(0,0) glutCreateWindow(sys.argv[0]) glutDisplayFunc(draw) glutKeyboardFunc(keyboard) glutSpecialFunc(specialkey) glutSpecialUpFunc(specialkeyup) glutSetKeyRepeat(0) glutTimerFunc(0, update, 0) glMatrixMode(GL_PROJECTION) gluOrtho2D(-10,10,-10,10) glMatrixMode(GL_MODELVIEW) glutMainLoop()