# import os import rabbyt from rabbyt import lerp, wrap from math import cos,sin,pi,sqrt,atan2 from random import * import pygame from pygame.locals import * #setup window pygame.init() pygame.display.set_mode((640, 480), pygame.OPENGL | pygame.DOUBLEBUF) rabbyt.set_viewport((640, 480)) rabbyt.set_default_attribs() def collidelist_add(list): for instance in list: sprites.append(instance) def collidelist_remove(list): for instance in list: if instance in sprites: sprites.remove(instance) #create pSprite class class pSprite(rabbyt.Sprite): def __init__(self,x=0,y=0,sprite=None,shape=None,gravity=0): rabbyt.Sprite.__init__(self,x=x,y=y,texture=sprite,shape=shape) self.dx=0 self.dy=0 self.gravity=gravity self.grav=0.35 #This is a function to add a motion to the physics object... #left over from the last iteration, not optimized for use yet. #nevermind it. # def motion_add(self,adddir,addspeed): # cx1=addspeed*cos(adddir*(pi/180)) # cy1=addspeed*sin(adddir*(pi/180)) # cx2=self.speed*cos(self.direction*(pi/180)) # cy2=self.speed*sin(self.direction*(pi/180)) # nx,ny=(cx1+cx2,cy1+cy2) # self.speed=sqrt(nx*nx+ny*ny) # atta=atan2(ny,nx) # self.direction=atta*(180/pi) def getx(self): return int(self.x) def gety(self): return int(self.y) def place_free(self,newx,newy): hit = 1 tempx=self.x tempy=self.y self.x=newx self.y=newy collisions = rabbyt.collisions.aabb_collide(sprites) for pSpr1,pSpr2 in collisions: if (isinstance(pSpr1,player) and isinstance(pSpr2,block)) or (isinstance(pSpr2,player) and isinstance(pSpr1,block)): hit = 0 self.x=tempx self.y=tempy return hit def move_contact(self,dir,iter): for n in range(0,iter): xcheck=int(self.getx())+cos(dir*(pi/180)) xcheck=int(xcheck*10000)/10000 ycheck=int(self.gety())+sin(dir*(pi/180)) ycheck=int(ycheck*10000)/10000 if self.place_free(xcheck,ycheck): self.x=int(xcheck) self.y=int(ycheck) else: break def update(self): if self.rot>360: self.rot-=360 if self.rot<0: self.rot+=360 self.x+=self.dx self.y+=self.dy if self.gravity > 0: self.dy-=self.grav def handle_collision(self,other):pass class player(pSprite): def __init__(self,x=0,y=0,sprite=None,shape=None,gravity=0): pSprite.__init__(self,x,y,sprite,shape,gravity) self.maxxspeed=3 self.grav=0.25 self.xaccel = 1 self.rgb=(.7,.3,.6) def update(self): pSprite.update(self) if pygame.key.get_focused: keys = pygame.key.get_pressed() if self.place_free(self.x-self.xaccel,self.y): if keys[K_LEFT]: self.dx-=self.xaccel if self.place_free(self.x+self.xaccel,self.y): if keys[K_RIGHT]: self.dx+=self.xaccel if keys[K_UP]: if not self.place_free(self.x,self.y-1): self.dy=5 if not keys[K_RIGHT] and not keys[K_LEFT]: self.dx=self.dx*0.8 if abs(self.dx) > self.maxxspeed: self.dx = self.maxxspeed*self.dx/abs(self.dx) #limit speed if self.place_free(self.getx(),self.gety()+self.dy) and self.place_free(self.getx()+self.dx,self.gety()): #handles weird collision, if not self.place_free(self.x+self.dx,self.y+self.dy): #running into the wall/floor diagonally self.dx=0 if self.place_free(self.x,self.y-1): #gravity self.gravity=self.grav if not self.place_free(self.x,self.y+self.dy): #handles vertical collision self.gravity=0 self.move_contact(atan2(self.dy,0)*(180/pi),40) self.dy=0 if not self.place_free(self.getx()+self.dx,self.gety()): #handles horizontal collision self.move_contact(atan2(0,self.dx)*(180/pi),self.maxxspeed) self.dx=0 print self.gravity class block(pSprite): def __init__(self,x=0,y=0,sprite=None,shape=None,gravity=0): pSprite.__init__(self,x,y,sprite,shape,gravity) self.rgb=(.2,.3,.4) def update(self): pSprite.update(self) sprites=[] player1=player(shape=(8,-8,-8,8)) sprites.append(player1) b=block(y=-180,shape=(160,-8,-8,8)) sprites.append(b) #b=block(y=-100,x=40,shape=(8,-8,-8,8)) #sprites.append(b) #the gameloop keepRunning = True spawnTime = 40 c = pygame.time.Clock() last_fps = 0 while keepRunning: #messagepump for event in pygame.event.get(): if event.type == QUIT: keepRunning = False elif event.type == KEYDOWN: if event.key == K_ESCAPE: keepRunning = False #FPS c.tick() if pygame.time.get_ticks() - last_fps > 1000: #print "FPS: ", c.get_fps() last_fps = pygame.time.get_ticks() #collision collisions = rabbyt.collisions.brute_force(sprites) for pSpr1,pSpr2 in collisions: pSpr1.handle_collision(pSpr2) pSpr2.handle_collision(pSpr1) #the actual rendering code rabbyt.clear() #clear the screen for sprite in sprites[:]: sprite.update() sprite.render() pygame.display.flip() #flip the buffers