def on_create(self, config): Activity.on_create(self, config) self.screen_size = pygame.display.get_surface().get_size() self.victory_anim = resources.get("goalani").get_new_handle() self.enemy_anim = resources.get("enemyani").get_new_handle() self.particle_limit = settings.get("particle_limit") self.particle_fps_limit = settings.get("particle_fps_limit") self.optimize_drawing = True self.segment_renderers = [ SegmentRenderer(resources.get("woodtex"),11), SegmentRenderer(resources.get("oozetex"),11), SegmentRenderer(resources.get("icetex"),11), SegmentRenderer(resources.get("voidtex"),11), ] self.spinner_renderers = [ SpinnerRenderer(resources.get("spinner1")), SpinnerRenderer(resources.get("spinner2")), SpinnerRenderer(resources.get("spinner3")), ] self.levelnum = config["level"] self.filename = self.controller.level_path( config["level"]) #if the next level does not exist just back out to the main menu try: self.level_elements = ET.parse( self.filename).getroot() self.reload_level() except IOError: self.finish()
def player_collide_with_sound(self, space, arbiter, *args, **kwargs): player, obj = arbiter.shapes player = player.body self.player_launchable = True vel = player.velocity.get_length() self.make_particles( player.position, int(vel/20), PLAYER_PARTICLE_COLOR) self.player_impact = PLAYER_IMPACT_TIME if vel >= 75.0: snd = resources.get( random.choice(("squish1", "squish2", "squish3", "squish4"))) if hasattr( obj, "material") and obj.material == 1: snd = resources.get( random.choice(("bounce1","bounce2","bounce3","bounce4"))) snd.play() return True
def draw_statics(self, screen): screen.blit(resources.get("background"), (0,0)) #draw platform segments for s in self.segments: self.segment_renderers[s.material].draw( screen, s) #draw magnets baseimg = resources.get("magnet") for m in self.magnets: pos = pymunk.pygame_util.to_pygame( m.position, screen) img = pygame.transform.smoothscale( baseimg, (int(m.shape.radius*2), (int(m.shape.radius*2)))) offset = Vec2d(img.get_width()/2, img.get_height()/2) screen.blit( img, pos-offset)
def draw(self, screen): screen.blit(self.image, self.rect) if self.selected: img = resources.get("player") pos = self.rect.topleft pos = (pos[0] - img.get_width() - 10, pos[1]) screen.blit(img, pos)
def player_enemy_collide(self, space, arbiter): player, enemy = arbiter.shapes self.player_launchable = True playerspeed = player.body.velocity.get_length() speeddiff = (player.body.velocity - enemy.body.velocity).get_length() if playerspeed > 350:# and speeddiff > 100: self.space.remove( enemy, enemy.body) self.enemies.remove( enemy.body) self.make_particles( self.player.position, 125, ENEMY_PARTICLE_COLOR) snd = resources.get("sheepdie") snd.play() else: self.make_particles( self.player.position, 125, PLAYER_PARTICLE_COLOR) self.kill_player() return False
def win_level(self): sz1 = 50 sz2 = 30 sz3 = 18 wintexts = ( [(sz1, "Good job"), (sz2, "Maybe try going outside some time")], [(sz1, "You won"), (sz2, "You want a trophy or something?")], [(sz1, "Good for you"), (sz2, "That was sarcasm by the way")], [(sz1, "You did it"), (sz2, "I could have done it faster")], [(sz1, "Wow"), (sz2, "A trained ape could have done better")], [(sz1, "Impressive"), (sz2, "But not as impressive as you think")], ) addendum = [(sz3, "Press SPACE to continue")] self.game_mode = GAME_WON snd = resources.get("victory") snd.play() self.show_status_text( True, -1.0, random.choice( wintexts)+addendum)
def kill_player(self): sz1 = 50 sz2 = 30 sz3 = 18 dietexts = ( [(sz1, "You killed Bob"), (sz2, "I hope it was worth it")], [(sz1, "You killed Bob"), (sz2, "Just as I expected")], [(sz1, "You killed him!"), (sz2, "Do you feel like a man now?")], [(sz1, "Bob is dead!"), (sz2, "Way to go dumbass")], [(sz1, "How did you die there?"), (sz2, "Seriously!")], [(sz1, "Farewell Bob"), (sz2, "You will be missed")], [(sz1, "You suck"), (sz2, "Seriously what are you even doing?")], ) addendum = [(sz3, "Press Q to reload")] snd = resources.get( "playerdie") snd.play() self.space.remove( self.player, self.player.shape) self.player.dead = True self.game_mode = GAME_OVER self.show_status_text( True, -1.0, random.choice(dietexts)+addendum)
def draw(self, screen): screen.blit( resources.get("menubg"), (0,0)) menu.MenuActivity.draw(self, screen)
def update_tut(self): self.img = pygame.Surface( (750,750), pygame.SRCALPHA) self.img = resources.get( self.script[self.panel][0]).copy() self.draw_text( self.img, self.script[self.panel][1][self.caption])
def draw(self, screen): Activity.draw(self, screen) if not self.complex_drawing: pymunk.pygame_util.draw( screen, self.space) for ff in self.forcefields: pygame.draw.line( screen, (255,255,255), pymunk.pygame_util.to_pygame( ff.center, screen), pymunk.pygame_util.to_pygame( ff.center+ff.fieldforce, screen)) #draw gravity balls wavesize = 25 begin = int(0.5*self.time*wavesize)%wavesize for g in self.gravballs: if not g.shutdown: pos = pymunk.pygame_util.to_pygame( g.position, screen) if g.strength < 0: for r in xrange(begin, g.wellsize, wavesize): if r > 0: pygame.draw.circle( screen, (200,60,0), pos, r, 1) else: for r in xrange(wavesize-begin, g.wellsize, wavesize): if r > 0: pygame.draw.circle( screen, (100,0,120), pos, r, 1) else: if self.optimize_drawing: screen.blit( self.static_img, (0,0)) else: self.draw_statics(screen) #draw gravity balls wavesize = 25 begin = int(0.5*self.time*wavesize)%wavesize for g in self.gravballs: if not g.shutdown: pos = pymunk.pygame_util.to_pygame( g.position, screen) if g.strength < 0: for r in xrange(begin, g.wellsize, wavesize): if r > 0: pygame.draw.circle( screen, (200,60,0), pos, r, 1) else: for r in xrange(wavesize-begin, g.wellsize, wavesize): if r > 0: pygame.draw.circle( screen, (200,0,240), pos, r, 1) #draw forcefields img = resources.get("fieldbg") for f in self.forcefields: imgw = img.get_width() imgh = img.get_height() offset = (int(f.imgoffset[0])%imgw, int(f.imgoffset[1])%imgh) topleft = pymunk.pygame_util.to_pygame(f.topleft, screen) sub = screen.subsurface( (topleft[0], topleft[1], f.dimensions[0], f.dimensions[1])) for x in xrange( -imgw, int(f.dimensions[0])+imgw, imgw): for y in xrange( -imgh, int(f.dimensions[1])+imgh, imgh): sub.blit( img, (x+offset[0], y-offset[1])) #draw spinners conversion = 360/(2*math.pi) gear = resources.get("spingear") for s in self.spinners: pos = Vec2d( pymunk.pygame_util.to_pygame( s.position, screen)) angle = s.angle angle = int(angle*conversion) material = s.material scale = s.length/60.0 self.spinner_renderers[s.material].draw( screen, angle, scale, pos) if s.mode == "drag": img = pygame.transform.rotate( gear, angle) offset = Vec2d(img.get_width()/2, img.get_height()/2) screen.blit( img, pos-offset) #draw particles for p in self.particles: pos = pymunk.pygame_util.to_pygame( p.position, screen) pygame.draw.circle(screen, p.color, pos, 2) #draw victory locations baseimg = self.victory_anim.get_current_frame() for v in self.victories: pos = pymunk.pygame_util.to_pygame( v.topleft, screen) img = pygame.transform.scale( baseimg, v.dimensions.int_tuple) screen.blit( img, pos) #draw enemies baseimg = self.enemy_anim.get_current_frame() flipped = pygame.transform.flip( baseimg, True, False) for e in self.enemies: pos = pymunk.pygame_util.to_pygame( e.position, screen) if e.velocity[0] < 0: screen.blit( baseimg, (pos[0]-baseimg.get_width()/2, pos[1]-baseimg.get_height()/2)) else: screen.blit( flipped, (pos[0]-baseimg.get_width()/2, pos[1]-baseimg.get_height()/2)) #draw the player if not self.player.dead: if self.charging: baseimg = resources.get("player_charging") else: if self.player_impact > 0: baseimg = resources.get("player_impact") else: baseimg = resources.get("player") if self.player.facing == "left": img = pygame.transform.flip( baseimg, True, False) else: img = baseimg pos = pymunk.pygame_util.to_pygame( self.player.position, screen) offset = Vec2d( img.get_width()/2, img.get_height()/2) screen.blit( img, pos-offset) '''draw the launch indicator if the player is charging up''' mousepos = Vec2d( pygame.mouse.get_pos())#mouse position in screen coordinates playerpos = pymunk.pygame_util.to_pygame( self.player.position, screen)#player pos in screen coords if self.charging: ratio = self.charge/MAXCHARGE mousevect = (mousepos-playerpos).normalized() finalpos = playerpos + mousevect*40 r = int(ratio*LAUNCH_IND_LEN) for x in range(r,10,-3): pos = playerpos+mousevect*x pygame.draw.circle( screen, (255,255-x*2,0), pos.int_tuple, x/8) if self.status_img is not None: screen.blit( self.status_img, (0,int(self.status_offset)))