#Stwelin - Platformer exampleimport osimport rabbytfrom rabbyt import lerp, wrapfrom math import cos,sin,pi,sqrt,atan2from random import *import pygamefrom pygame.locals import *#setup windowpygame.init()pygame.display.set_mode((640, 480), pygame.OPENGL | pygame.DOUBLEBUF)rabbyt.set_viewport((640, 480))rabbyt.set_default_attribs()#set load_texture hookrabbyt.set_load_texture_file_hook( lambda filename: rabbyt.pygame_load_texture(filename, filter=False))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 classclass pSprite(rabbyt.Sprite): def __init__(self,x=0,y=0,sprite=None,shape=None,gravity=16): rabbyt.Sprite.__init__(self,x=x,y=y,texture=sprite,shape=shape) self.cmask = cmask(self, shape) self.dx=0 self.dy=0 self.gravity=gravity def update(self, dt): self.dy -= self.gravity self.x += self.dx * dt self.y += self.dy * dt def handle_collision(self,other):pass#collision mask class#used only for collisions! dummy sprite!class cmask(rabbyt.Sprite): def __init__(self,parent,shape): rabbyt.Sprite.__init__(self,None,shape) self.parent=parent self.xy = parent.attrgetter('xy') self.shape = shape def handle_collision(self,other): self.parent.handle_collision(other.parent)class player(pSprite): def __init__(self,x=0,y=0,sprite=None,shape=None,gravity=16): pSprite.__init__(self,x,y,sprite,shape,gravity) self.maxxspeed=120 # pixels per second self.xaccel = 30 self.can_jump = False self.slist=['0.png','1.png','2.png','3.png'] self.anim = 0 def update(self, dt): if pygame.key.get_focused: keys = pygame.key.get_pressed() if keys[K_LEFT]: self.dx-=self.xaccel if keys[K_RIGHT]: self.dx+=self.xaccel if keys[K_UP]: if self.can_jump: self.dy=400 if not keys[K_RIGHT] and not keys[K_LEFT]: if self.can_jump == True: self.dx=self.dx*0.4 else: self.dx=self.dx*0.8 if abs(self.dx) > self.maxxspeed: self.dx = self.maxxspeed*self.dx/abs(self.dx) #limit speed #update sprites if abs(self.dx) > 5: self.anim += abs(self.dx)/(self.maxxspeed*5) if self.anim > 3: self.anim=0 i=int(self.anim) #save the shape! self.texture=self.slist[i] pSprite.update(self, dt) # This will be updated by handle_collision later. self.can_jump = False def handle_collision(self, other): # We have collided with something and must move back out of it. # I'm doing this by checking which direction penetrates the least. A # better method might be to compair with the previous location, but # this seems to work good enough. if min(other.cmask.top-self.cmask.bottom, self.cmask.top-other.cmask.bottom) > \ min(other.cmask.right-self.cmask.left, self.cmask.right-other.cmask.left): self.dx = 0 if self.cmask.right-other.cmask.left < other.cmask.right-self.cmask.left: self.cmask.right = other.cmask.left - .01 else: self.cmask.left = other.cmask.right + .01 else: self.dy = 0 if self.cmask.top-other.cmask.bottom < other.cmask.top-self.cmask.bottom: self.cmask.top = other.cmask.bottom - .01 else: # We landed on top of something; we will be able to jump next frame. self.can_jump = True self.cmask.bottom = other.cmask.top + .01class 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)sprites=[]player1=player(sprite='0.png',shape=(-4,16,4,-16))sprites.append(player1)b=block(y=-180,shape=(-160,8,8,-8))sprites.append(b)b=block(y=-160,x=-60,shape=(-8,16,8,-16))sprites.append(b)#the gameloopkeepRunning = TruespawnTime = 40c = pygame.time.Clock()last_fps = 0while 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 dt = c.tick(100)/1000. if pygame.time.get_ticks() - last_fps > 1000: #print "FPS: ", c.get_fps() last_fps = pygame.time.get_ticks() for s in sprites[:]: s.update(dt) collisions = rabbyt.collisions.aabb_collide([sprite.cmask for sprite in 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.render() pygame.display.flip() #flip the buffers