def animFromStrip(self, image, mappings, width, height, mask=None): gw = int(image.get_width() / width) gh = int(image.get_height() / height) for mapping in mappings: hotspot = (0,0) actionpoint = (0,0) if len(mapping) == 6: anim, direction, start, count, speed, looped = mapping elif len(mapping) == 7: anim, direction, start, count, speed, looped, hotspot = mapping elif len(mapping) == 8: anim, direction, start, count, speed, looped, hotspot, actionpoint = mapping frames = [ ] for index in range(count): x = int(( start + index ) % gw) * width y = int(( start + index ) / gw) * height rect = pygame.Rect(int(x), int(y), width, height) frame = oFrame( core.im_crop(image, rect), hotspot=hotspot, actionpoint=actionpoint ) if mask is not None: frame.mask = pygame.mask.from_surface(core.im_crop(mask, rect), 0) frames.append(frame) if not self.animations.has_key(anim): self.animations[anim] = { } self.animations[anim].update({direction: [speed, looped, frames]})
def main_game(): global mc, tutorial, hints, killed_bugs # if yesno_prompt("Play tutorial level?"): # tutorial = True # hints = 0 core.baddys_group.clear() core.render_group.clear() core.attack_group.clear() # load bg sky_bg = core.load_image("sky_bg.png", directory="gfx", auto_alpha=False) exp_bgs = core.load_image("exp_bg.png", directory="gfx") exp_bg = sprite.oSprite() exp_bg.x = 10 exp_bg.y = 545 exp_bg.animations = { "stopped": { "N": [0, True, [ sprite.oFrame(core.im_crop(exp_bgs, pygame.Rect(0,0,278,33))), sprite.oFrame(core.im_crop(exp_bgs, pygame.Rect(0,33,278,33))), sprite.oFrame(core.im_crop(exp_bgs, pygame.Rect(0,66,278,33))) ]] } } exp_bg.changeState("stopped") core.render_group.add(exp_bg) # initialize map core.level = map.oMap() # current stats level = 0 level_time = oStatsDisp(core.level.time, (700,20), useNumbers=True, formatValue=format_level_time) lives = oStatsDisp(3, (10, 20), image=core.load_image("haato.png", directory="gfx")) score = oStatsDisp(0, (0,20), xalign=0.5, useNumbers=True, formatValue=format_score) # main character mc = sprite.oSprite() mc_sprite = core.load_image("nozomi.png", directory="gfx") mc_mask = core.load_image("nozomi_mask.png", directory="gfx") mc.animFromStrip( mc_sprite, [ ["stopped","S",1,1,0,True, (23,45), (23,33)], ["stopped","W",4,1,0,True, (23,45), (17,33)], ["stopped","E",7,1,0,True, (23,45), (30,33)], ["stopped","N",10,1,0,True,(23,45), (23,33)], ["walking","S",0,3,.02,True, (23,45), (23,33)], ["walking","W",3,3,.02,True, (23,45), (17,33)], ["walking","E",6,3,.02,True, (23,45), (30,33)], ["walking","N",9,3,.02,True, (23,45), (23,33)], ["dying", "N",12,3,0.01,False, (23,45)] ], 48, 48, mc_mask ) mc.changeState("stopped") mc.AI = core.handlePlayerControls core.render_group.add(mc) available_attacks = [ featheratk.oDoubleAttack(core.load_image("double_feather.png", directory="gfx")), featheratk.oTriangleAttack(core.load_image("triangle_feather.png", directory="gfx")), featheratk.oCrossAttack(core.load_image("cross_feather.png", directory="gfx")) ] mc.attacks = [ featheratk.oBasicAttack(core.load_image("debug_feather.png", directory="gfx")) ] mc.use_attack = 0 # load map load_level(level, mc) killed_bugs = 0 lost_lives = 0 mid_rank = 0 rank_num = 0 forceUpdate = True while True: lag = core.clock.tick(core.MAX_FPS) if lag <= 0: lag = 1 level_time.update(level_time.value - lag/1000.0) if level_time.value < 0: main_char_death(mc) core.play_sound("mc_dying") lives.update(lives.value-1) lost_lives += 1 if core.handleEvents() == "quit": return dirty_rects = core.render_group.update(lag) core.level.updateNests(lag) exp_bg.animFrame = core.mathExp.state # check collisions # bugs if core.render_group.checkCollision(False, False, mc, core.baddys_group): main_char_death(mc) core.play_sound("mc_dying") lives.update(lives.value-1) lost_lives += 1 # pickups picked = core.pickup_group.checkCollision(False, False, mc, core.pickup_group) for pickup in picked: pickup = pickup[0] # new live :D if isinstance(pickup, sprite.oHeartSprite): core.play_sound("live_gain") lives.update(lives.value+1) pickup.die() # feather attacks kills = core.attack_group.checkCollision(False, False, None, core.baddys_group) score.update(score.value + 100*len(kills)) killed_bugs += len(kills) for i in kills: core.play_sound("bug_dying") if hasattr(i[0], "attackMgr"): feather, bug = i if hasattr(i[1], "attackMgr"): bug, feather = i feather.attackMgr.kills += 1 feather.die() bug.OnAnimationEnd = bug.die bug.direction = "N" bug.changeState("dying") if lives.value == 0 and mc.OnAnimationEnd is None: if rank_num == 0: _rank = 0 else: _rank = mid_rank / rank_num core.next_screen = core.curry(game_over, score.value, _rank) return # draw level / sprites core.screen.blit(sky_bg, (0,0)) dirty_rects.extend( core.level.draw(core.screen) ) core.render_group.draw(core.screen) # draw stats # lives dirty_rects.extend( lives.draw(core.screen) ) # math exp dirty_rects.extend( core.mathExp.draw(core.screen) ) # time dirty_rects.extend( level_time.draw(core.screen) ) # score dirty_rects.extend( score.draw(core.screen) ) # attacks for i, attack in enumerate(mc.attacks): attack.update(lag) dirty_rects.extend( attack.draw(core.screen, i == mc.use_attack) ) # dirty_rects.append( core.fonts.Draw(core.screen, None, 24, # str(core.clock.get_fps()), (650, 50), (255,255,255,255))) if forceUpdate: dirty_rects = None forceUpdate = False core.updateScreen(dirty_rects) # clear level =D if core.level.portalActive: _score, rank = level_clear_screen(mc, killed_bugs, level_time.value, lives.value, lost_lives, score.value) score.update(_score) mid_rank += rank rank_num += 1 lost_lives = 0 core.baddys_group.clear() core.attack_group.clear() level += 1 if not load_level(level, mc): core.next_screen = core.curry(game_ending, core.curry(hiscores_screen, score.value, mid_rank/rank_num)) return if available_attacks: new_attack = available_attacks.pop(0) feather_received(new_attack) mc.attacks.append( new_attack ) level_time.update(core.level.time) mc.changeState("stopped") for attack in mc.attacks: attack.freeze = 0 attack.used = 0 attack.kills = 0 attack.last_rects = [] forceUpdate = True
def level_clear_screen(mc, killed_bugs, ltime, lives, lost_lives, score): core.play_music("stage clear", queue=True) last_screen = core.screen.copy().convert() ls = last_screen.copy().convert() bg = core.load_image("stage_clear.png", directory="gfx") stars = core.load_image("rank_star.png", directory="gfx") stars = [ core.im_crop(stars, pygame.Rect(0,0,55,51)), core.im_crop(stars, pygame.Rect(55,0,55,51)) ] ltime = int(ltime) used_feathers, wasted_feathers, waste_penalty = getFeatherStats(mc) rank = getRank(mc, lost_lives, lives, ltime, killed_bugs) state = 0 skilled_bugs = oStatsDisp(0, (465,155), useNumbers=True, xalign=1.0, width=100, formatValue=format_level_time) stime = oStatsDisp(0, (465,190), useNumbers=True, xalign=1.0, width=100, formatValue=format_level_time) slives = oStatsDisp(0, (465,225), useNumbers=True, xalign=1.0, width=100, formatValue=format_level_time) sfeathers = oStatsDisp(0, (465,260), useNumbers=True, xalign=1.0, width=100, formatValue=format_level_time) stotal = oStatsDisp(score, (235,370), useNumbers=True, xalign=1.0, width=330, formatValue=format_score) last_total = score forceUpdate = True vel = .3 vel2 = 100 while True: lag = core.clock.tick(core.MAX_FPS) if lag <= 0: lag = 1 dirty_rects = [] if core.handleEvents() == "quit": exit() vel = 0.2 if Input.up(K_RETURN): if state < 8: vel = sys.maxint else: core.dissolve_transition(core.screen.copy().convert(), ls, 1000) return stotal.value, rank core.screen.blit(ls, (0,0)) core.screen.blit(bg, (0,0)) # points if state == 0: skilled_bugs.update( skilled_bugs.value + vel*lag ) if skilled_bugs.value >= killed_bugs: skilled_bugs.value = killed_bugs state += 1 elif state == 1: stime.update( stime.value + vel*lag ) if stime.value >= ltime: stime.value = ltime state += 1 elif state == 2: slives.update( slives.value + vel*lag ) if slives.value >= lives: slives.value = lives state += 1 elif state == 3: sfeathers.update( sfeathers.value + vel*lag ) if sfeathers.value >= wasted_feathers: sfeathers.value = wasted_feathers state += 1 elif state == 4: stotal.update( stotal.value + vel2*lag ) if stotal.value >= last_total + killed_bugs*10: stotal.value = last_total + killed_bugs*10 last_total = stotal.value state += 1 elif state == 5: stotal.update( stotal.value + vel2*lag ) if stotal.value >= last_total + ltime*100: stotal.value = last_total + ltime*100 last_total = stotal.value state += 1 elif state == 6: stotal.update( stotal.value + vel2*lag ) if stotal.value >= last_total + lives*1000: stotal.value = last_total + lives*1000 last_total = stotal.value state += 1 elif state == 7: stotal.update( stotal.value - vel2*lag ) if stotal.value <= last_total - waste_penalty: stotal.value = last_total - waste_penalty last_total = stotal.value state += 1 # draw dirty_rects.extend( skilled_bugs.draw(core.screen) ) if state > 0: dirty_rects.extend( stime.draw(core.screen) ) if state > 1: dirty_rects.extend( slives.draw(core.screen) ) if state > 2: dirty_rects.extend( sfeathers.draw(core.screen) ) if state > 3: dirty_rects.extend( stotal.draw(core.screen) ) if state > 7: def draw_rank_star(pos, rank_need): if rank >= rank_need: return core.screen.blit(stars[1], pos) else: return core.screen.blit(stars[0], pos) dirty_rects.append( draw_rank_star((405,430), 3) ) dirty_rects.append( draw_rank_star((460,430), 2) ) dirty_rects.append( draw_rank_star((515,430), 1) ) if last_screen is not None: core.dissolve_transition(last_screen, core.screen.copy().convert(), 1000) last_screen = None if forceUpdate: dirty_rects = None forceUpdate = False core.updateScreen(dirty_rects)
def hiscores_screen(score=None, rank=0): last_screen = core.screen.copy().convert() scores = [] import xdrlib if not os.path.exists("high_scores"): # fill with default scores default_scores = [(100000,2),(50000,2),(30000,2),(20000,2),(10000,2),(8000,1), (4000,1),(500,0)] for i in range(8): s, r = default_scores[i] scores.append( ("Nozomi", s, r) ) else: # load from file data = open("high_scores", "rb").read() loader = xdrlib.Unpacker(data) for i in range(8): scores.append( (loader.unpack_string(), loader.unpack_int(), loader.unpack_int()) ) # verify if we have a high score =D if score is not None: for index, _score in enumerate(scores): name, _score, _rank = _score if (score > _score) or (score == _score and rank > _rank): player_name = core.InputPrompt("Nice timing! You've scored high, Mr/Mrs...", "Player") scores.insert(index, (player_name, score, rank)) break # save scores p = xdrlib.Packer() for name, score, rank in scores: p.pack_string(name) p.pack_int(score) p.pack_int(rank) f = open("high_scores", "wb") f.write(p.get_buffer()) f.close() # load graphics =D bg = core.load_image("hiscores.png", directory="gfx") stars = pygame.transform.smoothscale(core.load_image("rank_star.png", directory="gfx"), (86,40)) stars = [ core.im_crop(stars, pygame.Rect(0,0,43,40)), core.im_crop(stars, pygame.Rect(43,0,43,40)) ] core.screen.blit(bg, (0,0)) # render high scores! for index, score in enumerate(scores): name, score, rank = score # 260, 100 y = 100 + 40*index # name core.fonts.Draw(core.screen, None, 36, name, pygame.Rect(260,y,200,40), (255,255,255,255),alignVert='center',antialias=True) # points score = str(score) w = 160-core.numbers.getWidth(score) core.numbers.draw(core.screen, (470+w,y+8), score) # rank if rank > 2: core.screen.blit(stars[1], (660,y)) else: core.screen.blit(stars[0], (660,y)) if rank > 1: core.screen.blit(stars[1], (703,y)) else: core.screen.blit(stars[0], (703,y)) if rank > 0: core.screen.blit(stars[1], (746,y)) else: core.screen.blit(stars[0], (746,y)) core.dissolve_transition(last_screen, core.screen.copy().convert(), 1000) while True: events = pygame.event.get() if core.handleEvents(events) == "quit": exit() for event in events: if event.type == KEYUP: core.next_screen = main_menu core.play_sound("button_click") Input.update() return
def getButtonImage(surface, button): y = button * 40 inactive = core.im_crop(surface, pygame.Rect(0, y, 200, 40)) active = core.im_crop(surface, pygame.Rect(200, y, 200, 40)) return active, inactive
def initialize(self, image, charset, margins): self.width = image.get_width() / len(charset) self.height = image.get_height() for char in charset: offx, width = margins.pop(0) self.charset[char] = core.im_crop(image, pygame.Rect(offx, 0, width, self.height))