def create_arrow(arrow_list, arrow_dir, drctn, hero, sprite_layers): # shooting arrow after pressing 'w' # append arrows in a list if (drctn == 'right'): arrow_list.append( person.create_person((hero.rect.centerx) + 64, hero.rect.centery, './images/attack4_3.png')) arrow_dir.append(1) arrow_dir.append(0) elif (drctn == 'left'): arrow_list.append( person.create_person((hero.rect.centerx) - 64, hero.rect.centery, './images/attack4_1.png')) arrow_dir.append(-1) arrow_dir.append(0) elif (drctn == 'up'): arrow_list.append( person.create_person(hero.rect.centerx, (hero.rect.centery) - 64, './images/attack4_2.png')) arrow_dir.append(0) arrow_dir.append(-1) elif (drctn == 'down'): arrow_list.append( person.create_person(hero.rect.centerx, (hero.rect.centery) + 64, './images/attack4_4.png')) arrow_dir.append(0) arrow_dir.append(1) sprite_layers[1].add_sprite(arrow_list[len(arrow_list) - 1])
def remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart): i = 0 l = len(enm) while(i<l and i>=0): if HP_ENM[i] <= 0: savegame=pk.load(open("./save.p","rb")) savegame['xp']+=10 pk.dump(savegame,open("./save.p","wb")) if 0<random.randint(0,100)<40: # random function to decide if enemy leaves heart (which increases hp of hero) heart.append(person.create_person(enm[i].rect.centerx,enm[i].rect.centery-((dy_enm[i])*32),'./images/heart.png')) sprite_layers[1].add_sprite(heart[(len(heart))-1]) elif 40<= random.randint(0,100)<100: # random function to decide if enemy leaves gold gold.append(person.create_person(enm[i].rect.centerx,enm[i].rect.centery-((dy_enm[i])*32),'./images/gold.png')) sprite_layers[1].add_sprite(gold[(len(gold))-1]) sprite_layers[1].remove_sprite(enm[i]) enm.pop(i) HP_ENM.pop(i) dx_enm.pop(i) right_enm.pop(i) left_enm.pop(i) dy_enm.pop(i) else: i +=1 l = len(enm)
def remove_enm(HP_ENM, enm, dx_enm, right_enm, left_enm, dy_enm, sprite_layers, gold, heart): i = 0 l = len(enm) while (i < l and i >= 0): if HP_ENM[i] <= 0: savegame = pk.load(open("./save.p", "rb")) savegame['xp'] += 10 pk.dump(savegame, open("./save.p", "wb")) if 0 < random.randint(0, 100) < 40: # random function to decide if enemy leaves heart (which increases hp of hero) heart.append( person.create_person( enm[i].rect.centerx, enm[i].rect.centery - ((dy_enm[i]) * 32), './images/heart.png')) sprite_layers[1].add_sprite(heart[(len(heart)) - 1]) elif 40 <= random.randint(0, 100) < 100: # random function to decide if enemy leaves gold gold.append( person.create_person( enm[i].rect.centerx, enm[i].rect.centery - ((dy_enm[i]) * 32), './images/gold.png')) sprite_layers[1].add_sprite(gold[(len(gold)) - 1]) sprite_layers[1].remove_sprite(enm[i]) enm.pop(i) HP_ENM.pop(i) dx_enm.pop(i) right_enm.pop(i) left_enm.pop(i) dy_enm.pop(i) else: i += 1 l = len(enm)
def create_weapons(weap_list,sprite_layers,enm,weap_dir,dy_enm,number): i = 0 for i in range(len(enm)): rand_attack = random.randint(0,500) if 0<= rand_attack <25: w = weap_type(number) if w==1: weap_list.append(person.create_person(enm[i].rect.centerx,(enm[i].rect.centery)+((dy_enm[i])*64),'./images/attack9.png')) else: weap_list.append(person.create_person(enm[i].rect.centerx,(enm[i].rect.centery)+((dy_enm[i])*64),'./images/attack2.png')) sprite_layers[2].add_sprite(weap_list[len(weap_list)-1]) weap_dir.append(0) weap_dir.append(dy_enm[i])
def create_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos): sv = pk.load(open("./save.p", "rb")) hp_max = sv['max_hp'] hp = hp_max #scaling down the hp image according to current hit points(hp) w.r.t. max hp c_hp = hp / hp_max * 99 c_hp = int(c_hp) if (c_hp) > 0: test_image = "./images/hp_bar.png" original = Image.open(test_image) # Get dimensions of original picture width, height = original.size left = 0 top = 0 #giving the length as required right = c_hp bottom = height #crooing and saving the image cropped_example = original.crop((left, top, right, bottom)) cropped_example.save('./images/test_hp.png') #creating the sprite, adding it and then rendering the screen c_hp_sprite = person.create_person(c_pos[0] - 450, c_pos[1] - 380, './images/test_hp.png') sprite_layers[2].add_sprite(c_hp_sprite) shifty1.render_update(renderer, sprite_layers, screen) pk.dump(sv, open("./save.p", "wb")) return [c_hp_sprite, hp]
def create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos): sv=pk.load(open("./save.p","rb")) hp_max=sv['max_hp'] hp=hp_max #scaling down the hp image according to current hit points(hp) w.r.t. max hp c_hp = hp/hp_max * 99 c_hp=int(c_hp) if (c_hp)>0: test_image = "./images/hp_bar.png" original = Image.open(test_image) # Get dimensions of original picture width, height = original.size left = 0 top = 0 #giving the length as required right = c_hp bottom = height #crooing and saving the image cropped_example = original.crop((left, top, right, bottom)) cropped_example.save('./images/test_hp.png') #creating the sprite, adding it and then rendering the screen c_hp_sprite=person.create_person(c_pos[0]-450,c_pos[1]-380,'./images/test_hp.png') sprite_layers[2].add_sprite(c_hp_sprite) shifty1.render_update(renderer,sprite_layers,screen) pk.dump(sv,open("./save.p","wb")) return [c_hp_sprite,hp]
def create_interface(renderer, sprite_layers, screen, c_pos): interface = person.create_person(c_pos[0] - 512, c_pos[1] - 384, './images/interface1.png') sprite_layers[1].add_sprite(interface) shifty1.render_update(renderer, sprite_layers, screen) return interface
def create_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos): sv = pk.load(open("./save.p", "rb")) xp = float(sv['xp']) xp_max = float(h(sv['h_level'])) c_xp = xp / xp_max * 99 c_xp = int(c_xp) #If xp is the image lenght will be zero and then it will be out of range and give error #so c_xp is made 1 [not the xp] if c_xp == 0: c_xp = 1 test_image = "./images/exp_bar.png" original = Image.open(test_image) width, height = original.size left = 0 top = 0 right = c_xp bottom = height cropped_example = original.crop((left, top, right, bottom)) cropped_example.save('./images/test_xp.png') sprite_layers[2].remove_sprite(xp_sprite) c_xp_sprite = person.create_person(c_pos[0] - 400, c_pos[1] - 325, './images/test_xp.png') sprite_layers[2].add_sprite(c_xp_sprite) shifty1.render_update(renderer, sprite_layers, screen) pk.dump(sv, open("./save.p", "wb")) return c_xp_sprite
def create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos): sv=pk.load(open("./save.p","rb")) xp=float(sv['xp']) xp_max=float(h(sv['h_level'])) c_xp = xp/xp_max * 99 c_xp=int(c_xp) #If xp is the image lenght will be zero and then it will be out of range and give error #so c_xp is made 1 [not the xp] if c_xp==0: c_xp=1 test_image = "./images/exp_bar.png" original = Image.open(test_image) width, height = original.size left = 0 top = 0 right = c_xp bottom = height cropped_example = original.crop((left, top, right, bottom)) cropped_example.save('./images/test_xp.png') sprite_layers[2].remove_sprite(xp_sprite) c_xp_sprite=person.create_person(c_pos[0]-400,c_pos[1]-325,'./images/test_xp.png') sprite_layers[2].add_sprite(c_xp_sprite) shifty1.render_update(renderer,sprite_layers,screen) pk.dump(sv,open("./save.p","wb")) return c_xp_sprite
def create_specialarrow(specialarrow_list,specialarrow_dir,drctn,hero,sprite_layers): # shooting arrow after pressing 'w' # append arrows in a list if(drctn=='right'): specialarrow_list.append(person.create_person((hero.rect.centerx)+64,hero.rect.centery,'./images/specialarrow_1.png')) specialarrow_dir.append(1) specialarrow_dir.append(0) elif(drctn=='left'): specialarrow_list.append(person.create_person((hero.rect.centerx)-64,hero.rect.centery,'./images/specialarrow_2.png')) specialarrow_dir.append(-1) specialarrow_dir.append(0) elif(drctn=='up'): specialarrow_list.append(person.create_person(hero.rect.centerx,(hero.rect.centery)-64,'./images/specialarrow_3.png')) specialarrow_dir.append(0) specialarrow_dir.append(-1) elif(drctn=='down'): specialarrow_list.append(person.create_person(hero.rect.centerx,(hero.rect.centery)+64,'./images/specialarrow_4.png')) specialarrow_dir.append(0) specialarrow_dir.append(1) sprite_layers[1].add_sprite(specialarrow_list[len(specialarrow_list)-1])
def create_weapons(weap_list, sprite_layers, enm, weap_dir, dy_enm, number): i = 0 for i in range(len(enm)): rand_attack = random.randint(0, 500) if 0 <= rand_attack < 25: w = weap_type(number) if w == 1: weap_list.append( person.create_person(enm[i].rect.centerx, (enm[i].rect.centery) + ((dy_enm[i]) * 64), './images/attack9.png')) else: weap_list.append( person.create_person(enm[i].rect.centerx, (enm[i].rect.centery) + ((dy_enm[i]) * 64), './images/attack2.png')) sprite_layers[2].add_sprite(weap_list[len(weap_list) - 1]) weap_dir.append(0) weap_dir.append(dy_enm[i])
def create_dragon_hp(renderer,sprite_layers,screen,dhp_sprite,c_pos,dhp): c_dhp = (dhp[0]* 400)/100 c_dhp=int(c_dhp) if c_dhp==0: c_dhp=1 test_image = "./images/dragon_health.png" original = Image.open(test_image) width, height = original.size left = 0 top = 0 right = c_dhp bottom = height cropped_example = original.crop((left, top, right, bottom)) cropped_example.save('./images/test_dhp.png') sprite_layers[2].remove_sprite(dhp_sprite) c_dhp_sprite=person.create_person(c_pos[0]-400,c_pos[1],'./images/test_dhp.png') sprite_layers[2].add_sprite(c_dhp_sprite) shifty1.render_update(renderer,sprite_layers,screen) return c_dhp_sprite
def create_dragon_hp(renderer, sprite_layers, screen, dhp_sprite, c_pos, dhp): c_dhp = (dhp[0] * 400) / 100 c_dhp = int(c_dhp) if c_dhp == 0: c_dhp = 1 test_image = "./images/dragon_health.png" original = Image.open(test_image) width, height = original.size left = 0 top = 0 right = c_dhp bottom = height cropped_example = original.crop((left, top, right, bottom)) cropped_example.save('./images/test_dhp.png') sprite_layers[2].remove_sprite(dhp_sprite) c_dhp_sprite = person.create_person(c_pos[0] - 400, c_pos[1], './images/test_dhp.png') sprite_layers[2].add_sprite(c_dhp_sprite) shifty1.render_update(renderer, sprite_layers, screen) return c_dhp_sprite
def demo_pygame(file_name,frm): #portal portal=False # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() #background music mountain_top_sound = sound.create_music(file_name) sound.volume(mountain_top_sound,0.1) # create hero hero_pos_x = 3*32 hero_pos_y = 17*32 hero = person.create_person(hero_pos_x, hero_pos_y,'./images/hero_u2.png') # create enemy sprites enm = [] enm.append(person.create_person(19*32, 8*32,'./images/s1.png')) enm.append(person.create_person(19*32, 22*32,'./images/s2.png')) enm.append(person.create_person(24*32, 11*32,'./images/s1.png')) enm.append(person.create_person(26*32, 19*32,'./images/s2.png')) lizard = person.create_person(12*32, 22*32,'./images/lizard.png') # create the rectangle for portal portal1=pygame.Rect(16*32,3*32,3*32,1*32) # cam_offset is for scrolling cam_world_pos_x = 516 cam_world_pos_y = 404 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero and enemies the the right layer sprite_layers[1].add_sprite(hero) # variables for the main loop clock = pygame.time.Clock() running = True # to run while loop speed = 5 # hero speed mr=ml=md=mu=0 # image variables(change images to show movements of hero) flag_lizard = 0 # a variable to check when to add crab's sprite tic_flag = 0 drctn='down' # direction where hero facing right now life = 1 # to keep track wheather hero is alive or not dx_enm = [-1,1,1,-1] # list of direction in x of enemies dy_enm = [1,-1,1,-1] # list of direction in y of enemies left_enm = [15*32,16*32,21*32,23*32] # left collision coordinate for enemies(after which it will return back) right_enm = [21*32,23*32,26*32,29*32] # right collision coordinate for enemies(after which it will return back) weap_dir = [] # directions of weapons weap_list = [] # contains a list of weapons (currently on screen) arrow_list = [] # contains a list of arrows (currently on screen) arrow_dir = [] # directions of arrows gold = [] # contains a list of gold (currently on screen) heart = [] # contains a list of heart (currently on screen) flag_enm = 0 point_weapon = 1.0 # decrease in health of hero when weapon of enemy collides with hero point_arrow = 15.0 # decrease in health of enemy when arrow of hero collides with enemy lizard_attack = 10.0 # attack of lizard point_heal = 10.0 # increase in health after healing HP_LIZARD = 30.0 # health of lizard gold_increase = 5 gold_increase = 5 # increase in health of hero after getting gold heart_increase = 5.0 # increase in health of hero after getting heart speed_enm = 6 # speed of enemy HP_ENM = [100.0,100.0,100.0,100.0] # health of enemies hero_attack = 10 # hero attack defense_hero = 5 # hero defense #old variables to restore if hero dies in this map savegame=pk.load(open("save.p","rb")) old_xp = savegame['xp'] old_level = savegame['h_level'] old_gold = savegame['gold'] old_armor = savegame['sheild_hp'] old_arrow = savegame['arrow_count'] # interface code c_pos=[cam_world_pos_x, cam_world_pos_y] interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') # hp bar interface l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) # level and gold interface [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos) xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') # xp interface xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos) # arrow,armor,sword interface f_i=menu.create_f_i(renderer,sprite_layers,screen,c_pos) # arrow,armor,sword interface interf_fight=menu.create_interface_fight(renderer,sprite_layers,screen,c_pos) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) # mainloop while running: dt = clock.tick() savegame=pk.load(open("./save.p","rb")) #set coordinates on which turn based fighting appears if(hero_pos_x > 5*32 and flag_lizard == 0): flag_lizard = 1 elif (hero_pos_x > 16*32 and flag_enm == 0): flag_enm = 1 # event handling for event in pygame.event.get(): if (event.type == pygame.QUIT or portal == True): running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_w and ['arrow_count'] > 0 and flag_enm == 2: enemy_attack.create_arrow(arrow_list,arrow_dir,drctn,hero,sprite_layers) # create arrow on pressing 'w' enemy_attack.remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart) # remove enemy sprite if health bacomes zero savegame['arrow_count'] -=1 # decrease the arrow count and update in the dictionary pk.dump(savegame,open("./save.p","wb")) # save the changes of dictionary elif event.key == pygame.K_a: # attack with sword on pressing 'a' enemy_attack.attack(drctn,hero,enm,HP_ENM) enemy_attack.remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart) # remove enemy sprite if health bacomes zero # interface update menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) menu.update_f_i(f_i,c_pos) # add lizard sprite for turn based fighting if(flag_lizard == 1): sprite_layers[1].add_sprite(lizard) flag_lizard = 2 (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) # loop for turn based fighting until lizard doesn't die while(HP_LIZARD > 0 and flag_lizard==2 ): for event in pygame.event.get(): # heal on pressing 'h' if event.type == pygame.KEYDOWN and event.key == pygame.K_h and tic_flag==0: heal_sound = sound.create_soundfx('./sounds/heal.ogg') sound.volume(heal_sound,0.4) heal = person.create_person(hero.rect.centerx,hero.rect.top+11,'./images/heal_1.png') # create the heal sprite sprite_layers[2].add_sprite(heal) # add the sprite to the right layer savegame['hp'] += point_heal # increase the health and upadte in the dictionary if savegame['hp'] > savegame['max_hp']: savegame['hp'] = savegame['max_hp'] pk.dump(savegame,open("./save.p","wb")) # save the changes in dictionary # interface update menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) # image update while tic_flag<=13: heal.image=pygame.image.load('./images/heal_1.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) heal.image=pygame.image.load('./images/heal_2.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) heal.image=pygame.image.load('./images/heal_3.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) tic_flag += 1 tic_flag = 25 # remove the heal sprite sprite_layers[2].remove_sprite(heal) # rendering (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) elif event.type == pygame.KEYDOWN and event.key == pygame.K_a and tic_flag==0: # hero attacks on pressing 'a' sword_sound = sound.create_soundfx('./sounds/sword.ogg') sound.volume(sword_sound,0.4) var_attack_hero = random.randint(hero_attack-2.0, hero_attack+2.0) HP_LIZARD -= var_attack_hero # lizard's health decreases enemy_attack.create_score(var_attack_hero) # lizard's image changes after hero attacks lizard.image=pygame.image.load('./images/lizard_1.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) lizard.image=pygame.image.load('./images/lizard_2.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) lizard.image=pygame.image.load('./images/lizard_3.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) # create the score sprite and add it score = person.create_person(16*32,17*32,'./images/sample-out.png') sprite_layers[1].add_sprite(score) while(tic_flag<25): score.rect.centery -= 2 tic_flag += 1 if(tic_flag == 25): sprite_layers[1].remove_sprite(score) (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) lizard.image=pygame.image.load('./images/lizard.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) if tic_flag == 25: pygame.time.delay(1000) # lizard attacks var_attack_lizard = random.randint(lizard_attack-2.0,lizard_attack+2.0) var_defense_hero = random.randint(defense_hero-3.0,defense_hero) sh = (var_attack_lizard - var_defense_hero) if sh<0 : sh = 0 enemy_attack.create_score(sh) savegame['hp'] -= (sh) pk.dump(savegame,open("./save.p","wb")) # lizard's image changes when it attacks shine = 0 while shine < 10 : lizard.image=pygame.image.load('./images/lizard(1).png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) lizard.image=pygame.image.load('./images/lizard.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) shine += 1 turnbase_sound = sound.create_soundfx('./sounds/turnbase_touch.ogg') sound.volume(turnbase_sound,0.4) # interface update menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) # create the score sprite and add it score = person.create_person(hero_pos_x-32,hero_pos_y-32,'./images/sample-out.png') sprite_layers[1].add_sprite(score) while(tic_flag>0): score.rect.centery += 2 tic_flag -= 1 if(tic_flag == 0): sprite_layers[1].remove_sprite(score) (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) # if lizard's HP is zero then remove its sprite if(HP_LIZARD <= 0) : sprite_layers[1].remove_sprite(lizard) HP_LIZARD = 10000.0 flag_lizard = 3 # increase the xp of player after killing the lizard if(flag_lizard == 3): savegame=pk.load(open("./save.p","rb")) savegame['xp'] +=20 pk.dump(savegame,open("./save.p","wb")) flag_lizard = 4 # add enemies after a particular coordinate if flag_enm == 1: i = 0 for i in range(len(enm)): sprite_layers[1].add_sprite(enm[i]) flag_enm = 2 # calling hero_move() function for hero's movements mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[3]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # to detect the direction of hero if(mu>1): drctn='up' elif(mr>1): drctn='right' elif(md>1): drctn='down' elif(ml>1): drctn='left' if flag_enm == 2: enemy_attack.create_weapons(weap_list,sprite_layers,enm,weap_dir,dy_enm,0) # create the weapons enemy_attack.move_enemy(enm,right_enm,left_enm,dx_enm,speed_enm) # random movement of enemy enemy_attack.remove_arrow(arrow_list,enm,HP_ENM,arrow_dir,sprite_layers,point_arrow) # remove arrow if it goes out of the screen enemy_attack.remove_weapon(hero,enm,weap_list,weap_dir,point_weapon,sprite_layers) # remove weapon enemy_attack.remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart) # remove enemy if health of enemy becomes zero i = 0 l = len(gold) # if hero collides with gold sprite then increase the gold count and remove the sprite while(i>=0 and i<l): if pygame.sprite.collide_rect(hero,gold[i]): savegame=pk.load(open("./save.p","rb")) savegame['gold'] += gold_increase pk.dump(savegame,open("./save.p","wb")) gold_sound = sound.create_soundfx('./sounds/gold_heart.ogg') sound.volume(gold_sound,0.3) sprite_layers[1].remove_sprite(gold[i]) gold.pop(i) else: i+= 1 l = len(gold) i = 0 l = len(heart) # if hero collides with heart sprite then increase the hp and remove the sprite while(i>=0 and i<l): if pygame.sprite.collide_rect(hero,heart[i]): savegame=pk.load(open("./save.p","rb")) savegame['hp'] += heart_increase if savegame['hp'] > savegame['max_hp']: savegame['hp'] = savegame['max_hp'] pk.dump(savegame,open("./save.p","wb")) heart_sound = sound.create_soundfx('./sounds/gold_heart.ogg') sound.volume(heart_sound,0.3) sprite_layers[1].remove_sprite(heart[i]) heart.pop(i) else: i+= 1 l = len(heart) if savegame['hp'] <= 0: # game starts again if player dies sound.stop_soundfx(mountain_top_sound) savegame['xp'] = old_xp savegame['h_level'] = old_level savegame['gold'] = old_gold savegame['sheild_hp'] = old_armor savegame['arrow_count'] = old_arrow savegame['hp'] = savegame['max_hp'] pk.dump(savegame,open("./save.p","wb")) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) life = 0 running = False elif len(enm)==0 and len(heart)==0 and len(gold)==0 and HP_LIZARD==10000.0: # another map starts l = len(weap_list) while(i>=0 and i<l): sprite_layers[2].remove_sprite(weap_list[i]) weap_list.pop(i) l = len(enm) i = 0 l = len(arrow_list) while(i>=0 and i<l): sprite_layers[1].remove_sprite(arrow_list[i]) arrow_list.pop(i) l = len(arrow_list) sound.stop_soundfx(mountain_top_sound) render_update(renderer,sprite_layers,screen) portal=True # adjust camera according to the hero's position, follow him cam_pos_x = hero.rect.centerx cam_pos_y = hero.rect.centery if hero.rect.centerx <= 516 : cam_pos_x = 516 elif hero.rect.centerx >=766: cam_pos_x = 766 if hero.rect.centery <=404: cam_pos_y = 404 elif hero.rect.centery >=570: cam_pos_y = 570 renderer.set_camera_position(cam_pos_x,cam_pos_y) # adjust camera according to the hero's position, follow him c_pos=(cam_pos_x,cam_pos_y) interface.rect.topleft=(c_pos[0]-512,c_pos[1]-384) hp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-382) xp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-345) l_g.rect.topleft=(c_pos[0]-508,c_pos[1]-381) f_i.rect.bottomright=(c_pos[0]+500,c_pos[1]+350) interf_fight.rect.bottomright=(c_pos[0]+512,c_pos[1]+380) # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) if life == 0: demo_pygame('./maps/mountain_top.tmx',0) elif portal==True: pal_lava.main()
def demo_pygame(file_name,frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() #background music tunnel3_sound = sound.create_music(file_name) sound.volume(tunnel3_sound,0.1) # create hero,enemy sprites hero_pos_x = 12*32 hero_pos_y = 3*32 hero = person.create_person(hero_pos_x, hero_pos_y,'./images/hero_u2.png') # create enemy,crabs and ring sprites enm1 = person.create_person(6*32, 22*32,'./images/slime_d1.png') enm2 = person.create_person(16*32, 22*32,'./images/slime_d1.png') crab = person.create_person(30*32, 38*32,'./images/crab.png') crab1 = person.create_person(49*32, 38*32,'./images/crab.png') ring = person.create_person(49*32, 33*32,'./images/ring.png') # cam_offset is for scrolling cam_world_pos_x = screen_width cam_world_pos_y = screen_height # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero and enemies to the right layer sprite_layers[1].add_sprite(hero) sprite_layers[1].add_sprite(enm1) sprite_layers[1].add_sprite(enm2) # variables for the main loop clock = pygame.time.Clock() running = True # to run while loop speed = 7 # hero speed mr=ml=md=mu=0 # image variables(change images to show movements of hero) flag_crab = 0 # a variable to check when to add crab's sprite drctn='down' # direction where hero facing right now life = 1 # to keep track wheather hero is alive or not enm =[enm1,enm2] # list of enemy sprites dx_enm = [1,1] # list of direction in x of enemies dy_enm = [-1,-1] # list of direction in y of enemies left_enm = [1*32,9*32] # left collision coordinate for enemies(after which it will return back) right_enm = [12*32,21*32] # right collision coordinate for enemies(after which it will return back) weap_dir = [] # directions of weapons weap_list = [] # contains a list of weapons (currently on screen) arrow_list = [] # contains a list of arrows (currently on screen) arrow_dir = [] # directions of arrows # contains a list of enemy images enmimages = ['./images/slime_d1.png','./images/slime_d2.png','./images/slime_d3.png','./images/slime_u1.png','./images/slime_u2.png','./images/slime_u3.png'] gold = [] # contains a list of gold (currently on screen) heart = [] # contains a list of heart (currently on screen) image_variable = [0,0] flag_ring = 0 tic_flag = 0 x = 0 portal1 = pygame.Rect(58*32,28*32,2*32,8*32) portal=False point_weapon = 2.0 # decrease in health of hero when weapon of enemy collides with hero point_arrow = 15.0 # decrease in health of enemy when arrow of hero collides with enemy crab_attack = 10.0 # attack of crab point_heal = 20.0 # increase in health after healing HP_CRAB = 30.0 # health of crab gold_increase = 5 # increase in health of hero after getting gold heart_increase = 5.0 # increase in health of hero after getting heart speed_enm = 6 # speed of enemy HP_ENM = [100.0,100.0] # health of enemies hero_attack = 10 # hero attack defense_hero = 5 # hero defense #old variables to restore if hero dies in this map savegame=pk.load(open("./save.p","rb")) old_xp = savegame['xp'] old_level = savegame['h_level'] old_gold = savegame['gold'] old_armor = savegame['sheild_hp'] old_arrow = savegame['arrow_count'] # interface code c_pos=[cam_world_pos_x, cam_world_pos_y] interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') # hp bar interface l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) # level and gold interface [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos) xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') # xp interface xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos) f_i=menu.create_f_i(renderer,sprite_layers,screen,c_pos) # arrow,armor,sword interface interf_fight=menu.create_interface_fight(renderer,sprite_layers,screen,c_pos) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) # mainloop while running: dt = clock.tick(50) savegame=pk.load(open("./save.p","rb")) #set coordinates on which turn based fighting appears if(hero_pos_x > 24*32 and flag_crab == 0 and len(enm)==0): flag_crab = 1 if(hero_pos_x > 43*32 and flag_crab == 2): flag_crab = 3 # event handling for event in pygame.event.get(): if (event.type == pygame.QUIT): running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_w and savegame['arrow_count'] > 0: enemy_attack.create_arrow(arrow_list,arrow_dir,drctn,hero,sprite_layers) # create arrow on pressing 'w' enemy_attack.remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart) # remove enemy sprite if health bacomes zero savegame['arrow_count'] -=1 # decrease the arrow count and update in the dictionary pk.dump(savegame,open("./save.p","wb")) # save the changes of dictionary elif event.key == pygame.K_a: # attack with sword on pressing 'a' enemy_attack.attack(drctn,hero,enm,HP_ENM) enemy_attack.remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart) # remove enemy sprite if health bacomes zero # interface update menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) menu.update_f_i(f_i,c_pos) # if one enemy dies then other enemy's walking area increases(other enemy covers the region of previous enemy) if len(enm)==1: right_enm[0] = 19*32 left_enm[0] = 2*32 # add crab sprite for turn based fighting if(flag_crab == 1): sprite_layers[1].add_sprite(crab) flag_crab = 2 x = 35 (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) elif(flag_crab == 3): crab = crab1 x = 54 sprite_layers[1].add_sprite(crab) HP_CRAB = 30.0 flag_crab = 4 (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) # loop for turn based fighting until crab doesn't die while(HP_CRAB > 0 and (flag_crab==2 or flag_crab==4)): for event in pygame.event.get(): # heal on pressing 'h' if event.type == pygame.KEYDOWN and event.key == pygame.K_h and tic_flag==0: heal_sound = sound.create_soundfx('./sounds/heal.ogg') sound.volume(heal_sound,0.4) heal = person.create_person(hero.rect.centerx,hero.rect.top+11,'./images/heal_1.png') # create the heal sprite sprite_layers[2].add_sprite(heal) # add the sprite to the right layer savegame['hp'] += point_heal # increase the health and upadte in the dictionary if savegame['hp'] > savegame['max_hp']: savegame['hp'] = savegame['max_hp'] pk.dump(savegame,open("./save.p","wb")) # save the changes in dictionary # interface update menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) # image update while tic_flag<=13: heal.image=pygame.image.load('./images/heal_1.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) heal.image=pygame.image.load('./images/heal_2.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) heal.image=pygame.image.load('./images/heal_3.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) tic_flag += 1 tic_flag = 25 # remove the heal sprite sprite_layers[2].remove_sprite(heal) # rendering (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) elif event.type == pygame.KEYDOWN and event.key == pygame.K_a and tic_flag==0: # hero attacks on pressing 'a' sword_sound = sound.create_soundfx('./sounds/sword.ogg') sound.volume(sword_sound,0.4) var_attack_hero = random.randint(hero_attack-2.0, hero_attack+2.0) HP_CRAB -= var_attack_hero # crab's health decreases enemy_attack.create_score(var_attack_hero) # crab's image changes after hero attacks crab.image=pygame.image.load('./images/crab_1.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) crab.image=pygame.image.load('./images/crab_2.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) crab.image=pygame.image.load('./images/crab_3.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) crab.image=pygame.image.load('./images/crab_3.png') # create the score sprite and add it score = person.create_person(x*32,32*32,'./images/sample-out.png') sprite_layers[1].add_sprite(score) while(tic_flag<25): score.rect.centery -= 2 tic_flag += 1 if(tic_flag == 25): sprite_layers[1].remove_sprite(score) (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) crab.image=pygame.image.load('./images/crab.png') if tic_flag == 25: pygame.time.delay(1000) # crab attacks var_attack_crab = random.randint(crab_attack-2.0,crab_attack+2.0) var_defense_hero = random.randint(defense_hero-3.0,defense_hero) sh = (var_attack_crab - var_defense_hero) if sh<0 : sh = 0 enemy_attack.create_score(sh) savegame['hp'] -= (sh) pk.dump(savegame,open("./save.p","wb")) # crab's image changes when it attacks shine = 0 while shine < 10 : crab.image=pygame.image.load('./images/crab(1).png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) crab.image=pygame.image.load('./images/crab.png') (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) shine += 1 turnbase_sound = sound.create_soundfx('./sounds/turnbase_touch.ogg') sound.volume(turnbase_sound,0.4) # interface update menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) # create the score sprite and add it score = person.create_person(hero_pos_x-32,hero_pos_y-32,'./images/sample-out.png') sprite_layers[1].add_sprite(score) while(tic_flag>0): score.rect.centery += 2 tic_flag -= 1 if(tic_flag == 0): sprite_layers[1].remove_sprite(score) (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) # if crab's HP is zero then remove its sprite if(HP_CRAB <= 0) : sprite_layers[1].remove_sprite(crab) # add the ring sprite when second crab dies if(x==54): sprite_layers[1].add_sprite(ring) # increase the xp of player after killing the crab if(x==35 or x==54): savegame['xp'] +=15 pk.dump(savegame,open("./save.p","wb")) x = 30 # remove sprite when hero collides ring if pygame.sprite.collide_rect(hero,ring) and flag_ring!=1: ring_sound = sound.create_soundfx('./sounds/gold_heart.ogg') sound.volume(ring_sound,0.5) sprite_layers[1].remove_sprite(ring) flag_ring = 1 ring_take=person.create_person(hero.rect.centerx,hero.rect.centery+200,'./images/ring_take.png') sprite_layers[2].add_sprite(ring_take) (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) i=0 while(i!=1): # Infinite loop until menu is to be removed for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i=1 continue sprite_layers[2].remove_sprite(ring_take) # calling hero_move() function for hero's movements mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[3]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # to detect the direction of hero if(mu>1): drctn='up' elif(mr>1): drctn='right' elif(md>1): drctn='down' elif(ml>1): drctn='left' enemy_attack.create_weapons(weap_list,sprite_layers,enm,weap_dir,dy_enm,0) # create the weapons enemy_attack.move_enemy(enm,right_enm,left_enm,dx_enm,speed_enm) # random movement of enemy enemy_attack.dir_update(enm,hero,dy_enm) # direction update of enemy enemy_attack.image_update(enm,image_variable,dy_enm,enmimages) # image update of enemy enemy_attack.remove_arrow(arrow_list,enm,HP_ENM,arrow_dir,sprite_layers,point_arrow) # remove arrow if it goes out of the screen enemy_attack.remove_enm(HP_ENM,enm,dx_enm,right_enm,left_enm,dy_enm,sprite_layers,gold,heart) # remove enemy if health of enemy becomes zero enemy_attack.remove_weapon(hero,enm,weap_list,weap_dir,point_weapon,sprite_layers) # remove weapon # interface update menu.update_f_i(f_i,c_pos) i = 0 l = len(gold) # if hero collides with gold sprite then increase the gold count and remove the sprite while(i>=0 and i<l): if pygame.sprite.collide_rect(hero,gold[i]): savegame=pk.load(open("./save.p","rb")) savegame['gold'] += gold_increase pk.dump(savegame,open("./save.p","wb")) gold_sound = sound.create_soundfx('./sounds/gold_heart.ogg') sound.volume(gold_sound,0.3) sprite_layers[1].remove_sprite(gold[i]) gold.pop(i) else: i+= 1 l = len(gold) # if hero collides with heart sprite then increase the hp and remove the sprite i = 0 l = len(heart) while(i>=0 and i<l): if pygame.sprite.collide_rect(hero,heart[i]): savegame=pk.load(open("./save.p","rb")) savegame['hp'] += heart_increase if savegame['hp'] > savegame['max_hp']: savegame['hp'] = savegame['max_hp'] pk.dump(savegame,open("./save.p","wb")) heart_sound = sound.create_soundfx('./sounds/gold_heart.ogg') sound.volume(heart_sound,0.3) sprite_layers[1].remove_sprite(heart[i]) heart.pop(i) else: i+= 1 l = len(heart) # game starts again if player dies if savegame['hp'] <= 0: sound.stop_soundfx(tunnel3_sound) savegame['xp'] = old_xp savegame['h_level'] = old_level savegame['gold'] = old_gold savegame['sheild_hp'] = old_armor savegame['arrow_count'] = old_arrow savegame['hp'] = savegame['max_hp'] pk.dump(savegame,open("./save.p","wb")) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) life = 0 running = False # another map starts if (flag_ring==1 and pygame.Rect.colliderect(hero.rect,portal1)): portal=True sound.stop_soundfx(tunnel3_sound) running=False # adjust camera according to the hero's position, follow him cam_pos_x = hero.rect.centerx cam_pos_y = hero.rect.centery if hero.rect.centerx <= 524 : cam_pos_x = 524 elif hero.rect.centerx >=1459: cam_pos_x = 1459 if hero.rect.centery <=406: cam_pos_y = 406 renderer.set_camera_position(cam_pos_x,cam_pos_y) # interface update c_pos=(cam_pos_x,cam_pos_y) interface.rect.topleft=(c_pos[0]-512,c_pos[1]-384) hp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-382) xp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-345) l_g.rect.topleft=(c_pos[0]-508,c_pos[1]-381) f_i.rect.bottomright=(c_pos[0]+500,c_pos[1]+350) interf_fight.rect.bottomright=(c_pos[0]+512,c_pos[1]+384) # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) if life == 0: demo_pygame('./maps/tunnel3.tmx',0) elif portal==True: shifty1.demo_pygame('./maps/ship.tmx',0)
def demo_pygame(file_name): file = './sounds/Firestrm.ogg' # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) mixer.init() # loading the sound files in different sound formats of mixer and main background sound in mixer stream sound_ouch = mixer.Sound('./sounds/pain.ogg') mixer.music.load(file) mixer.music.play(-1); # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite # use floats for hero position hero_pos_x = 18*32+16 hero_pos_y = 22*32 hero = person.create_person(hero_pos_x, hero_pos_y ,'./images/hero_u2.png') # dimensions of the hero for collision detection hero_width = hero.rect.width hero_height = 5 # create knife sprite knife_pos_x = 8 *32 knife_pos_y = 21 * 32 knife = create_knife(knife_pos_x, knife_pos_y) # create coin sprite coin_pos_x = 28*32 +16 coin_pos_y = 16*32 coin = create_coin(coin_pos_x, coin_pos_y) # cam_offset is for scrolling cam_world_pos_x = 1024/2 cam_world_pos_y = 768/2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[3].add_sprite(hero) sprite_layers[2].add_sprite(coin) sprite_layers[2].add_sprite(knife) # layer add/remove hero keys num_keys = [pygame.K_0, pygame.K_1, pygame.K_2, pygame.K_3, pygame.K_4, \ pygame.K_5, pygame.K_6, pygame.K_7, pygame.K_8, pygame.K_9] ###FOR INTERFACE on top-left corner loading the libraries from menu file and loading the local variables into the function savegame=pk.load(open("./save.p","rb")) HERO_HEALTH = savegame['hp'] # loading the last hero health hp=savegame['hp'] hp_max=savegame['max_hp'] # keep updating the values in pk file c_pos=[cam_world_pos_x, cam_world_pos_y] #c_pos=camra.camera(file_name,renderer,hero) interf_toggle=0 interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos) #for showing the xp in the interface xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos) # variables for the main loop clock = pygame.time.Clock() running = True speed = 4.75 # setting up an environment for shifting the map while exiting from the map portal1 = pygame.Rect(17*32,22*32,96,32) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) mr=ml=md=mu=0 # mainloop while running: dt = clock.tick(50) # value set to work same with different processors ## continously moving the interface and saving the health and other data in the files savegame=pk.load(open("./save.p","rb")) interface.rect.topleft=(c_pos[0]-512,c_pos[1]-384) hp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-382) xp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-345) l_g.rect.topleft=(c_pos[0]-508,c_pos[1]-381) # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False mixer.music.stop() menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) # find directions # loading commom movement of hero stored in movements1 file and chaning its positions mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[4]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # fire collision health loss if(fire_ouch(hero_pos_x,hero_pos_y,sprite_layers[1])): sound_ouch.play() dmg=0.85 # updating the new health menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,dmg) savegame['hp'] -=dmg HERO_HEALTH -=dmg if(HERO_HEALTH < 0): # setting the hero kill position from fire savegame['hp']=savegame['max_hp'] HERO_HEALTH = savegame['hp'] hero_pos_x = 18*32+16 hero_pos_y = 22*32 # if knife and coin not taken adding them here if( not sprite_layers[2].contains_sprite(knife)): sprite_layers[2].add_sprite(knife) if( not sprite_layers[2].contains_sprite(coin)): sprite_layers[2].add_sprite(coin) # getting coin here if(pygame.sprite.collide_rect(hero,coin)): sprite_layers[2].remove_sprite(coin) #getting knife here if(pygame.sprite.collide_rect(hero,knife)): sprite_layers[2].remove_sprite(knife) # collision with portal for changing map if(portal1.collidepoint(hero.rect.midbottom) and not sprite_layers[2].contains_sprite(coin) \ and not sprite_layers[2].contains_sprite(knife)): mixer.music.stop() savegame['b_h_vil']=1 savegame['talk_vil']['./maps/village1.tmx'][1]=1 savegame['dagger']=1 savegame['eqp_weapon']='dagger' pk.dump(savegame,open("./save.p","wb")) running=False #CODE FOR MAP CHANGING HERE......... # condition for shifting map # adjust camera according to the hero's position, follow him # (don't make the hero follow the cam, maybe later you want different # objects to be followd by the cam) #renderer.set_camera_position(hero.rect.centerx, hero.rect.centery) # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) pk.dump(savegame,open("./save.p","wb")) pygame.display.flip() # calling the other map after completion of catching all the fishes shifty1.demo_pygame('./maps/village1.tmx',2)
def demo_pygame(file_name,frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() #background music battlefield_sound = sound.create_music(file_name) # create hero hero_pos_x = 10*32 hero_pos_y = 41*32 hero = person.create_person(hero_pos_x, hero_pos_y,'./images/hero_u2.png') # create enemy sprites enm = [] enm.append(person.create_person(10*32, 3*32,'./images/haabu_d1.png')) enm.append(person.create_person(14*32, 3*32,'./images/haabu_d1.png')) enm.append(person.create_person(10*32, 7*32,'./images/haabu_d1.png')) enm.append(person.create_person(14*32, 7*32,'./images/haabu_d1.png')) # create dragon sprite dragon = person.create_person(10*32, 27*32,'./images/dragon_d1.png') # cam_offset is for scrolling cam_world_pos_x = 520 cam_world_pos_y = 1050 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero and enemies the the right layer sprite_layers[1].add_sprite(hero) sprite_layers[1].add_sprite(dragon) i = 0 for i in range(len(enm)): sprite_layers[1].add_sprite(enm[i]) # variables for the main loop clock = pygame.time.Clock() running = True # to run while loop speed = 7 # hero speed mr=ml=md=mu=0 # image variables(change images to show movements of hero) tic_flag = 0 drctn='down' # direction where hero facing right now life = 1 # to keep track wheather hero is alive or not arrow_list = [] # contains a list of arrows (currently on screen) arrow_dir = [] # directions of arrows enm_dir = [0,0,0,0] drag = [dragon] dx_dragon = [0] image_variable = [0] weap_dir = [] # directions of weapons weap_list = [] # contains a list of weapons (currently on screen) color_change = 0 # a color variable for dragon dy_dragon = [1] # dragon direction specialarrow_list = [] # contains a list of specialarrows (currently on screen) specialarrow_dir = [] # directions of specialarrows dragonimages = ['./images/dragon_d1.png','./images/dragon_d2.png','./images/dragon_d3.png','./images/dragon_u1.png','./images/dragon_u2.png','./images/dragon_u3.png'] enemyimages = ['./images/haabu_d1.png','./images/haabu_d2.png','./images/haabu_d3.png','./images/haabu_u1.png','./images/haabu_u2.png','./images/haabu_u3.png'] chk = 0 HP_ENM = [100.0,100.0,100.0,100.0] # health of enemies HP_DRAGON = [100.0] # health of dragon SPECIALARROW = 5 point_weapon = 1.0 # decrease in health of hero when weapon OR haabu collides with hero ## HAABU MEANS ENEMY (in HINDI) point_arrow = 20.0 # arrow enemy collision point_dragon = 5.0 # hero dragon collision point_specialarrow = 10.0 # specialarrow hero collision haabu_speed = 6 dragon_speed = 8 #old variables to restore if hero dies in this map savegame=pk.load(open("./save.p","rb")) old_xp = savegame['xp'] old_level = savegame['h_level'] old_armor = savegame['sheild_hp'] old_arrow = savegame['arrow_count'] # interface code c_pos=[cam_world_pos_x, cam_world_pos_y] interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') # hp bar interface l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) # level and gold interface [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos) xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') # xp interface xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos) s_a=menu.create_s_a(renderer,sprite_layers,screen,c_pos) f_i=menu.create_f_i(renderer,sprite_layers,screen,c_pos) # arrow,armor,sword interface interf_fight=menu.create_interface_fight(renderer,sprite_layers,screen,c_pos) spec_interf=menu.create_interface_spec_arrow(renderer,sprite_layers,screen,c_pos) d_hp=menu.create_interface_dragon(renderer,sprite_layers,screen,c_pos) dhp_sprite=person.create_person(c_pos[0]-400,c_pos[1],'./images/dragon_health.png') #dragon health interface dhp_sprite=menu.create_dragon_hp(renderer,sprite_layers,screen,dhp_sprite,c_pos,HP_DRAGON) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) # mainloop while running: dt = clock.tick(70) savegame=pk.load(open("./save.p","rb")) # keep adding a group of four enemies after dying previous group if len(enm)==0: color_change += 1 enm.append(person.create_person(10*32, 3*32,'./images/haabu_d1.png')) enm.append(person.create_person(14*32, 3*32,'./images/haabu_d1.png')) enm.append(person.create_person(10*32, 7*32,'./images/haabu_d1.png')) enm.append(person.create_person(14*32, 7*32,'./images/haabu_d1.png')) HP_ENM = [100.0,100.0,100.0,100.0] enm_dir = [0,0,0,0] i = 0 for i in range(len(enm)): sprite_layers[1].add_sprite(enm[i]) # dragon can be killed only if it is of orange color and only by specialarrows # five specialarrows are provided when dragon becomes orange if color_change%2==0: SPECIALARROW = 0 chk = 0 dragonimages = ['./images/dragon_d1.png','./images/dragon_d2.png','./images/dragon_d3.png','./images/dragon_u1.png','./images/dragon_u2.png','./images/dragon_u3.png'] else: if chk == 0: SPECIALARROW = 5 chk = 1 dragonimages = ['./images/orange_d1.png','./images/orange_d2.png','./images/orange_d3.png','./images/orange_u1.png','./images/orange_u2.png','./images/orange_u3.png'] #spec_arrow_interf menu.update_s_a(s_a,c_pos,SPECIALARROW) # event handling for event in pygame.event.get(): if (event.type == pygame.QUIT): running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_w and savegame['arrow_count'] > 0: enemy_attack.create_arrow(arrow_list,arrow_dir,drctn,hero,sprite_layers) # create arrow on pressing 'w' haabu_remove(enm,HP_ENM,sprite_layers,enm_dir) # remove enemy sprite if health bacomes zero savegame['arrow_count'] -=1 # decrease the arrow count and update in the dictionary pk.dump(savegame,open("./save.p","wb")) # save the changes of dictionary elif event.key == pygame.K_a: # attack with sword on pressing 'a' enemy_attack.attack(drctn,hero,enm,HP_ENM) haabu_remove(enm,HP_ENM,sprite_layers,enm_dir) elif event.key == pygame.K_s and color_change%2!=0 and SPECIALARROW > 0: # attack with specialarrow on pressing 's' enemy_attack.create_specialarrow(specialarrow_list,specialarrow_dir,drctn,hero,sprite_layers) SPECIALARROW -= 1 # interface update menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) menu.update_f_i(f_i,c_pos) menu.update_dhp_bar(renderer,sprite_layers,screen,dhp_sprite,c_pos,HP_DRAGON) if(color_change%2==1): menu.update_s_a(s_a,c_pos,SPECIALARROW) # calling hero_move() function for hero's movements mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[3]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # to detect the direction of hero if(mu>1): drctn='up' elif(mr>1): drctn='right' elif(md>1): drctn='down' elif(ml>1): drctn='left' haabu_move(hero,enm,enm_dir,enemyimages,haabu_speed) # random movement of enemy haabu_remove(enm,HP_ENM,sprite_layers,enm_dir)# remove enemy if health of enemy becomes zero if(color_change%2==0):enemy_attack.create_weapons(weap_list,sprite_layers,drag,weap_dir,dy_dragon,1) # create the weapons only if it is not of orange color enemy_attack.remove_weapon(hero,enm,weap_list,weap_dir,point_weapon,sprite_layers) # interface update menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) menu.update_f_i(f_i,c_pos) menu.update_dhp_bar(renderer,sprite_layers,screen,dhp_sprite,c_pos,HP_DRAGON) enemy_attack.move_enemy(drag,[19*32],[1*32],dx_dragon,dragon_speed)# random movement of dragon enemy_attack.dir_update(drag,hero,dy_dragon) # direction update of enemy enemy_attack.image_update(drag,image_variable,dy_dragon,dragonimages) # image update of enemy enemy_attack.remove_arrow(arrow_list,enm,HP_ENM,arrow_dir,sprite_layers,point_arrow) # removes arrow from the screen enemy_attack.remove_arrow(specialarrow_list,drag,HP_DRAGON,specialarrow_dir,sprite_layers,point_specialarrow) # removes specialarrow from the screen # decrease health of hero if it colldes with dragon if pygame.sprite.collide_rect(hero,drag[0]): weap_sound = sound.create_soundfx('./sounds/weapon_touch.ogg') sound.volume(weap_sound,0.4) savegame=pk.load(open("./save.p","rb")) savegame['hp'] -= point_dragon pk.dump(savegame,open("./save.p","wb")) # game starts again if player dies if savegame['hp'] <= 0: sound.stop_soundfx(battlefield_sound) savegame['xp'] = old_xp savegame['h_level'] = old_level savegame['sheild_hp'] = old_armor savegame['arrow_count'] = old_arrow savegame['hp'] = savegame['max_hp'] pk.dump(savegame,open("./save.p","wb")) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) life = 0 running = False # Game ends! # clean the screen! if HP_DRAGON[0] <= 0: i = 0 l = len(enm) while(i>=0 and i<l): sprite_layers[1].remove_sprite(enm[i]) enm.pop(i) l = len(enm) i = 0 l = len(weap_list) while(i>=0 and i<l): sprite_layers[2].remove_sprite(weap_list[i]) weap_list.pop(i) l = len(weap_list) i = 0 l = len(arrow_list) while(i>=0 and i<l): sprite_layers[1].remove_sprite(arrow_list[i]) arrow_list.pop(i) l = len(arrow_list) i = 0 l = len(specialarrow_list) while(i>=0 and i<l): sprite_layers[1].remove_sprite(specialarrow_list[i]) specialarrow_list.pop(i) l = len(specialarrow_list) sprite_layers[1].remove_sprite(drag[0]) render_update(renderer,sprite_layers,screen) sound.stop_soundfx(battlefield_sound) running = False life = 2 # adjust camera according to the hero's position, follow him cam_pos_x = hero.rect.centerx cam_pos_y = hero.rect.centery if hero.rect.centerx <= 520 : cam_pos_x = 520 if hero.rect.centery >=1050: cam_pos_y = 1050 elif hero.rect.centery <=407: cam_pos_y = 407 renderer.set_camera_position(cam_pos_x, cam_pos_y) # interface update c_pos=(cam_pos_x,cam_pos_y) interface.rect.topleft=(c_pos[0]-512,c_pos[1]-384) hp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-382) xp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-345) l_g.rect.topleft=(c_pos[0]-508,c_pos[1]-381) f_i.rect.bottomright=(c_pos[0]+500,c_pos[1]+350) interf_fight.rect.bottomright=(c_pos[0]+512,c_pos[1]+384) dhp_sprite.rect.midbottom=(c_pos[0],c_pos[1]+350) d_hp.rect.midbottom=(c_pos[0],c_pos[1]+350) spec_interf.rect.topleft=(c_pos[0]-512,c_pos[1]-240) s_a.rect.topleft=(c_pos[0]-540,c_pos[1]-280) # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) if life == 0: demo_pygame('./maps/palace_final.tmx',0) elif life ==2: # Game ends! # Quit the window after pressing 'Esc' running = True ending_sound = sound.create_soundfx('./sounds/ending.ogg') sound.volume(ending_sound,1) while running : for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE ): sound.stop_soundfx(ending_sound) running = False pygame.quit()
def demo_pygame(file_name): file = './sounds/Firestrm.ogg' # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode( file_name) mixer.init() # loading the sound files in different sound formats of mixer and main background sound in mixer stream sound_ouch = mixer.Sound('./sounds/pain.ogg') mixer.music.load(file) mixer.music.play(-1) # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite # use floats for hero position hero_pos_x = 18 * 32 + 16 hero_pos_y = 22 * 32 hero = person.create_person(hero_pos_x, hero_pos_y, './images/hero_u2.png') # dimensions of the hero for collision detection hero_width = hero.rect.width hero_height = 5 # create knife sprite knife_pos_x = 8 * 32 knife_pos_y = 21 * 32 knife = create_knife(knife_pos_x, knife_pos_y) # create coin sprite coin_pos_x = 28 * 32 + 16 coin_pos_y = 16 * 32 coin = create_coin(coin_pos_x, coin_pos_y) # cam_offset is for scrolling cam_world_pos_x = 1024 / 2 cam_world_pos_y = 768 / 2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [ layer for layer in sprite_layers if not layer.is_object_group ] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[3].add_sprite(hero) sprite_layers[2].add_sprite(coin) sprite_layers[2].add_sprite(knife) # layer add/remove hero keys num_keys = [pygame.K_0, pygame.K_1, pygame.K_2, pygame.K_3, pygame.K_4, \ pygame.K_5, pygame.K_6, pygame.K_7, pygame.K_8, pygame.K_9] ###FOR INTERFACE on top-left corner loading the libraries from menu file and loading the local variables into the function savegame = pk.load(open("./save.p", "rb")) HERO_HEALTH = savegame['hp'] # loading the last hero health hp = savegame['hp'] hp_max = savegame['max_hp'] # keep updating the values in pk file c_pos = [cam_world_pos_x, cam_world_pos_y] #c_pos=camra.camera(file_name,renderer,hero) interf_toggle = 0 interface = menu.create_interface(renderer, sprite_layers, screen, c_pos) hp_sprite = person.create_person(c_pos[0], c_pos[1], './images/hp_bar.png') l_g = menu.create_l_g(renderer, sprite_layers, screen, c_pos) [hp_sprite, hp] = menu.create_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos) #for showing the xp in the interface xp_sprite = person.create_person(c_pos[0], c_pos[1], './images/exp_bar.png') xp_sprite = menu.create_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos) # variables for the main loop clock = pygame.time.Clock() running = True speed = 4.75 # setting up an environment for shifting the map while exiting from the map portal1 = pygame.Rect(17 * 32, 22 * 32, 96, 32) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) mr = ml = md = mu = 0 # mainloop while running: dt = clock.tick(50) # value set to work same with different processors ## continously moving the interface and saving the health and other data in the files savegame = pk.load(open("./save.p", "rb")) interface.rect.topleft = (c_pos[0] - 512, c_pos[1] - 384) hp_sprite.rect.topleft = (c_pos[0] - 400, c_pos[1] - 382) xp_sprite.rect.topleft = (c_pos[0] - 400, c_pos[1] - 345) l_g.rect.topleft = (c_pos[0] - 508, c_pos[1] - 381) # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False mixer.music.stop() menu.update_lg(l_g, c_pos) menu.update_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos, 0) menu.update_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos, 0) # find directions # loading commom movement of hero stored in movements1 file and chaning its positions mov = movements1.hero_move(mr, ml, md, mu, hero_pos_x, hero_pos_y, hero, speed, sprite_layers[4]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # fire collision health loss if (fire_ouch(hero_pos_x, hero_pos_y, sprite_layers[1])): sound_ouch.play() dmg = 0.85 # updating the new health menu.update_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos, dmg) savegame['hp'] -= dmg HERO_HEALTH -= dmg if (HERO_HEALTH < 0): # setting the hero kill position from fire savegame['hp'] = savegame['max_hp'] HERO_HEALTH = savegame['hp'] hero_pos_x = 18 * 32 + 16 hero_pos_y = 22 * 32 # if knife and coin not taken adding them here if (not sprite_layers[2].contains_sprite(knife)): sprite_layers[2].add_sprite(knife) if (not sprite_layers[2].contains_sprite(coin)): sprite_layers[2].add_sprite(coin) # getting coin here if (pygame.sprite.collide_rect(hero, coin)): sprite_layers[2].remove_sprite(coin) #getting knife here if (pygame.sprite.collide_rect(hero, knife)): sprite_layers[2].remove_sprite(knife) # collision with portal for changing map if(portal1.collidepoint(hero.rect.midbottom) and not sprite_layers[2].contains_sprite(coin) \ and not sprite_layers[2].contains_sprite(knife)): mixer.music.stop() savegame['b_h_vil'] = 1 savegame['talk_vil']['./maps/village1.tmx'][1] = 1 savegame['dagger'] = 1 savegame['eqp_weapon'] = 'dagger' pk.dump(savegame, open("./save.p", "wb")) running = False #CODE FOR MAP CHANGING HERE......... # condition for shifting map # adjust camera according to the hero's position, follow him # (don't make the hero follow the cam, maybe later you want different # objects to be followd by the cam) #renderer.set_camera_position(hero.rect.centerx, hero.rect.centery) # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) pk.dump(savegame, open("./save.p", "wb")) pygame.display.flip() # calling the other map after completion of catching all the fishes shifty1.demo_pygame('./maps/village1.tmx', 2)
def demo_pygame(file_name,frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) mixer.init() #background music and special sound effects sound = mixer.Sound('./sounds/oh.ogg') file = './sounds/SunnyDay.ogg' m = mixer.music.load(file) mixer.music.play(-1); #set up a screen screen_width = min(1000, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() #decide hero location based on the previous map if frm==0: hero_pos_x = 200 hero_pos_y = 1860 else: hero_pos_x=200 hero_pos_y=47*20 # create hero sprite hero = person.create_person(hero_pos_x, hero_pos_y ,'./images/hero_u2.png') # create treasurechest sprite treasure_width =3 treasure_height=3 #create pot sprite pot_width=3 pot_height=4 #create pot2 sprite pot2_width=4 pot2_height=4 # dimensions of the hero for collision detection hero_width = hero.rect.width hero_height = 5 # cam_offset is for scrolling cam_world_pos_x = hero.rect.centerx cam_world_pos_y = hero.rect.centery # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[3].add_sprite(hero) #load the saved game variables sv=pk.load(open("./save.p","rb")) ft=sv['flagtreasure'] # add pots positions pots_pos_x=[240,760,600,960] pots_pos_y=[60,320,880,1800] #create gold pots based on whether the pots have already been opened or not pots=[] for i in range(4) : if ft[i]==0 : pots.append(create_pot(pots_pos_x[i], pots_pos_y[i])) sprite_layers[2].add_sprite(pots[len(pots)-1]); # add pots2 positions pots2_pos_x=[700,80] pots2_pos_y=[440,160] pots2=[] #create gold pots2 based on whether the pots have already been opened or not for i in range(2) : if ft[i+4]==0 : pots2.append(create_pot2(pots2_pos_x[i], pots2_pos_y[i])) sprite_layers[2].add_sprite(pots2[len(pots2)-1]); # add treasure positions treasure_pos_x=[960,820,320,780] treasure_pos_y=[180,840,1200,1440] treasure=[] #create treasure chest based on whether the pots have already been opened or not for i in range(4) : if ft[i+6]==0 : treasure.append(create_treasure(treasure_pos_x[i], treasure_pos_y[i])) sprite_layers[2].add_sprite(treasure[len(treasure)-1]); # variables for the main loop clock = pygame.time.Clock() running = True speed=6 health=100 mr=ml=md=mu=0 flag1=[0 for x in range(4)] flag2=[0 for x in range(4)] flag3=[0 for x in range(4)] # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT,1000) #create portals to detect collision with these to change maps portal1 = pygame.Rect(0,98*20,49*20,20) portal2 = pygame.Rect(0,0,49*20,20) portal=False # mainloop while running: dt = clock.tick(40) sv=pk.load(open("./save.p","rb")) ft=sv['flagtreasure'] # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False # find directions mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[4]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # adjust camera according to the hero's position, follow him if ( hero.rect.centery >=1600): renderer.set_camera_position(500, 1600) elif (hero.rect.centery <=385): renderer.set_camera_position(500, 385) else: renderer.set_camera_position(500,hero.rect.centery ) #go to previous map or next map based on the portal it collides with if(pygame.Rect.colliderect(portal1,hero.rect)): portal=True portal_num=0 nextlevel=next_map(file_name,0) running=False mixer.music.stop() elif(pygame.Rect.colliderect(portal2,hero.rect)): portal=True portal_num=1 nextlevel=next_map(file_name,1) running=False mixer.music.stop() # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) #render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) #detects which treasure chest the hero collides with n=hero.rect.collidelist(treasure) if n!= -1: r1=treasure[n].rect; #change the image to open treasure chest im=pygame.image.load('./images/treasure2.png'); treasure[n].image=im treasure[n].rect=im.get_rect(); treasure[n].rect.center=r1.center #if gold not already taken update hero's gold if(flag1[n]==0): flag1[n]=1 ft[n+6]=1 sv['gold'] += 13 mixer.music.stop() sound.play(0) mixer.music.play(-1); #detects which pot the hero collides with n=hero.rect.collidelist(pots) if n!= -1: sprite_layers[2].remove_sprite(pots[n]); #if gold not already taken update hero's gold if(flag2[n]==0): ft[n]=1 flag2[n]=1 sv['gold'] += 7 mixer.music.stop() sound.play(0) mixer.music.play(-1); #detects which pot the hero collides with n=hero.rect.collidelist(pots2) if n!= -1: sprite_layers[2].remove_sprite(pots2[n]); #if gold not already taken update hero's gold if(flag3[n]==0): ft[n+4]=1 flag3[n]=1 sv['gold'] += 7 mixer.music.stop() sound.play(0) mixer.music.play(-1); sv['flagtreasure']=ft pygame.display.flip() #save the new game variables back to dictionary pk.dump(sv,open("./save.p","wb")) if (portal==True and portal_num==0): mp=nextlevel[0] frm=nextlevel[1] #go to previous map shifty1.demo_pygame(mp,frm) elif (portal==True and portal_num==1): mp=nextlevel[0] frm=nextlevel[1] #go to next map goodtunnel2.demo_pygame(mp,frm)
RuleConfiguration( FrontOfClassRule, [RandomFloatRuleParameter("weight", FRONT_OF_CLASS_WEIGHT_LOWER, FRONT_OF_CLASS_WEIGHT_UPPER)] ), RuleConfiguration( FarFromStrangersRule, [RandomFloatRuleParameter( "weight", FAR_FROM_STRANGERS_WEIGHT_LOWER, FAR_FROM_STRANGERS_WEIGHT_UPPER), RandomIntRuleParameter("neighbourhood", FAR_FROM_STRANGERS_NEIGHBOURHOOD_LOWER, FAR_FROM_STRANGERS_NEIGHBOURHOOD_UPPER)] ), RuleConfiguration( CloseToEntranceRule, [RandomFloatRuleParameter("weight", CLOSE_TO_ENTRANCE_WEIGHT_LOWER, CLOSE_TO_ENTRANCE_WEIGHT_UPPER)] ), RuleConfiguration( NextToFriendsRule, [RandomFloatRuleParameter("weight", NEXT_TO_FRIENDS_WEIGHT_LOWER, NEXT_TO_FRIENDS_WEIGHT_UPPER)] ) ] people = [] for i in range(NUM_PEOPLE): people.append(create_person(rule_configurations)) friend_graph = FriendGraph([person.id for person in people]) friend_graph.randomize_friendships(NUM_FRIENDSHIPS) simulation = Simulation(SimulationConfiguration(classroom, friend_graph, people)) simulation.run_simulation()
def create_interface_fight(renderer, sprite_layers, screen, c_pos): interface = person.create_person(c_pos[0] + 312, c_pos[1] + 150, './images/interface_fight.png') sprite_layers[1].add_sprite(interface) shifty1.render_update(renderer, sprite_layers, screen) return interface
def create_interface_spec_arrow(renderer, sprite_layers, screen, c_pos): interface = person.create_person(c_pos[0] - 700, c_pos[1] - 100, './images/spec_arrow_interf.png') sprite_layers[1].add_sprite(interface) shifty1.render_update(renderer, sprite_layers, screen) return interface
def create_interface_dragon(renderer, sprite_layers, screen, c_pos): interface = person.create_person(c_pos[0] - 400, c_pos[1], './images/dragon_health_interface.png') sprite_layers[1].add_sprite(interface) shifty1.render_update(renderer, sprite_layers, screen) return interface
def create_interface_dragon(renderer,sprite_layers,screen,c_pos): interface=person.create_person(c_pos[0]-400,c_pos[1],'./images/dragon_health_interface.png') sprite_layers[1].add_sprite(interface) shifty1.render_update(renderer,sprite_layers,screen) return interface
def create_interface(renderer,sprite_layers,screen,c_pos): interface=person.create_person(c_pos[0]-512,c_pos[1]-384,'./images/interface1.png') sprite_layers[1].add_sprite(interface) shifty1.render_update(renderer,sprite_layers,screen) return interface
def demo_pygame(file_name, frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode( file_name) #for background music and special sound effects mixer.init() sound1 = mixer.Sound('./sounds/ouch.ogg') sound2 = mixer.Sound('./sounds/stone.ogg') file = './sounds/Rock_Slide.ogg' m = mixer.music.load(file) #(-1) argument plays it infinitely unless stopped explicitly mixer.music.play(-1) #set up a screen screen_width = min(704, world_map.pixel_width) screen_height = min(800, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite hero_pos_x = screen_width / 2 hero_pos_y = 6300 #create hero on specified co-ordinates and with specified image hero = person.create_person(hero_pos_x, hero_pos_y, './images/up.png') #portal to detect change of map portal2 = pygame.Rect(0, 1 * 32, 21 * 32, 60) # create stones sprite stone_width = 3 stone1_height = 3 stone2_height = 4 stone3_height = 5 stone1 = [] stone2 = [] stone3 = [] # dimensions of the hero for collision detection hero_width = hero.rect.width hero_height = 5 # cam_offset is for scrolling cam_world_pos_x = hero.rect.centerx cam_world_pos_y = hero.rect.centery # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [ layer for layer in sprite_layers if not layer.is_object_group ] # add the hero to the the right layer sprite_layers[1].add_sprite(hero) # add stone positions stone1_pos_x = [] stone1_pos_y = [] stone2_pos_x = [] stone2_pos_y = [] stone3_pos_x = [] stone3_pos_y = [] # variables for the main loop clock = pygame.time.Clock() running = True speed_x = 4 speed_y = 6 last = 0 #load the saved game variables based on game progress sv = pk.load(open("./save.p", "rb")) health = sv['hp'] hp = sv['hp'] hp_max = sv['max_hp'] c_pos = [cam_world_pos_x, cam_world_pos_y] interf_toggle = 0 interface = menu.create_interface(renderer, sprite_layers, screen, c_pos) hp_sprite = person.create_person(c_pos[0], c_pos[1], './images/hp_bar.png') l_g = menu.create_l_g(renderer, sprite_layers, screen, c_pos) [hp_sprite, hp] = menu.create_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos) xp_sprite = person.create_person(c_pos[0], c_pos[1], './images/exp_bar.png') xp_sprite = menu.create_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) cl = 0 # mainloop while running: dt = clock.tick(40) sv = pk.load(open("./save.p", "rb")) # event handling for event in pygame.event.get(): #update the health,experience and armour menu.update_lg(l_g, c_pos) menu.update_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos, 0) menu.update_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos, 0) if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False #based on collision with environment decide number of steps allowed mov = climb.hero_climb(cl, hero_pos_x, hero_pos_y, hero, speed_x, speed_y, sprite_layers[3]) cl = mov[0] hero_pos_x = mov[1] hero_pos_y = mov[2] #check collision with portal to change map if (pygame.Rect.colliderect(portal2, hero.rect)): portal = True #stop the background music for this map mixer.music.stop() running = False # adjust camera according to the hero's position, follow him if (hero.rect.centery >= 6000): renderer.set_camera_position(350, 6000) c_pos = (350, 6000) elif (hero.rect.centery <= 400): renderer.set_camera_position(350, 400) c_pos = (350, 400) else: renderer.set_camera_position(350, hero.rect.centery) c_pos = (350, hero.rect.centery) #position health bar, experience bar and armour interface.rect.topleft = (c_pos[0] - 352, c_pos[1] - 384) hp_sprite.rect.topleft = (c_pos[0] - 240, c_pos[1] - 382) xp_sprite.rect.topleft = (c_pos[0] - 240, c_pos[1] - 345) l_g.rect.topleft = (c_pos[0] - 348, c_pos[1] - 381) # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: continue else: renderer.render_layer(screen, sprite_layer) time = (pygame.time.get_ticks() / 500) #to decide interval when to drop stones if time > last and len(stone1) + len(stone2) + len(stone3) < 30: last = time hero_temp_x = hero.rect.centerx #decide x co-ordinate of stone randomly r = random.randint(0, 100) if (r < 25): left_limit = hero_temp_x - 10 right_limit = hero_temp_x + 10 elif (r < 90): left_limit = hero_temp_x - 200 right_limit = hero_temp_x + 200 if (left_limit < 40): left_limit = 40 right_limit = 400 if (right_limit > 640): left_limit = 300 right_limit = 660 else: left_limit = 10 right_limit = 690 #to decide randomly the type of stone t = random.randint(0, math.floor(hero_pos_y)) if t < 2000: t = 3 elif t < 4000: t = 2 else: t = 1 permission = random.randint(left_limit, right_limit) if (permission < 50): permission = 55 elif (permission > 650): permission = 645 #append initial stone locations and create stone sprites if (t == 1): stone1_pos_x.append(permission) stone1_pos_y.append(max(hero_pos_y - 800, 50)) stone1.append( create_stone(stone1_pos_x[len(stone1)], stone1_pos_y[len(stone1)], 1)) sprite_layers[1].add_sprite(stone1[len(stone1) - 1]) elif t == 2: stone2_pos_x.append(permission) stone2_pos_y.append(max(hero_pos_y - 800, 50)) stone2.append( create_stone(stone2_pos_x[len(stone2)], stone2_pos_y[len(stone2)], 2)) sprite_layers[1].add_sprite(stone2[len(stone2) - 1]) else: stone3_pos_x.append(permission) stone3_pos_y.append(max(hero_pos_y - 800, 50)) stone3.append( create_stone(stone3_pos_x[len(stone3)], stone3_pos_y[len(stone3)], 3)) sprite_layers[1].add_sprite(stone3[len(stone3) - 1]) n = 0 while n < len(stone1): #moving the stones of type1 step_x, step_y = climb.check_collision( stone1_pos_x[n], stone1_pos_y[n], 0, 8 * (6400 - hero_pos_y) // 6400 + 10, stone_width, stone1_height, sprite_layers[3]) stone1_pos_y[n] += step_y stone1[n].rect.midbottom = (stone1_pos_x[n], stone1_pos_y[n]) #if stone is out of visible region remove stone sprite if (stone1_pos_y[n] >= hero_pos_y + 400 or stone1_pos_y[n] >= 6300): sprite_layers[1].remove_sprite(stone1[n]) stone1.pop(n) stone1_pos_y.pop(n) stone1_pos_x.pop(n) #stop background music and play sound of stone reaching bottom of sea mixer.music.stop() sound2.play(0) #play background music again mixer.music.play(-1) continue else: n = n + 1 #to check players' collision with stone type1 n = hero.rect.collidelist(stone1) if n != -1: #remove stone sprite sprite_layers[1].remove_sprite(stone1[n]) stone1.pop(n) stone1_pos_y.pop(n) stone1_pos_x.pop(n) #decrease the health health = health - 3 sv['hp'] = health pk.dump(sv, open("./save.p", "wb")) mixer.music.stop() #play the hurt sound sound1.play(0) mixer.music.play(-1) if health <= 0: #go back to initial position hero_pos_x = screen_width / 2 hero_pos_y = 6300 sv['hp'] = sv['max_hp'] health = sv['hp'] n = 0 #similarly for stones of type2 while n < len(stone2): step_x, step_y = climb.check_collision( stone2_pos_x[n], stone2_pos_y[n], 0, 8 * (6400 - hero_pos_y) // 6400 + 10, stone_width, stone2_height, sprite_layers[3]) stone2_pos_y[n] += step_y stone2[n].rect.midbottom = (stone2_pos_x[n], stone2_pos_y[n]) if (stone2_pos_y[n] >= hero_pos_y + 400 or stone2_pos_y[n] >= 6300): sprite_layers[1].remove_sprite(stone2[n]) stone2.pop(n) stone2_pos_y.pop(n) stone2_pos_x.pop(n) mixer.music.stop() sound2.play(0) mixer.music.play(-1) continue else: n = n + 1 n = hero.rect.collidelist(stone2) if n != -1: sprite_layers[1].remove_sprite(stone2[n]) stone2.pop(n) stone2_pos_y.pop(n) stone2_pos_x.pop(n) health = health - 6 sv['hp'] = health pk.dump(sv, open("./save.p", "wb")) mixer.music.stop() sound1.play(0) mixer.music.play(-1) if health <= 0: # changes to switch screen to game over hero_pos_x = screen_width / 2 hero_pos_y = 6300 sv['hp'] = sv['max_hp'] health = sv['hp'] n = 0 #similarly for stone of type3 while n < len(stone3): step_x, step_y = climb.check_collision( stone3_pos_x[n], stone3_pos_y[n], 0, 8 * (6400 - hero_pos_y) // 6400 + 10, stone_width, stone3_height, sprite_layers[3]) stone3_pos_y[n] += step_y stone3[n].rect.midbottom = (stone3_pos_x[n], stone3_pos_y[n]) if (stone3_pos_y[n] >= hero_pos_y + 400 or stone3_pos_y[n] >= 6300): sprite_layers[1].remove_sprite(stone3[n]) stone3.pop(n) stone3_pos_y.pop(n) stone3_pos_x.pop(n) mixer.music.stop() sound2.play(0) mixer.music.play(-1) continue else: n = n + 1 n = hero.rect.collidelist(stone3) if n != -1: sprite_layers[1].remove_sprite(stone3[n]) stone3.pop(n) stone3_pos_y.pop(n) stone3_pos_x.pop(n) health = health - 10 sv['hp'] = health pk.dump(sv, open("./save.p", "wb")) mixer.music.stop() sound1.play(0) mixer.music.play(-1) if health <= 0: hero_pos_x = screen_width / 2 hero_pos_y = 6300 # changes to switch screen to game over sv['hp'] = sv['max_hp'] health = sv['hp'] pygame.display.flip() if portal == True: #chnage the map mountain_top.main()
def demo_pygame(file_name): """ Example showing how to use the paralax scrolling feature. """ HERO_HEALTH = 100 file = './sounds/lava_back.ogg' # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode( file_name) # loading the sound files in different sound formats of mixer and main background sound in mixer stream mixer.init() sound_fall = mixer.Sound('./sounds/scream2.ogg') mixer.music.load(file) mixer.music.play(-1) # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite # use floats for hero position hero_pos_x = 32 * 32 #32*32 hero_pos_y = 39 * 32 + 20 #19*32 hero = person.create_person(hero_pos_x, hero_pos_y, './images/hero_u2.png') hero_width = hero.rect.width hero_height = 5 # palcing chest sprite as the key chest = person.create_person(29 * 32 + 16, 17 * 32, './images/closed_chest.png') # cam_offset is for scrolling cam_world_pos_x = 1024 / 2 cam_world_pos_y = 768 / 2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [ layer for layer in sprite_layers if not layer.is_object_group ] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[3].add_sprite(hero) sprite_layers[2].add_sprite(chest) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) # variables for the main loop clock = pygame.time.Clock() running = True speed = 2.75 mr = ml = md = mu = 0 lava_list = [] # setting up different direction to check for in 4 tile section of map """ In the 4 tiles to be walkable each tile among them is connected to 2 other 4 tile sections so if hero is on that tile only them the other 2 4 tile section will be isible as lava or not lava(walkable or not walkable ) stored in different dirx and diry for all 4 tiles in a 4 tile section """ dirx = [[0 for x in range(2)] for x in range(4)] diry = [[0 for x in range(2)] for x in range(4)] dirx[0][0] = -1 dirx[0][1] = 0 dirx[1][0] = 0 dirx[1][1] = 1 dirx[2][0] = -1 dirx[2][1] = 0 dirx[3][0] = 1 dirx[3][1] = 0 diry[0][0] = 0 diry[0][1] = -1 diry[1][0] = -1 diry[1][1] = 0 diry[2][0] = 0 diry[2][1] = 1 diry[3][0] = 0 diry[3][1] = 1 # string the walable path in the matrix by loading the tile data from 2nd layer of map matrix = [[None for x in range(10)] for x in range(10)] for i in range(10): for j in range(10): if sprite_layers[1].content2D[(10 + i) * 2][(10 + j) * 2] is None: matrix[i][j] = create_lava(10 + j, 10 + i) #opp in case of content2D #sprite_layers[2].add_sprite(matrix[i][j]) lava_list.append(matrix[i][j].rect) #sys.stdout.write('1 ') #else: sys.stdout.write('0 ') #print " " # for storing the current visible lava and editing them dynamically along with the motion of the hero active_list = [] # stores the last position of the hero old = (-1, -1) flag = 0 # 3 portals for chest and 2 gates portal1 = pygame.Rect(28 * 32, 15 * 32, 96, 64) #key place portal2 = pygame.Rect(21 * 32, 10 * 32, 96, 96) #left door portal3 = pygame.Rect(35 * 32, 10 * 32, 96, 96) #right door # mainloop while running: dt = clock.tick(40) # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False # find directions #print pygame.key.get_pressed()[pygame.K_SPACE] mov = movements1.hero_move(mr, ml, md, mu, hero_pos_x, hero_pos_y, hero, speed, sprite_layers[4]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] if (hero_pos_y < 20 * 32): mixer.music.stop() # stopping the fast music after crossing the path of lava if (flag == 0 and portal1.collidepoint(hero.rect.midtop)): #print "collision deteected" # for checkign with the key taken from the chest if (pygame.key.get_pressed()[pygame.K_SPACE] == 1): flag = 1 chest.image = pygame.image.load('./images/open_chest.png') key_riddle = person.create_person(hero.rect.centerx, hero.rect.centery + 200, './images/lava_riddle.png') sprite_layers[3].add_sprite(key_riddle) #ring_take.rect.topleft=(1,1) for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() i = 0 while (i != 1): ##Infinite loop until menu is to be removed for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i = 1 continue sprite_layers[3].remove_sprite(key_riddle) #print "detected key here" # code for taking key and riddle elif (flag == 1 and portal2.collidepoint(hero.rect.midtop)): # for the wronng decision start from the beginning if (pygame.key.get_pressed()[pygame.K_SPACE] == 1): hero_pos_x = 32 * 32 hero_pos_y = 40 * 32 mixer.music.play() elif (flag == 1 and portal3.collidepoint(hero.rect.midtop)): #if right path chosesn changing to next map if (pygame.key.get_pressed()[pygame.K_SPACE] == 1): #condition on successful transition #print "detected right path" #music.mixer.stop() portal = True running = False # checking the midbottom of hero(foot ) if found in any rectangle of the tiles in activelist then dead for i in range(len(active_list)): if (active_list[i].rect.collidepoint(hero.rect.midbottom)): hero_pos_x = 32 * 32 hero_pos_y = 40 * 32 mixer.music.stop() sound_fall.play() time.sleep(2) mixer.music.play() #updating the activelist with the position of the hero x_tile = (int)(hero_pos_x // 32) y_tile = (int)(hero_pos_y // 32) new = (x_tile, y_tile) # storing the tile numeber of the hero if (old != new): # if the hero has changed its tile only then this check will be called for fast processing if (len(active_list) > 0): # emptying out the last active list while (len(active_list) > 0): sprite_layers[2].remove_sprite(active_list[0]) active_list.pop(0) # getting tile number in 4 tile section to check for which direction to select from above defined direction dataset n = get_tile_no(x_tile, y_tile) for i in range(2): # to check for the new tilesection are they in matrix laoded above x = ((x_tile + dirx[n][i]) // 2 - 10) y = ((y_tile + diry[n][i]) // 2 - 10) if (0 <= x < 10 and 0 <= y < 10): if (matrix[y][x] is not None and not sprite_layers[2].contains_sprite( matrix[y][x])): # appending the kill tiles in the active list sprite_layers[2].add_sprite(matrix[y][x]) active_list.append(matrix[y][x]) #renderer.set_camera_position(hero.rect.centerx, hero.rect.centery) # moving the camera positon acc to the hero location in the map cam_pos_x = hero.rect.centerx cam_pos_y = hero.rect.centery if hero.rect.centerx <= 520: cam_pos_x = 520 elif hero.rect.centerx >= ((42 * 32) - 530): cam_pos_x = ((42 * 32) - 530) if hero.rect.centery >= 44 * 32 - 400: cam_pos_y = 44 * 32 - 400 elif hero.rect.centery <= 408: cam_pos_y = 408 renderer.set_camera_position(cam_pos_x, cam_pos_y) # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() if portal == True: palace.main()
def create_interface_fight(renderer,sprite_layers,screen,c_pos): interface=person.create_person(c_pos[0]+312,c_pos[1]+150,'./images/interface_fight.png') sprite_layers[1].add_sprite(interface) shifty1.render_update(renderer,sprite_layers,screen) return interface
def demo_pygame(file_name, frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode( file_name) mixer.init() # background music file = './sounds/hotel.ogg' m = mixer.music.load(file) mixer.music.play(-1) #set up a screen screen_width = min(900, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite hero_pos_x = 200 hero_pos_y = 1600 hero = person.create_person(hero_pos_x, hero_pos_y, './images/hero_u2.png') # dimensions of the hero for collision detection hero_width = hero.rect.width hero_height = 5 # cam_offset is for scrolling cam_world_pos_x = hero.rect.centerx cam_world_pos_y = hero.rect.centery # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [ layer for layer in sprite_layers if not layer.is_object_group ] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[2].add_sprite(hero) # add pots positions ty = pk.load(open("./save.p", "rb")) t = ty['hotel_treasure'] pots_pos_x = [100, 520, 800, 180] pots_pos_y = [960, 960, 820, 120] pots = [] flag = [0, 0, 0, 0, 0] for i in range(4): if t[i] == 0: pots.append(create_pot(pots_pos_x[i], pots_pos_y[i])) c_pos = [cam_world_pos_x, cam_world_pos_y] ty = pk.load(open("./save.p", "rb")) hp = ty['hp'] hp_max = ty['max_hp'] interf_toggle = 0 interface = menu.create_interface(renderer, sprite_layers, screen, c_pos) hp_sprite = person.create_person(c_pos[0], c_pos[1], './images/hp_bar.png') l_g = menu.create_l_g(renderer, sprite_layers, screen, c_pos) [hp_sprite, hp] = menu.create_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos) xp_sprite = person.create_person(c_pos[0], c_pos[1], './images/exp_bar.png') xp_sprite = menu.create_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos) # variables for the main loop clock = pygame.time.Clock() running = True speed = 6 # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) mr = ml = md = mu = 0 #create portals to detect when to change map portal1 = pygame.Rect(19 * 20, 73 * 20, 5 * 20, 2 * 20) portal2 = pygame.Rect(2 * 20, 81 * 20, 40 * 20, 40) # mainloop while running: dt = clock.tick(40) ty = pk.load(open("./save.p", "rb")) # event handling for event in pygame.event.get(): menu.update_lg(l_g, c_pos) menu.update_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos, 0) menu.update_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos, 0) if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False # find directions mov = movements1.hero_move(mr, ml, md, mu, hero_pos_x, hero_pos_y, hero, speed, sprite_layers[3]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # adjust camera according to the hero's position, follow him if (hero.rect.centery >= 1280): renderer.set_camera_position(450, 1280) c_pos = (450 + 60, 1360) elif (hero.rect.centery <= 400): renderer.set_camera_position(450, 400) c_pos = (450 + 60, 400) else: renderer.set_camera_position(450, hero.rect.centery) c_pos = (450 + 60, hero.rect.centery) #place health,experience and armours interface.rect.topleft = (c_pos[0] - 512, c_pos[1] - 384) hp_sprite.rect.topleft = (c_pos[0] - 400, c_pos[1] - 382) xp_sprite.rect.topleft = (c_pos[0] - 400, c_pos[1] - 345) l_g.rect.topleft = (c_pos[0] - 508, c_pos[1] - 381) # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) #render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) ##If talk to receptionist #List Variable to check if the person has bought the room or not pos_hero = None if (flag[4] == 0 and pygame.Rect.colliderect(portal1, hero.rect) and pygame.key.get_pressed()[pygame.K_SPACE] == 1): pos_hero = menu.warning_msg(file_name, renderer, sprite_layers, screen, c_pos, 0) if pos_hero != None: hero_pos_x = pos_hero[0] hero_pos_y = pos_hero[1] ty = pk.load(open("./save.p", "rb")) if (portal2.collidepoint(hero.rect.midbottom)): pk.dump(ty, open("./save.p", "wb")) mixer.music.stop() running = False t = ty['hotel_treasure'] n = hero.rect.collidelist(pots) if n == 0 and flag[n] == 0 and t[n] == 0: ty['hp'] += 5 flag[n] = 1 t[n] = 1 elif n == 1 and flag[n] == 0 and t[n] == 0: ty['gold'] += 5 flag[n] = 1 t[n] = 1 elif n == 2 and flag[n] == 0 and t[n] == 0: ty['gold'] += 10 flag[n] = 1 t[n] = 1 elif n == 3 and flag[n] == 0 and t[n] == 0: ty['hp'] += 10 flag[n] = 1 t[n] = 1 ty['hotel_treasure'] = t pk.dump(ty, open("./save.p", "wb")) pygame.display.flip() shifty1.demo_pygame('./maps/village2_inside.tmx', 1)
def demo_pygame(file_name): """ Example showing how to use the paralax scrolling feature. """ HERO_HEALTH = 100 file = './sounds/lava_back.ogg' # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) # loading the sound files in different sound formats of mixer and main background sound in mixer stream mixer.init() sound_fall = mixer.Sound('./sounds/scream2.ogg') mixer.music.load(file) mixer.music.play(-1); # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite # use floats for hero position hero_pos_x = 32*32 #32*32 hero_pos_y = 39*32 + 20 #19*32 hero = person.create_person(hero_pos_x, hero_pos_y ,'./images/hero_u2.png') hero_width = hero.rect.width hero_height = 5 # palcing chest sprite as the key chest = person.create_person(29*32+16,17*32,'./images/closed_chest.png') # cam_offset is for scrolling cam_world_pos_x = 1024/2 cam_world_pos_y = 768/2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[3].add_sprite(hero) sprite_layers[2].add_sprite(chest) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) # variables for the main loop clock = pygame.time.Clock() running = True speed = 2.75 mr=ml=md=mu=0 lava_list = [] # setting up different direction to check for in 4 tile section of map """ In the 4 tiles to be walkable each tile among them is connected to 2 other 4 tile sections so if hero is on that tile only them the other 2 4 tile section will be isible as lava or not lava(walkable or not walkable ) stored in different dirx and diry for all 4 tiles in a 4 tile section """ dirx = [[0 for x in range(2)] for x in range(4)] diry = [[0 for x in range(2)] for x in range(4)] dirx[0][0] = -1 dirx[0][1] = 0 dirx[1][0] = 0 dirx[1][1] = 1 dirx[2][0] = -1 dirx[2][1] = 0 dirx[3][0] = 1 dirx[3][1] = 0 diry[0][0] = 0 diry[0][1] = -1 diry[1][0] = -1 diry[1][1] = 0 diry[2][0] = 0 diry[2][1] = 1 diry[3][0] = 0 diry[3][1] = 1 # string the walable path in the matrix by loading the tile data from 2nd layer of map matrix = [[None for x in range(10)] for x in range(10)] for i in range(10 ): for j in range(10): if sprite_layers[1].content2D[(10+i)*2][(10+j)*2] is None: matrix[i][j] = create_lava(10+j,10+i)#opp in case of content2D #sprite_layers[2].add_sprite(matrix[i][j]) lava_list.append(matrix[i][j].rect) #sys.stdout.write('1 ') #else: sys.stdout.write('0 ') #print " " # for storing the current visible lava and editing them dynamically along with the motion of the hero active_list = [] # stores the last position of the hero old = (-1,-1) flag =0 # 3 portals for chest and 2 gates portal1 = pygame.Rect(28*32,15*32,96,64)#key place portal2 = pygame.Rect(21*32,10*32,96,96)#left door portal3 = pygame.Rect(35*32,10*32,96,96)#right door # mainloop while running: dt = clock.tick(40) # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False # find directions #print pygame.key.get_pressed()[pygame.K_SPACE] mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[4]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] if(hero_pos_y < 20 *32): mixer.music.stop() # stopping the fast music after crossing the path of lava if(flag == 0 and portal1.collidepoint(hero.rect.midtop)): #print "collision deteected" # for checkign with the key taken from the chest if(pygame.key.get_pressed()[pygame.K_SPACE]==1): flag = 1 chest.image = pygame.image.load('./images/open_chest.png') key_riddle=person.create_person(hero.rect.centerx,hero.rect.centery+200,'./images/lava_riddle.png') sprite_layers[3].add_sprite(key_riddle) #ring_take.rect.topleft=(1,1) for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() i=0 while(i!=1): ##Infinite loop until menu is to be removed for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i=1 continue sprite_layers[3].remove_sprite(key_riddle) #print "detected key here" # code for taking key and riddle elif(flag == 1 and portal2.collidepoint(hero.rect.midtop)): # for the wronng decision start from the beginning if(pygame.key.get_pressed()[pygame.K_SPACE]==1): hero_pos_x = 32 * 32 hero_pos_y = 40 * 32 mixer.music.play() elif(flag == 1 and portal3.collidepoint(hero.rect.midtop)): #if right path chosesn changing to next map if(pygame.key.get_pressed()[pygame.K_SPACE]==1): #condition on successful transition #print "detected right path" #music.mixer.stop() portal=True running=False # checking the midbottom of hero(foot ) if found in any rectangle of the tiles in activelist then dead for i in range(len(active_list)): if(active_list[i].rect.collidepoint(hero.rect.midbottom)): hero_pos_x = 32 * 32 hero_pos_y = 40 * 32 mixer.music.stop() sound_fall.play() time.sleep(2) mixer.music.play() #updating the activelist with the position of the hero x_tile = (int)(hero_pos_x // 32) y_tile = (int)(hero_pos_y // 32) new = (x_tile, y_tile) # storing the tile numeber of the hero if(old != new): # if the hero has changed its tile only then this check will be called for fast processing if(len(active_list)>0): # emptying out the last active list while( len(active_list) > 0): sprite_layers[2].remove_sprite(active_list[0]) active_list.pop(0) # getting tile number in 4 tile section to check for which direction to select from above defined direction dataset n = get_tile_no(x_tile, y_tile) for i in range(2): # to check for the new tilesection are they in matrix laoded above x = ((x_tile + dirx[n][i])//2 - 10) y = ((y_tile + diry[n][i])//2 - 10) if( 0 <= x <10 and 0 <= y < 10 ): if(matrix[y][x] is not None and not sprite_layers[2].contains_sprite(matrix[y][x])): # appending the kill tiles in the active list sprite_layers[2].add_sprite(matrix[y][x]) active_list.append(matrix[y][x]) #renderer.set_camera_position(hero.rect.centerx, hero.rect.centery) # moving the camera positon acc to the hero location in the map cam_pos_x = hero.rect.centerx cam_pos_y = hero.rect.centery if hero.rect.centerx <= 520 : cam_pos_x = 520 elif hero.rect.centerx >=((42*32)-530): cam_pos_x = ((42*32)-530) if hero.rect.centery >= 44*32-400: cam_pos_y = 44*32-400 elif hero.rect.centery <=408: cam_pos_y = 408 renderer.set_camera_position(cam_pos_x,cam_pos_y) # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() if portal==True: palace.main()
def demo_pygame(file_name,frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() #background music tunnel2_4_sound = sound.create_music(file_name) sound.volume(tunnel2_4_sound,0.2) # create hero sprite if frm==0: hero_pos_x = 5*32 hero_pos_y = 95*32 else: hero_pos_x = 81*32 hero_pos_y = 62*32 hero = person.create_person(hero_pos_x, hero_pos_y ,'./images/hero_u2.png') # create monster sprites mon = [] mon_dir = [] mon_image = [] mon.append(person.create_person(16*32, 82*32,'./images/slime14.png')) mon.append(person.create_person(39*32, 82*32,'./images/slime14.png')) mon.append(person.create_person(50*32, 82*32,'./images/slime14.png')) mon.append(person.create_person(60*32, 82*32,'./images/slime14.png')) mon.append(person.create_person(67*32, 82*32,'./images/slime14.png')) mon.append(person.create_person(5*32, 74*32,'./images/slime14.png')) mon.append(person.create_person(5*32, 47*32,'./images/slime14.png')) mon.append(person.create_person(14*32, 47*32,'./images/slime14.png')) mon.append(person.create_person(23*32, 33*32,'./images/slime14.png')) mon.append(person.create_person(23*32, 20*32,'./images/slime14.png')) mon.append(person.create_person(20*32, 8*32,'./images/slime14.png')) mon.append(person.create_person(43*32, 8*32,'./images/slime14.png')) mon.append(person.create_person(43*32, 24*32,'./images/slime14.png')) mon.append(person.create_person(43*32, 41*32,'./images/slime14.png')) mon.append(person.create_person(49*32, 47*32,'./images/slime14.png')) mon.append(person.create_person(66*32, 47*32,'./images/slime14.png')) mon.append(person.create_person(72*32, 32*32,'./images/slime14.png')) mon.append(person.create_person(72*32, 23*32,'./images/slime14.png')) mon.append(person.create_person(72*32, 8*32,'./images/slime14.png')) mon.append(person.create_person(81*32, 8*32,'./images/slime14.png')) mon.append(person.create_person(81*32, 19*32,'./images/slime14.png')) mon.append(person.create_person(81*32, 36*32,'./images/slime14.png')) mon.append(person.create_person(81*32, 49*32,'./images/slime14.png')) mon.append(person.create_person(67*32, 64*32,'./images/slime14.png')) mon.append(person.create_person(82*32, 64*32,'./images/slime14.png')) #list to save the direcion constraints for enemy's movements mon_dir = [-1,0,-1,0,1,0,1,0,1,0,0,-1,1,0,-1,0,0,-1,0,1,1,0,-1,0,0,1,0,-1,1,0,-1,0,0,-1,0,1,1,0,-1,0,0,1,0,-1,0,1,1,0,-1,0] # cam_offset is for scrolling cam_world_pos_x = screen_width/2 cam_world_pos_y = screen_height/2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero and monsters to the the right layer sprite_layers[1].add_sprite(hero) i = 0 for i in range(len(mon)): mon_image.append(1) sprite_layers[1].add_sprite(mon[i]) # portal for entry and exit of hero portal1=pygame.Rect(4*32,96*32,3*32,2*32) portal2=pygame.Rect(85*32,61*32,1*32,3*32) # variables for the main loop clock = pygame.time.Clock() running = True # to run while loop speed = 10 # hero speed mr=ml=md=mu=0 # image variables(change images to show movements of hero) h_drctn = 'up' # direction where hero facing right now life = 1 # to keep track wheather hero is alive or not arrow_list = [] # contains a list of arrows (currently on screen) arrow_dir = [] # directions of arrows HP_MON = [10.0]*(len(mon)) # health of monster point_arrow = 10.0 # decrease in health of enemy when arrow of hero collides with enemy point_enm = 1.0 # decrease in health of hero after collision with enemy enm_speed = 8.0 # speed of enemy savegame=pk.load(open("./save.p","rb")) old_xp = savegame['xp'] old_level = savegame['h_level'] old_armor = savegame['sheild_hp'] old_arrow = savegame['arrow_count'] # interface code c_pos=[cam_world_pos_x, cam_world_pos_y] interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') # hp bar interface l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) # level and gold interface [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos) xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') # x interface xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos) f_i=menu.create_f_i(renderer,sprite_layers,screen,c_pos) # arrow,armor,sword interface interf_fight=menu.create_interface_fight(renderer,sprite_layers,screen,c_pos) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) # mainloop while running: dt = clock.tick(50) savegame=pk.load(open("./save.p","rb")) # event handling for event in pygame.event.get(): if (event.type == pygame.QUIT): running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_w and savegame['arrow_count'] > 0: enemy_attack.create_arrow(arrow_list,arrow_dir,h_drctn,hero,sprite_layers) # create arrow on pressing 'w' remove_mon(HP_MON,mon,mon_dir,mon_image,sprite_layers) # remove monster sprite if health bacomes zero savegame['arrow_count'] -= 1 # decrease the arrow count and update in the dictionary pk.dump(savegame,open("./save.p","wb")) # save the changes of dictionary elif event.key == pygame.K_a: # attack with sword on pressing 'a' enemy_attack.attack(h_drctn,hero,mon,HP_MON) remove_mon(HP_MON,mon,mon_dir,mon_image,sprite_layers) # interface update menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) menu.update_f_i(f_i,c_pos) # calling hero_move() function for hero's movements mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[3]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # to detect the direction of hero if(mu>1): h_drctn='up' elif(mr>1): h_drctn='right' elif(md>1): h_drctn='down' elif(ml>1): h_drctn='left' # decresing the HP of player if collides any of the monsters # if HP becomes zero then start the game again for i in range(len(mon)): if pygame.sprite.collide_rect(hero,mon[i]): ouch_sound = sound.create_soundfx('./sounds/weapon_touch.ogg') sound.volume(ouch_sound,0.4) if savegame['sheild_hp']>0: savegame['sheild_hp'] -= (point_enm/2) savegame['hp'] -= (point_enm/2) if savegame['sheild_hp']<0: savegame['sheild_hp'] = 0 else : savegame['hp'] -= point_enm if savegame['hp'] <= 0: sound.stop_soundfx(tunnel2_4_sound) savegame['xp'] = old_xp savegame['h_level'] = old_level savegame['sheild_hp'] = old_armor savegame['arrow_count'] = old_arrow savegame['hp'] = savegame['max_hp'] pk.dump(savegame,open("./save.p","wb")) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) life = 0 running = False pk.dump(savegame,open("./save.p","wb")) (mon_dir,mon,mon_image) = move_mon(mon_dir,mon,mon_image,sprite_layers,enm_speed) # monsters's movement enemy_attack.remove_arrow(arrow_list,mon,HP_MON,arrow_dir,sprite_layers,point_arrow) # remove arrow if it goes out of the screen remove_mon(HP_MON,mon,mon_dir,mon_image,sprite_layers) # remove monsters menu.update_lg(l_g,c_pos) #interface update # adjust camera according to the hero's position, follow him # (don't make the hero follow the cam, maybe later you want different # objects to be followed by the cam) cam_pos_x = hero.rect.centerx cam_pos_y = hero.rect.centery if hero.rect.centerx <= 520 : cam_pos_x = 520 elif hero.rect.centerx >=2336: cam_pos_x = 2336 if hero.rect.centery >= 2875: cam_pos_y = 2875 elif hero.rect.centery <=408: cam_pos_y = 408 renderer.set_camera_position(cam_pos_x,cam_pos_y) # interface update c_pos=(cam_pos_x,cam_pos_y) interface.rect.topleft=(c_pos[0]-512,c_pos[1]-384) hp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-382) xp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-345) l_g.rect.topleft=(c_pos[0]-508,c_pos[1]-381) f_i.rect.bottomright=(c_pos[0]+500,c_pos[1]+350) interf_fight.rect.bottomright=(c_pos[0]+512,c_pos[1]+384) # next map if pygame.Rect.colliderect(hero.rect,portal1) or pygame.Rect.colliderect(hero.rect,portal2) : portal=True sound.stop_soundfx(tunnel2_4_sound) running=False # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) # Game restarts if life == 0: demo_pygame('./maps/tunnel2_4.tmx',0) elif portal==True: shifty1.demo_pygame('./maps/village1.tmx',1)
def demo_pygame(file_name): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) mixer.init() # loading the sound files in different sound formats of mixer and main background sound in mixer stream fish_catch = mixer.Sound('./sounds/zish_catch.ogg') file = './sounds/zish_back.ogg' mixer.music.load(file) mixer.music.play(-1) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite # use floats for hero position hero_pos_x = 1048/2 hero_pos_y = 768/2 + 6 *32 hero = create_hero(hero_pos_x, hero_pos_y) hero_width = 31 hero_height = 5 # creating random fish fishes = [] fish_count =10 fish_loc = [] for i in range(fish_count): fishes.append(create_fish()) #Storing the fishes in an array for further addition for i in range(fish_count): fish_loc.append(fishes[i].rect) # for different directions different images to be set on the moving fish. im1 = pygame.image.load('./images/ztile1.png') im2 = pygame.image.load('./images/ztile2.png') # cam_offset is for scrolling cam_world_pos_x = screen_width/2 cam_world_pos_y = screen_height/2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # adding the hero and the firshes to the the right layer sprite_layers[1].add_sprite(hero) flag = [0 for x in range(fish_count)] #small fishes added in bottom of screen showing the count of remaining fishes left to complete the game small_fish = [] for i in range(fish_count): small_fish.append(person.create_person(64 +i*32,22*32,'./images/ztile_small.png')) for i in range(len(flag)): sprite_layers[1].add_sprite(fishes[i]) for i in range(len(flag)): sprite_layers[1].add_sprite(small_fish[i]) # variables for the main loop clock = pygame.time.Clock() running = True speed_x = 0.0 speed_y = 0.0 #initializing random values for the direction of 10 fishes for i in range(len(flag)): flag[i]=random.randint(1,2) # mainloop # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 10000) while running: dt = clock.tick(50) # value set to work same with different processors # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # showing the fps elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False # deciding fish speed at each instant along with the need to change direction with another function for i in range(len(flag)): f_temp_x = fishes[i].rect.centerx f_temp_y = fishes[i].rect.centery if(flag[i]==0): flag[i] = random.randint(1,2) if(flag[i]==1): f_temp_x+= random.randint(6,11) else: f_temp_x-= random.randint(6,11) f_temp_x, f_temp_y, flag[i] = dist_bound_x(f_temp_x,f_temp_y,flag[i]) # returns new position with direction flag if(flag[i]==1): fishes[i].image = im2 else: fishes[i].image = im1 # assiging the new final positon of every fish in every tick fishes[i].rect.centerx = f_temp_x fishes[i].rect.centery = f_temp_y fish_loc[i] = fishes[i].rect # find directions direction_x = pygame.key.get_pressed()[pygame.K_RIGHT] - pygame.key.get_pressed()[pygame.K_LEFT] direction_y = pygame.key.get_pressed()[pygame.K_DOWN] - pygame.key.get_pressed()[pygame.K_UP] # make sure the hero moves with same speed in all directions (diagonal!) speed_x+= direction_x*0.0056 speed_y+= direction_y*0.0056 dir_len = math.hypot(direction_x, direction_y) dir_len = dir_len if dir_len else 1.0 if(math.fabs(speed_x)>0.74): if(speed_x>0): speed_x = 0.7 else: speed_x = - 0.7 # update position step_x = speed_x * 36 / dir_len step_y = speed_y * 36 / dir_len step_x, step_y = check_collision(hero_pos_x, hero_pos_y, step_x, step_y, hero_width, hero_height, sprite_layers[3]) # to check collision from boundary for the hook hero_pos_x += step_x hero_pos_y += step_y if(step_x == 0): speed_x =0.0 if(step_y == 0): speed_y =0.0 hero.rect.center = (hero_pos_x, hero_pos_y) # checking for the contact with the hook midtop for catching fish flag = fish_collision(fish_loc, hero.rect, flag) i=0 # always check for any value in flag to be 0 if yes to remove that fish while(i<len(flag)): #print i if(flag[i] == 0): fish_catch.play() sprite_layers[1].remove_sprite(fishes[i]) # removing big fish from big screen flag.pop(i) sprite_layers[1].remove_sprite(small_fish[len(flag)]) # removing small fish from big screen fishes.pop(i) fish_loc.pop(i) continue i+=1 #print("cleared here") # synchronizing fishes sound along with their catch. if(len(flag)==0): mixer.music.stop() sv=pk.load(open("./save.p","rb")) sv['f_vil']=1 sv['talk_vil']['./maps/village2_out1.tmx'][0]=1 pk.dump(sv,open("./save.p","wb")) # saving the results in the file to check for the next time in the story where to go or not to go running=False # adjust camera according to the hero's position, follow him screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() # calling the other map after completion of catching all the fishes shifty1.demo_pygame('./maps/village2_out1.tmx',2)
def demo_pygame(file_name,frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) mixer.init() # background music file = './sounds/hotel.ogg' m = mixer.music.load(file) mixer.music.play(-1); #set up a screen screen_width = min(900, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite hero_pos_x = 200 hero_pos_y = 1600 hero = person.create_person(hero_pos_x, hero_pos_y ,'./images/hero_u2.png') # dimensions of the hero for collision detection hero_width = hero.rect.width hero_height = 5 # cam_offset is for scrolling cam_world_pos_x = hero.rect.centerx cam_world_pos_y = hero.rect.centery # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[2].add_sprite(hero) # add pots positions ty=pk.load(open("./save.p","rb")) t=ty['hotel_treasure'] pots_pos_x=[100,520,800,180] pots_pos_y=[960,960,820,120] pots=[] flag=[0,0,0,0,0] for i in range(4): if t[i]==0 : pots.append(create_pot(pots_pos_x[i], pots_pos_y[i])); c_pos=[cam_world_pos_x, cam_world_pos_y] ty=pk.load(open("./save.p","rb")) hp=ty['hp'] hp_max=ty['max_hp'] interf_toggle=0 interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos) xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos) # variables for the main loop clock = pygame.time.Clock() running = True speed=6 # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT,1000) mr=ml=md=mu=0 #create portals to detect when to change map portal1 = pygame.Rect(19*20,73*20,5*20,2*20) portal2 = pygame.Rect(2*20,81*20,40*20,40) # mainloop while running: dt = clock.tick(40) ty=pk.load(open("./save.p","rb")) # event handling for event in pygame.event.get(): menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False # find directions mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[3]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # adjust camera according to the hero's position, follow him if ( hero.rect.centery >=1280): renderer.set_camera_position(450, 1280) c_pos=(450+60,1360) elif (hero.rect.centery <=400): renderer.set_camera_position(450, 400) c_pos=(450+60,400) else: renderer.set_camera_position(450,hero.rect.centery ) c_pos=(450+60,hero.rect.centery) #place health,experience and armours interface.rect.topleft=(c_pos[0]-512,c_pos[1]-384) hp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-382) xp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-345) l_g.rect.topleft=(c_pos[0]-508,c_pos[1]-381) # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) #render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) ##If talk to receptionist #List Variable to check if the person has bought the room or not pos_hero=None if(flag[4] == 0 and pygame.Rect.colliderect(portal1,hero.rect) and pygame.key.get_pressed()[pygame.K_SPACE]==1): pos_hero=menu.warning_msg(file_name,renderer,sprite_layers,screen,c_pos,0) if pos_hero!=None: hero_pos_x=pos_hero[0] hero_pos_y= pos_hero[1] ty=pk.load(open("./save.p","rb")) if(portal2.collidepoint(hero.rect.midbottom)): pk.dump(ty,open("./save.p","wb")) mixer.music.stop() running=False t=ty['hotel_treasure'] n=hero.rect.collidelist(pots) if n== 0 and flag[n]==0 and t[n]==0 : ty['hp']+=5 flag[n]=1 t[n]=1 elif n==1 and flag[n]==0 and t[n]==0 : ty['gold']+=5 flag[n]=1 t[n]=1 elif n==2 and flag[n]==0 and t[n]==0 : ty['gold']+=10 flag[n]=1 t[n]=1 elif n==3 and flag[n]==0 and t[n]==0 : ty['hp']+=10 flag[n]=1 t[n]=1 ty['hotel_treasure']=t pk.dump(ty,open("./save.p","wb")) pygame.display.flip() shifty1.demo_pygame('./maps/village2_inside.tmx',1)
def test_create_person(self): id = create_person('Fred', 'Bloggs', 'sysadmin') self.assertTrue(id > 0)
def demo_pygame(file_name, frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode( file_name) # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() #background music tunnel2_4_sound = sound.create_music(file_name) sound.volume(tunnel2_4_sound, 0.2) # create hero sprite if frm == 0: hero_pos_x = 5 * 32 hero_pos_y = 95 * 32 else: hero_pos_x = 81 * 32 hero_pos_y = 62 * 32 hero = person.create_person(hero_pos_x, hero_pos_y, './images/hero_u2.png') # create monster sprites mon = [] mon_dir = [] mon_image = [] mon.append(person.create_person(16 * 32, 82 * 32, './images/slime14.png')) mon.append(person.create_person(39 * 32, 82 * 32, './images/slime14.png')) mon.append(person.create_person(50 * 32, 82 * 32, './images/slime14.png')) mon.append(person.create_person(60 * 32, 82 * 32, './images/slime14.png')) mon.append(person.create_person(67 * 32, 82 * 32, './images/slime14.png')) mon.append(person.create_person(5 * 32, 74 * 32, './images/slime14.png')) mon.append(person.create_person(5 * 32, 47 * 32, './images/slime14.png')) mon.append(person.create_person(14 * 32, 47 * 32, './images/slime14.png')) mon.append(person.create_person(23 * 32, 33 * 32, './images/slime14.png')) mon.append(person.create_person(23 * 32, 20 * 32, './images/slime14.png')) mon.append(person.create_person(20 * 32, 8 * 32, './images/slime14.png')) mon.append(person.create_person(43 * 32, 8 * 32, './images/slime14.png')) mon.append(person.create_person(43 * 32, 24 * 32, './images/slime14.png')) mon.append(person.create_person(43 * 32, 41 * 32, './images/slime14.png')) mon.append(person.create_person(49 * 32, 47 * 32, './images/slime14.png')) mon.append(person.create_person(66 * 32, 47 * 32, './images/slime14.png')) mon.append(person.create_person(72 * 32, 32 * 32, './images/slime14.png')) mon.append(person.create_person(72 * 32, 23 * 32, './images/slime14.png')) mon.append(person.create_person(72 * 32, 8 * 32, './images/slime14.png')) mon.append(person.create_person(81 * 32, 8 * 32, './images/slime14.png')) mon.append(person.create_person(81 * 32, 19 * 32, './images/slime14.png')) mon.append(person.create_person(81 * 32, 36 * 32, './images/slime14.png')) mon.append(person.create_person(81 * 32, 49 * 32, './images/slime14.png')) mon.append(person.create_person(67 * 32, 64 * 32, './images/slime14.png')) mon.append(person.create_person(82 * 32, 64 * 32, './images/slime14.png')) #list to save the direcion constraints for enemy's movements mon_dir = [ -1, 0, -1, 0, 1, 0, 1, 0, 1, 0, 0, -1, 1, 0, -1, 0, 0, -1, 0, 1, 1, 0, -1, 0, 0, 1, 0, -1, 1, 0, -1, 0, 0, -1, 0, 1, 1, 0, -1, 0, 0, 1, 0, -1, 0, 1, 1, 0, -1, 0 ] # cam_offset is for scrolling cam_world_pos_x = screen_width / 2 cam_world_pos_y = screen_height / 2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [ layer for layer in sprite_layers if not layer.is_object_group ] # add the hero and monsters to the the right layer sprite_layers[1].add_sprite(hero) i = 0 for i in range(len(mon)): mon_image.append(1) sprite_layers[1].add_sprite(mon[i]) # portal for entry and exit of hero portal1 = pygame.Rect(4 * 32, 96 * 32, 3 * 32, 2 * 32) portal2 = pygame.Rect(85 * 32, 61 * 32, 1 * 32, 3 * 32) # variables for the main loop clock = pygame.time.Clock() running = True # to run while loop speed = 10 # hero speed mr = ml = md = mu = 0 # image variables(change images to show movements of hero) h_drctn = 'up' # direction where hero facing right now life = 1 # to keep track wheather hero is alive or not arrow_list = [] # contains a list of arrows (currently on screen) arrow_dir = [] # directions of arrows HP_MON = [10.0] * (len(mon)) # health of monster point_arrow = 10.0 # decrease in health of enemy when arrow of hero collides with enemy point_enm = 1.0 # decrease in health of hero after collision with enemy enm_speed = 8.0 # speed of enemy savegame = pk.load(open("./save.p", "rb")) old_xp = savegame['xp'] old_level = savegame['h_level'] old_armor = savegame['sheild_hp'] old_arrow = savegame['arrow_count'] # interface code c_pos = [cam_world_pos_x, cam_world_pos_y] interface = menu.create_interface(renderer, sprite_layers, screen, c_pos) hp_sprite = person.create_person(c_pos[0], c_pos[1], './images/hp_bar.png') # hp bar interface l_g = menu.create_l_g(renderer, sprite_layers, screen, c_pos) # level and gold interface [hp_sprite, hp] = menu.create_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos) xp_sprite = person.create_person(c_pos[0], c_pos[1], './images/exp_bar.png') # x interface xp_sprite = menu.create_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos) f_i = menu.create_f_i(renderer, sprite_layers, screen, c_pos) # arrow,armor,sword interface interf_fight = menu.create_interface_fight(renderer, sprite_layers, screen, c_pos) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) # mainloop while running: dt = clock.tick(50) savegame = pk.load(open("./save.p", "rb")) # event handling for event in pygame.event.get(): if (event.type == pygame.QUIT): running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_w and savegame['arrow_count'] > 0: enemy_attack.create_arrow( arrow_list, arrow_dir, h_drctn, hero, sprite_layers) # create arrow on pressing 'w' remove_mon( HP_MON, mon, mon_dir, mon_image, sprite_layers ) # remove monster sprite if health bacomes zero savegame[ 'arrow_count'] -= 1 # decrease the arrow count and update in the dictionary pk.dump(savegame, open("./save.p", "wb")) # save the changes of dictionary elif event.key == pygame.K_a: # attack with sword on pressing 'a' enemy_attack.attack(h_drctn, hero, mon, HP_MON) remove_mon(HP_MON, mon, mon_dir, mon_image, sprite_layers) # interface update menu.update_lg(l_g, c_pos) menu.update_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos, 0) menu.update_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos, 0) menu.update_f_i(f_i, c_pos) # calling hero_move() function for hero's movements mov = movements1.hero_move(mr, ml, md, mu, hero_pos_x, hero_pos_y, hero, speed, sprite_layers[3]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # to detect the direction of hero if (mu > 1): h_drctn = 'up' elif (mr > 1): h_drctn = 'right' elif (md > 1): h_drctn = 'down' elif (ml > 1): h_drctn = 'left' # decresing the HP of player if collides any of the monsters # if HP becomes zero then start the game again for i in range(len(mon)): if pygame.sprite.collide_rect(hero, mon[i]): ouch_sound = sound.create_soundfx('./sounds/weapon_touch.ogg') sound.volume(ouch_sound, 0.4) if savegame['sheild_hp'] > 0: savegame['sheild_hp'] -= (point_enm / 2) savegame['hp'] -= (point_enm / 2) if savegame['sheild_hp'] < 0: savegame['sheild_hp'] = 0 else: savegame['hp'] -= point_enm if savegame['hp'] <= 0: sound.stop_soundfx(tunnel2_4_sound) savegame['xp'] = old_xp savegame['h_level'] = old_level savegame['sheild_hp'] = old_armor savegame['arrow_count'] = old_arrow savegame['hp'] = savegame['max_hp'] pk.dump(savegame, open("./save.p", "wb")) menu.update_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos, 0) life = 0 running = False pk.dump(savegame, open("./save.p", "wb")) (mon_dir, mon, mon_image) = move_mon(mon_dir, mon, mon_image, sprite_layers, enm_speed) # monsters's movement enemy_attack.remove_arrow( arrow_list, mon, HP_MON, arrow_dir, sprite_layers, point_arrow) # remove arrow if it goes out of the screen remove_mon(HP_MON, mon, mon_dir, mon_image, sprite_layers) # remove monsters menu.update_lg(l_g, c_pos) #interface update # adjust camera according to the hero's position, follow him # (don't make the hero follow the cam, maybe later you want different # objects to be followed by the cam) cam_pos_x = hero.rect.centerx cam_pos_y = hero.rect.centery if hero.rect.centerx <= 520: cam_pos_x = 520 elif hero.rect.centerx >= 2336: cam_pos_x = 2336 if hero.rect.centery >= 2875: cam_pos_y = 2875 elif hero.rect.centery <= 408: cam_pos_y = 408 renderer.set_camera_position(cam_pos_x, cam_pos_y) # interface update c_pos = (cam_pos_x, cam_pos_y) interface.rect.topleft = (c_pos[0] - 512, c_pos[1] - 384) hp_sprite.rect.topleft = (c_pos[0] - 400, c_pos[1] - 382) xp_sprite.rect.topleft = (c_pos[0] - 400, c_pos[1] - 345) l_g.rect.topleft = (c_pos[0] - 508, c_pos[1] - 381) f_i.rect.bottomright = (c_pos[0] + 500, c_pos[1] + 350) interf_fight.rect.bottomright = (c_pos[0] + 512, c_pos[1] + 384) # next map if pygame.Rect.colliderect(hero.rect, portal1) or pygame.Rect.colliderect( hero.rect, portal2): portal = True sound.stop_soundfx(tunnel2_4_sound) running = False # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) (renderer, sprite_layers, screen) = render_update(renderer, sprite_layers, screen) # Game restarts if life == 0: demo_pygame('./maps/tunnel2_4.tmx', 0) elif portal == True: shifty1.demo_pygame('./maps/village1.tmx', 1)
def demo_pygame(file_name,frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # loading the sound files in different sound formats of mixer and main background sound in mixer stream mixer.init() sound_guard_watch = mixer.Sound('./sounds/pain.ogg') sound_hole_fall = mixer.Sound('./sounds/scream2.ogg') file = './sounds/zrap_back.ogg' mixer.music.load(file) mixer.music.play(-1) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite # use floats for hero position hero_pos_x = 3 * 32 hero_pos_y = 21 * 32 hero = person.create_person(hero_pos_x, hero_pos_y,'./images/hero_u2.png') hero_width = hero.rect.width hero_height = 5 # laoding the scroll map_trap = person.create_person(8*32+16,3*32 +30,'./images/map_trap.png') #creating the 3 guards guard = [] guard_pos_x = random.randint(10*32, 18*32) guard_pos_y = 18*32 guard.append(create_guard(guard_pos_x,guard_pos_y)) guard.append(create_guard(random.randint(22*32,31*32),15*32)) guard.append(create_guard(random.randint(22*32,31*32),6*32)) # field of view of different guards # collision with this tile is death for hero danger = [] # kill flag for last trap tile of pins from ground showkillbill=0 # creating the pintrap but not adding to the sprite killbill = create_kill(18*32, 8*32 + 48) hole = create_hole(18*32, 2*32) danger_count =140 + 1 # for kill tile # intersect tiles for nullyfying guard filed of view near stones intersect1 = [] for i in range(5): for j in range(5): intersect1.append(create_dang(13 *32 + j*16 + 16, (21 * 32 -16) + i*16 )) intersect2 = [] for i in range(5): for j in range(5): intersect2.append(create_dang(13 *32 + j*16 + 48, (21 * 32 -16) + i*16 )) for i in range(danger_count-1): danger.append(create_dang(100,100)) # dimensions of the hero for collision detection # cam_offset is for scrolling cam_world_pos_x = 512 cam_world_pos_y = 768 / 2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # adding the hero and the danger and the traps to the the right layer sprite_layers[4].add_sprite(hero) sprite_layers[4].add_sprite(guard[0]) sprite_layers[4].add_sprite(guard[1]) sprite_layers[4].add_sprite(guard[2]) sprite_layers[2].add_sprite(map_trap) for i in range(56,len(danger)): sprite_layers[1].add_sprite(danger[i]) sprite_layers[3].add_sprite(hole) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) # variables for the main loop cross_guards =0 clock = pygame.time.Clock() running = True speed = 3.6505 flag1 = random.randint(1,2) flag2 = random.randint(1,2) flag3 = random.randint(1,2) count = -1 mr=ml=md=mu=0 kill_active =0 portal1 = pygame.Rect(7*32,2*32,96,64) # mainloop while running: """ for 3 guards flag1 flag2 flag3 for their directions in horizontal direction """ dt = clock.tick(35) # for guard1 movement here if(flag1 == 1): if(guard[0].rect.centerx < 10 * 32 ): flag1 = 2 else : guard[0].rect.centerx-= 2 elif (flag1 == 2): if(guard[0].rect.centerx > 18 * 32 ): flag1 = 1 else : guard[0].rect.centerx+=2 index=0 #updating the danger tiles for the first guard if(flag1==1): for i in range(10,0,-1): for j in range(i): danger[index].rect.center = ((guard[0].rect.centerx - j * 16),(guard[0].rect.centery + (10-i) * 16) ) index+= 1 elif(flag1==2): for i in range(10,0,-1): for j in range(i): danger[index].rect.center = ((guard[0].rect.centerx + j * 16),(guard[0].rect.centery + (10-i) * 16) ) index+= 1 # for guard 2 movement here if(flag2 == 1): if(guard[1].rect.centerx < 22 * 32 ): flag2 = 2 else : guard[1].rect.centerx-= 2 elif (flag2 == 2): if(guard[1].rect.centerx > 31 * 32 ): flag2 = 1 else : guard[1].rect.centerx+=2 #updating the danger tiles for the first guard if(flag2==1): for i in range(7,0,-1): for j in range(i): danger[index].rect.center = ((guard[1].rect.centerx - j *16 ), (guard[1].rect.centery + (7 - i) * 16)) #danger[index].rect.center = ((guard[1].rect.centerx - j *16 ), (guard[1].rect.centery - (i * 16))) index+=1 for i in range(0,7): for j in range(i): #danger[index].rect.center = ((guard[1].rect.centerx - j *16 ), (guard[1].rect.centery + (7 - i) * 16)) danger[index].rect.center = ((guard[1].rect.centerx - j *16 ), (guard[1].rect.centery - (7-i) * 16)) index+=1 if(flag2==2): for i in range(7,0,-1): for j in range(i): danger[index].rect.center = ((guard[1].rect.centerx + j *16 ), (guard[1].rect.centery + (7 - i) * 16)) index+=1 for i in range(0,7): for j in range(i): danger[index].rect.center = ((guard[1].rect.centerx + j *16 ), (guard[1].rect.centery - (7-i) * 16)) index+=1 # for guard 3 movement here if(flag3 == 1): if(guard[2].rect.centerx < 22 * 32 ): flag3 = 2 else : guard[2].rect.centerx-= 2 elif (flag3 == 2): if(guard[2].rect.centerx > 31 * 32 ): flag3 = 1 else : guard[2].rect.centerx+=2 #updating the danger tiles for the first guard if(flag3==1): for i in range(6,0,-1): for j in range(i): danger[index].rect.center = ((guard[2].rect.centerx - j *16 ), (guard[2].rect.centery + (6 - i) * 16)) index+=1 for i in range(0,6): for j in range(i): danger[index].rect.center = ((guard[2].rect.centerx - j *16 ), (guard[2].rect.centery - (6-i) * 16)) index+=1 if(flag3==2): for i in range(6,0,-1): for j in range(i): danger[index].rect.center = ((guard[2].rect.centerx + j *16 ), (guard[2].rect.centery + (6 - i) * 16)) index+=1 for i in range(0,6): for j in range(i): danger[index].rect.center = ((guard[2].rect.centerx + j *16 ), (guard[2].rect.centery - (6-i) * 16)) index+=1 #taking map and map change condition here with the scroll if(portal1.collidepoint(hero.rect.midtop) and pygame.key.get_pressed()[pygame.K_SPACE]==1): sprite_layers[2].remove_sprite(map_trap) mixer.music.stop() sv=pk.load(open("./save.p","rb")) #saving the data in the file sv['pirate_map']=1 sv['pirate_vil']=1 sv['talk_vil']['./maps/ship.tmx'][0]=1 pk.dump(sv,open("./save.p","wb")) portal=True # now change map after end of the loop at the end of the loop running=False # checking collision in red zone for i in range(len(danger)): if(pygame.sprite.collide_rect(hero,danger[i])): """ to palce the hero to starting position if it the redzone is not in intersect field if false is 0 then the hero is moved to the initial position the intersect case is only for the first guard """ false =0 if (flag1==1): for j in range(len(intersect1)): if(pygame.sprite.collide_rect(danger[i],intersect1[j])): false =1 if(false == 0): #print hero.rect.center hero_pos_x = 3*32 hero_pos_y = 21*32 mixer.music.stop() sound_guard_watch.play() time.sleep(1) mixer.music.play() #print hero.rect.center break elif (flag1==2): for j in range(len(intersect2)): if(pygame.sprite.collide_rect(danger[i],intersect2[j])): false =1 if(false == 0): #print hero.rect.center hero_pos_x = 3*32 hero_pos_y = 21*32 mixer.music.stop() sound_guard_watch.play() time.sleep(1) mixer.music.play() #print hero.rect.center break # after crossing #stroing the hole image size for changing it later when hero crossing r1 = hole.rect im = hole.image r2= im.get_rect() w = r2.width """ cross_guards storing the checkpoint of the hero 1 after crossing all the guards 2 after crossing the hole """ if(count > 0): count+= 1 if (hero_pos_y < 3*32 ): cross_guards = 1; #print cross_guards if(cross_guards ==1 and hero_pos_x < 20 * 32 and hero_pos_y < 3*32): r1 = hole.rect im = hole.image r2= im.get_rect() w = r2.width # if hole is large to limit hero falls and sent to starting position if(w<60): im = pygame.transform.scale(im,(w+2,w+2)) r = im.get_rect() r.center = r1.center hole.image = im hole.rect = r else: cross_guards = 0; hero_pos_x = 3*32 hero_pos_y = 21*32 mixer.music.stop() sound_hole_fall.play() time.sleep(1) im = pygame.transform.scale(im,(12,12)) r = im.get_rect() r.center = r1.center hole.image = im hole.rect = r mixer.music.play() # condition that hero has crossed the hole trap count for pin from ground is started #showkillbill is bool value for activating the pin ground trap elif(cross_guards == 1 and hero_pos_x < 19 *32 and hero_pos_y > 3*32): cross_guards =2 count = 1 elif(cross_guards == 2 and not showkillbill == 1): showkillbill = 1 elif (cross_guards == 2 and hero_pos_y > 16 *32): cross_guards = 0 im = pygame.transform.scale(im,(12,12)) r = im.get_rect() r.center = r1.center hole.image = im hole.rect = r # sendin the hero back to start from position if collsion of midbottom with pin trap if(kill_active==1): if(killbill.rect.collidepoint(hero.rect.midbottom)): cross_guards = 0; hero_pos_x = 3*32 hero_pos_y = 21*32 mixer.music.stop() sound_guard_watch.play() time.sleep(1) im = pygame.transform.scale(im,(12,12)) r = im.get_rect() r.center = r1.center hole.image = im hole.rect = r mixer.music.play() # timed fluctuation of the pin trap if(showkillbill == 1 and count > 56): count = 1 if(sprite_layers[3].contains_sprite(killbill)): sprite_layers[3].remove_sprite(killbill) kill_active=0 else: sprite_layers[3].add_sprite(killbill) kill_active=1 # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False # calling the hero_move fucntion from movements1 file for changing the position of the hero mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[5]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() if portal==True: shifty1.demo_pygame('./maps/ship.tmx',1)
def main(): pygame.init() screen = pygame.display.set_mode((640, 480), 0, 32) background = pygame.image.load("test/mario/mario_background.png").convert() screen_speed = 10 screen_x = 0 buf_scr = pygame.Surface(background.get_size()) buf_scr.blit(background, (0, 0)) mario = person.create_person('test/mario.xml') princess = person.create_person('test/princess.xml'); mario.set_state('moving') mario.rect = Rect(100, 307, 90, 90) mario.update_speed(11, 0) princess.set_state('still') princess.rect = Rect(1200, 300, 90, 90) speaker = speak.Speaker() pygame.mixer.init(speaker.framerate, speaker.sampwidth*8, speaker.nchannels, 4096) portrait = None text_bg = pygame.Surface((640, 120)) ar = pygame.PixelArray(text_bg) text_bg_color = (50, 50, 192) ar[:] = text_bg_color del ar text_bg.set_alpha(125) clock = pygame.time.Clock() while True: for event in pygame.event.get(): if event.type in (QUIT, KEYDOWN): return buf_scr.blit(background, (0, 0)) if mario.state == 'moving' and mario.rect.right >= princess.rect.left: mario.update_speed(0, 0) mario.set_state('speaking') sound = read_script(speaker) portrait = mario.get_portrait(); portrait = pygame.transform.smoothscale(portrait, (105,240)) elif mario.state == 'speaking' and not sound.get_busy(): mario.set_state('still') portrait = None mario.update() buf_scr.blit(mario.image, mario.rect) princess.update() buf_scr.blit(princess.image, princess.rect) if (screen_x < background.get_width() - 640) : screen_x += screen_speed screen.blit(buf_scr.subsurface((screen_x, 0, 640, 480)), (0, 0)) if portrait != None: font = pygame.font.Font(None, 30) text = mario.name size = font.size(text) fr = font.render(text, 0, (255,255,255)) tab = build_name_tab((size[0]+10, size[1]+5), text_bg_color) screen.blit(tab, (105, 360-tab.get_height())) screen.blit(fr, (110, 360-fr.get_height()-1)) screen.blit(text_bg, (0, 360, 640, 120)) screen.blit(portrait, (0, 240, 105, 240)) font = pygame.font.Font(os.environ['SYSTEMROOT'] + '\\Fonts\\simkai.ttf', 30) fr = font.render(u'æˆ‘çˆ±ä½ ', 0, (255,255,255)) screen.blit(fr, (110, 360+10)) pygame.display.update() clock.tick(30)
def demo_pygame(file_name,frm): ##FILE NAME GIVES THE CURRENT MAP if(file_name=='./maps/tunnel3.tmx'): tunnel3.main() elif(file_name=='./maps/tunnel.tmx'): goodtunnel.main() elif(file_name=='./maps/mountainclimbing.tmx'): climb_mountain.main() elif(file_name=='./maps/maze.tmx'): maze_code.main() elif(file_name=='./maps/maze2.tmx'): maze_code2.main() elif(file_name=='./maps/hotel.tmx'): hotel.main() elif(file_name=='./maps/tunnel2_4.tmx'): tunnel2_4.main(frm) elif(file_name=='./maps/palace.tmx'): pal_lava.main() elif(file_name=='./maps/palace_final.tmx'): palace.main() # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() #loading the main dictionary into "savegame" #pk.dump(savegame,open("./save.p","wb")) -> donates dumping/saving the updated #dictionaty "savegame" to the "save.p" file so that can be used again with the updated values savegame=pk.load(open("./save.p","rb")) ##Creating hero #getting the entry position depending on the map starting = entry(file_name,frm) hero_pos_x = starting[0] hero_pos_y = starting[1] #creating the hero sprite hero = person.create_person(hero_pos_x, hero_pos_y,'./images/hero_d2.png') ##Creating villagers #villager count is 0 if no villager on the current map vcount=0 #defining the villager directions muv='up' mdv='down' mrv='right' mlv='left' #no direction -> not moving no='' #creating the villager sprites #villagers created according to map vil=person.create_villager(file_name) vcount=len(vil) ##Giving initial random direction to every villager #initializing the variable drc=no #the villager direction list drctn = [] #using randint to decide direction for i in range(0,vcount): a=random.randint(1,10) if(a==1): drc=muv elif(a==2): drc=mrv elif(a==3): drc=mdv elif(a==4): drc=mlv elif (a<=10): drc=no drctn.append(drc) # cam_offset is for scrolling cam_world_pos_x = hero.rect.centerx cam_world_pos_y = hero.rect.centery # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[1].add_sprite(hero) ##Adding the villager sprites i=0 for i in range(0,vcount): sprite_layers[1].add_sprite(vil[i]['sprte']) ##Misc object sprites #creating the sprite misc=person.create_misc(file_name) #adding the sprites if misc!=None: mcount=len(misc) i=0 while(i>=0 and i<mcount): ##check if any misc is already taken if (savegame[misc[i]['name']]==0): sprite_layers[1].add_sprite(misc[i]['sprte']) i+=1 else: misc.pop(i) mcount=len(misc) # variables for the main loop clock = pygame.time.Clock() running = True speed = 4 ##Sign board for the tunnel riddle portal_board=None if(file_name=='./maps/village1.tmx'): portal_board=pygame.Rect(81*32,9*32,40,80) signboard=person.create_person(81*32,9*32,'./images/signboard.png') sprite_layers[2].add_sprite(signboard) ##The variables for changing the movement pictures -> to give animation to movement mr=ml=md=mu=0 vmr=vml=vmd=vmu=0 # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) #Creating portals -> For map changing portals = person.create_portal(file_name) #Creating the shopping portal shop_portal=person.create_shop_portal(file_name) #Variable for the quests/tasks/side missions villager_job=0 #To check if ship is on the shore in "Ship.tmx" map (pirate ship) ship_present=0 #Initial value of portal -> if True -> map changes portal=False #check for the river sound in Burning village map -> heard only if close to river flag_crossed=0 #This is check for talking to villager -> talks to villager-> shows the first dialog box-> if 1 count=0 ###FOR INTERFACE #initiaizing variables from savegame hp=savegame['hp'] hp_max=savegame['max_hp'] #camera postion stored in c_pos c_pos=camra.camera(file_name,renderer,hero) #variable for turning the interface on and off interf_toggle=0 #creating the background for health bar, xp bar interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) #creating the health bar sprite and creating the bar hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos) #creating the xp bar sprite and creating the bar xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos) #creating the level and gold sprite l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) #creating the weapons interface background and values f_i=menu.create_f_i(renderer,sprite_layers,screen,c_pos) interf_fight=menu.create_interface_fight(renderer,sprite_layers,screen,c_pos) ##Aditional background music that turns onn and off add=None #Creating the main background music musicbg=sound.create_music(file_name) #Creating the additional full time running background music if file_name=='./maps/village2_out1.tmx': music_add=sound.create_music_add('./sounds/vil2add.ogg') #--------------------------------------- """MAIN GAME LOOP""" while running: #fixing the FPS dt = clock.tick(50) ##Checking for map exit -> -1 no change -> !=-1 Specific portal number change_map = exit_map(hero,portals) if change_map!=-1: portal = True #Giving the nextmap's name and frm -> "frm"-> tells if the player came from which map # -> to give the respective starting position nextlevel=next_map(file_name,change_map) ##Giving the warning messages wherever needed #In Ship map -> warning for not enough gold if (file_name=='./maps/ship.tmx' and (savegame['pirate']==0 or savegame['pirate_map']==1)): portal=False warning=menu.warning_msg(file_name,renderer,sprite_layers,screen,c_pos,1) ##Infinite loop until menu is to be removed i=0 while(i!=1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i=1 continue sprite_layers[2].remove_sprite(warning) hero_pos_x -=10 #In burning village map -> "Something is missing" if player do not have a melee weapon elif(file_name=='./maps/village1.tmx' and savegame['dagger']==0): portal=False warning=menu.warning_msg(file_name,renderer,sprite_layers,screen,c_pos,0) ##Infinite loop until menu is to be removed i=0 while(i!=1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i=1 continue sprite_layers[2].remove_sprite(warning) hero_pos_y +=10 #In village2 inside -> "Something is missing" if no melee weapon or not talked to the spooky guy elif(file_name=='./maps/village2_inside.tmx' and (savegame['eqp_weapon']==None or savegame['spook']==0) and (change_map==1 or change_map==2)): portal=False warning=menu.warning_msg(file_name,renderer,sprite_layers,screen,c_pos,0) ##Infinite loop until menu is to be removed i=0 while(i!=1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i=1 continue sprite_layers[2].remove_sprite(warning) hero_pos_y +=10 #Quit the while loop if portal is true if portal==True: running=False ##loading the main dictionary into "savegame" savegame=pk.load(open("./save.p","rb")) #Getting the current camera position c_pos=camra.camera(file_name,renderer,hero) ##IN Ship map to move the ship when hreo reaches a certain point if(file_name=='./maps/ship.tmx' and hero_pos_x>14*32 and ship_present==0): #Creating the addtional bg music (which continues once started) music_add=sound.create_music_add('./sounds/pirate.ogg') music_add.set_volume(0.7) ship_moving = True #Creating the Ship sprite and adding it ship=person.create_person(9*32,29*32,'./images/ship.png') sprite_layers[1].add_sprite(ship) #while function for the ship moving while(ship_moving): #moving the ship ship.rect.top -=1 #rendering the screen to keep the screen updated render_update(renderer,sprite_layers,screen) #Stopping the ship if(ship.rect.top<7*32): #Ship reached the shore ship_present=1 i=0 while(i!=30): i=i+1 continue #changing to second image ship.image=pygame.image.load('./images/ship2.png') render_update(renderer,sprite_layers,screen) ##adding some delay to ship image change while(i!=60): i=i+1 continue #changing to third image and ship.image=pygame.image.load('./images/ship3.png') ship.rect.top=4*32 ship.rect.right += 32 #Coming out of while loop ship_moving=False #Creating the Captian as villger in the format in which other villagers are added in person file vil=[{'sprte':person.create_person(5*32,5*32-16,'./images/cappy.png'),\ 'toplx':None,'toply':None,'w':None,'h':None}] #adding the Captian sprite_layers[1].add_sprite(vil[0]['sprte']) ##MOVING THE HERO mov = movements.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers,vil,misc) #The variables for the animation images returned from the movement fucntion #Then the same variables are passed again to keep the animation smoother mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] #position variables -> called and passed again hero_pos_x = mov[4] hero_pos_y = mov[5] #hypothetical rectagle -> where the hero will move next? #used to check collision against villagers hero_hypo = mov[7] #Additional bg music (on/off) if (file_name=='./maps/village1.tmx' and hero_pos_y<=28*32 and flag_crossed==0): add=sound.create_music_add('./sounds/river.ogg') ##to check wether first time crossed or other flag_crossed=1 elif (file_name=='./maps/village1.tmx' and hero_pos_y>=28*32 and flag_crossed==1): sound.stop_soundfx(add) flag_crossed=0 ##Moving the villager if there is one if (vil!=None): ##Moving the villager -> the function gives the old direction in which the villagers were ##travelling. In every loop they take one step drctn=movements.move_villager(drctn,speed,vil,hero_hypo,vmu,vmr,vmd,vml,file_name) ##Gives the index of colliding vilager coll=movements.colliding_other_living(vil,hero_hypo) #Checking if there is any misc elif(misc!=None): collm=movements.colliding_other_living(misc,hero_hypo) #Moving the interface with camera interface.rect.topleft=(c_pos[0]-512,c_pos[1]-384) hp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-382) xp_sprite.rect.topleft=(c_pos[0]-400,c_pos[1]-345) l_g.rect.topleft=(c_pos[0]-508,c_pos[1]-381) f_i.rect.bottomright=(c_pos[0]+500,c_pos[1]+350) interf_fight.rect.bottomright=(c_pos[0]+512,c_pos[1]+384) #-------------------------- EVENT HANDLING --------------------------------- for event in pygame.event.get(): #Updating the interface whenever an event happens menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) menu.update_f_i(f_i,c_pos) #For Key pressed event if event.type == pygame.KEYDOWN: x=event.key if(x==pygame.K_ESCAPE): pygame.quit() #Saving the game elif(x==pygame.K_s): #saving the present file name savegame['last_map']=file_name #saving the present frm-> where to put the hero when game loaded savegame['last_frm']=frm #to allow the load game function to work savegame['save']=1 pk.dump(savegame,open("./save.p","wb")) sv=menu.save_menu(c_pos) sound.create_soundfx('./sounds/savegame.ogg') sprite_layers[2].add_sprite(sv) render_update(renderer,sprite_layers,screen) menu.exit_menu(x) sprite_layers[2].remove_sprite(sv) #Printing the dictionary elif(x==pygame.K_q): print savegame #Starting the shopping interface elif(x==pygame.K_SPACE and shop_portal!=None and pygame.Rect.colliderect(hero.rect, shop_portal)): shop(c_pos,renderer,sprite_layers,screen,l_g) #Showing the tunnel riddle elif(x==pygame.K_SPACE and portal_board!=None and pygame.Rect.colliderect(hero.rect, portal_board)): riddle=person.create_person(hero.rect.centerx,hero.rect.centery+200,'./images/tunnel_riddle.png') sprite_layers[2].add_sprite(riddle) (renderer,sprite_layers,screen) = render_update(renderer,sprite_layers,screen) ##Infinite loop until menu is to be removed i=0 while(i!=1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i=1 continue sprite_layers[2].remove_sprite(riddle) ##Showing the Travel option of the ship elif(file_name=='./maps/ship.tmx' and ship_present==1 and x==pygame.K_SPACE and collision.checkCollision(hero,ship)): #creating the menu imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf",30) draw.text((260,70),'Are you sure you want to travel?',(0,0,0),font=font) draw.text((260,110),'(Y)es (N)o',(0,0,0),font=font) imgtx.save('./images/ship_conf.png') ship_conf=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,'./images/ship_conf.png') sprite_layers[2].add_sprite(ship_conf) render_update(renderer,sprite_layers,screen) ##Infinite loop until menu is to be removed result='x' while(result=='x'): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x=event.key if(x==pygame.K_y): result='y' else: result='n' break sprite_layers[2].remove_sprite(ship_conf) render_update(renderer,sprite_layers,screen) #Checking the conditions if pressed 'y' -> want to travel if(result=='y'): #condition for job done and then gold does not matter if(savegame['talk_vil']['./maps/ship.tmx'][0]==1): pirate_mapchange=1 running =False #condition for job not done but have gold elif(savegame['gold']>=50): savegame['gold']-=50 pk.dump(savegame,open("./save.p","wb")) pirate_mapchange=1 running =False #condition for job not done and not enough gold elif(savegame['gold']<50 and savegame['pirate_map']==0): menu.warning_msg(file_name,renderer,sprite_layers,screen,c_pos,0) break #Key pressed near a collectable object elif(x==pygame.K_SPACE and misc!=None): i=0 l=len(misc) while (i>=0 and i<l): if pygame.Rect.colliderect(hero.rect, misc[i]['sprte'].rect): savegame['misc'].append(misc[i]['name']) savegame['misc'].append(misc[i]['value']) savegame[misc[i]['name']]=1 pk.dump(savegame,open("./save.p","wb")) sprite_layers[1].remove_sprite(misc[i]['sprte']) misc.pop(i) else: i+=1 l=len(misc) #toggling the interface off elif(x==pygame.K_f and interf_toggle==0): sprite_layers[2].remove_sprite(hp_sprite) sprite_layers[2].remove_sprite(xp_sprite) sprite_layers[1].remove_sprite(interface) sprite_layers[2].remove_sprite(l_g) sprite_layers[1].remove_sprite(interf_fight) sprite_layers[2].remove_sprite(f_i) interf_toggle=1 #toggling the interface on elif(x==pygame.K_f and interf_toggle==1): sprite_layers[2].add_sprite(hp_sprite) sprite_layers[2].add_sprite(xp_sprite) sprite_layers[1].add_sprite(interface) sprite_layers[2].add_sprite(l_g) sprite_layers[1].add_sprite(interf_fight) sprite_layers[2].add_sprite(f_i) interf_toggle=0 ##Making the Inventory elif(x==pygame.K_i): sound.create_soundfx('./sounds/inventory.ogg') inven=menu.create_menu_inventory(c_pos) sprite_layers[2].add_sprite(inven) render_update(renderer,sprite_layers,screen) ##Infinite loop until inventory is to be removed while(x!=pygame.K_SPACE): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x=event.key continue sprite_layers[2].remove_sprite(inven) render_update(renderer,sprite_layers,screen) #------------------TALKING TO VILLAGER------------------ #Give the required values for showing the talk to villager number 'coll' (line 394) if (vil!=None): talk_result=talk.iftalk(coll,x,vil,count,hero_pos_x,hero_pos_y,file_name)##Gives : count(for checking if talking) ##coll (which villager he's talking to) ##talktime(talking again or not) #if no villager colliding else: talk_result=None #talk_result[0] -> count --- shows the talking interface only if count is 1-> talking to someone #count remains 0 as called before mainloop if(talk_result[0]==1): ##gives back the text for respective villager menutext=menu.create_menu_vil(coll,file_name,talk_result[2]) ##variable to check for for how many number of times the loop should work dialog_show=0 sound.create_soundfx('./sounds/talk.ogg') ##gives the name of the created image txtim=person.create_text_img('./images/textbox.png',menutext,dialog_show) ##gives the sprite for the menu image menu_ui=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,txtim) sprite_layers[2].add_sprite(menu_ui) render_update(renderer,sprite_layers,screen) #the loop for showing text box (again and again) while(dialog_show<len(menutext)): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x=event.key #for the villagers that have Yes/No option if (dialog_show==len(menutext)-1): if x==pygame.K_y: if(file_name=='./maps/village1.tmx' and coll==1 and savegame['b_h_vil']==0): #sound created as this 'add' variable is closing when going out of village1 #main reason -> prevent error add=sound.create_music_add('./sounds/river.ogg') savegame['b_h_vil']=1 villager_job=1 running =False sprite_layers[2].remove_sprite(menu_ui) dialog_show+=1 elif(file_name=='./maps/village2_out1.tmx' and coll==0 and savegame['f_vil']==0): savegame['f_vil']=1 villager_job=2 running =False sprite_layers[2].remove_sprite(menu_ui) dialog_show+=1 elif(file_name=='./maps/village2_inside.tmx' and coll==2 and savegame['spook']==0): savegame['spook']=1 villager_job=3 running =False sprite_layers[2].remove_sprite(menu_ui) dialog_show+=1 elif x==pygame.K_n: sprite_layers[2].remove_sprite(menu_ui) dialog_show+=1 #all other villagers if(x==pygame.K_SPACE): ##remove the prev text image sprite_layers[2].remove_sprite(menu_ui) ##indicates for the next one dialog_show +=1 ##for not going in the loop again if dialog_show==len(menutext): break ##if any other key pressed elif(x!=pygame.K_SPACE): continue ##for not going in the loop again elif dialog_show==len(menutext): break sound.create_soundfx('./sounds/talk.ogg') #next text image created and its sprite created and added txtim=person.create_text_img('./images/textbox.png',menutext, \ dialog_show) menu_ui=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,\ txtim) sprite_layers[2].add_sprite(menu_ui) render_update(renderer,sprite_layers,screen) if x==pygame.K_SPACE: ##an infite loop till 'x' is pressed menu.exit_menu(x) sprite_layers[2].remove_sprite(menu_ui) #--------------------TALKING ENDS------------------- #----------------------------- EVENT HANDLING ENDED ---------------------------- # adjust camera according to the hero's position, follow him # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() """------------------------------------- OUT OF MAIN GAME LOOP----------------------------------""" #stopping the additional background music if (file_name=='./maps/village2_out1.tmx' or file_name=='./maps/ship.tmx'): music_add.stop() #stopping the fluctuating bg music #'add' created (in line 585) to prevent error in this snippet if(file_name=='./maps/village1.tmx' ): sound.stop_soundfx(add) musicbg.stop() #If portal was the reason for stopping the game loop if portal==True: #name of next map and respective frm mp=nextlevel[0] frm=nextlevel[1] #calling the map demo_pygame(mp,frm) #If main loop ended because of a side task if villager_job==1: knifehouse1.main() elif villager_job==2: fish.main() elif villager_job==3: spooky.main() #when pressed 'yes' to the ship travel if pirate_mapchange==1: demo_pygame('./maps/village2_out1.tmx',0)
def demo_pygame(file_name, frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode( file_name) pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # loading the sound files in different sound formats of mixer and main background sound in mixer stream mixer.init() sound_guard_watch = mixer.Sound('./sounds/pain.ogg') sound_hole_fall = mixer.Sound('./sounds/scream2.ogg') file = './sounds/zrap_back.ogg' mixer.music.load(file) mixer.music.play(-1) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite # use floats for hero position hero_pos_x = 3 * 32 hero_pos_y = 21 * 32 hero = person.create_person(hero_pos_x, hero_pos_y, './images/hero_u2.png') hero_width = hero.rect.width hero_height = 5 # laoding the scroll map_trap = person.create_person(8 * 32 + 16, 3 * 32 + 30, './images/map_trap.png') #creating the 3 guards guard = [] guard_pos_x = random.randint(10 * 32, 18 * 32) guard_pos_y = 18 * 32 guard.append(create_guard(guard_pos_x, guard_pos_y)) guard.append(create_guard(random.randint(22 * 32, 31 * 32), 15 * 32)) guard.append(create_guard(random.randint(22 * 32, 31 * 32), 6 * 32)) # field of view of different guards # collision with this tile is death for hero danger = [] # kill flag for last trap tile of pins from ground showkillbill = 0 # creating the pintrap but not adding to the sprite killbill = create_kill(18 * 32, 8 * 32 + 48) hole = create_hole(18 * 32, 2 * 32) danger_count = 140 + 1 # for kill tile # intersect tiles for nullyfying guard filed of view near stones intersect1 = [] for i in range(5): for j in range(5): intersect1.append( create_dang(13 * 32 + j * 16 + 16, (21 * 32 - 16) + i * 16)) intersect2 = [] for i in range(5): for j in range(5): intersect2.append( create_dang(13 * 32 + j * 16 + 48, (21 * 32 - 16) + i * 16)) for i in range(danger_count - 1): danger.append(create_dang(100, 100)) # dimensions of the hero for collision detection # cam_offset is for scrolling cam_world_pos_x = 512 cam_world_pos_y = 768 / 2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [ layer for layer in sprite_layers if not layer.is_object_group ] # adding the hero and the danger and the traps to the the right layer sprite_layers[4].add_sprite(hero) sprite_layers[4].add_sprite(guard[0]) sprite_layers[4].add_sprite(guard[1]) sprite_layers[4].add_sprite(guard[2]) sprite_layers[2].add_sprite(map_trap) for i in range(56, len(danger)): sprite_layers[1].add_sprite(danger[i]) sprite_layers[3].add_sprite(hole) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) # variables for the main loop cross_guards = 0 clock = pygame.time.Clock() running = True speed = 3.6505 flag1 = random.randint(1, 2) flag2 = random.randint(1, 2) flag3 = random.randint(1, 2) count = -1 mr = ml = md = mu = 0 kill_active = 0 portal1 = pygame.Rect(7 * 32, 2 * 32, 96, 64) # mainloop while running: """ for 3 guards flag1 flag2 flag3 for their directions in horizontal direction """ dt = clock.tick(35) # for guard1 movement here if (flag1 == 1): if (guard[0].rect.centerx < 10 * 32): flag1 = 2 else: guard[0].rect.centerx -= 2 elif (flag1 == 2): if (guard[0].rect.centerx > 18 * 32): flag1 = 1 else: guard[0].rect.centerx += 2 index = 0 #updating the danger tiles for the first guard if (flag1 == 1): for i in range(10, 0, -1): for j in range(i): danger[index].rect.center = ((guard[0].rect.centerx - j * 16), (guard[0].rect.centery + (10 - i) * 16)) index += 1 elif (flag1 == 2): for i in range(10, 0, -1): for j in range(i): danger[index].rect.center = ((guard[0].rect.centerx + j * 16), (guard[0].rect.centery + (10 - i) * 16)) index += 1 # for guard 2 movement here if (flag2 == 1): if (guard[1].rect.centerx < 22 * 32): flag2 = 2 else: guard[1].rect.centerx -= 2 elif (flag2 == 2): if (guard[1].rect.centerx > 31 * 32): flag2 = 1 else: guard[1].rect.centerx += 2 #updating the danger tiles for the first guard if (flag2 == 1): for i in range(7, 0, -1): for j in range(i): danger[index].rect.center = ((guard[1].rect.centerx - j * 16), (guard[1].rect.centery + (7 - i) * 16)) #danger[index].rect.center = ((guard[1].rect.centerx - j *16 ), (guard[1].rect.centery - (i * 16))) index += 1 for i in range(0, 7): for j in range(i): #danger[index].rect.center = ((guard[1].rect.centerx - j *16 ), (guard[1].rect.centery + (7 - i) * 16)) danger[index].rect.center = ((guard[1].rect.centerx - j * 16), (guard[1].rect.centery - (7 - i) * 16)) index += 1 if (flag2 == 2): for i in range(7, 0, -1): for j in range(i): danger[index].rect.center = ((guard[1].rect.centerx + j * 16), (guard[1].rect.centery + (7 - i) * 16)) index += 1 for i in range(0, 7): for j in range(i): danger[index].rect.center = ((guard[1].rect.centerx + j * 16), (guard[1].rect.centery - (7 - i) * 16)) index += 1 # for guard 3 movement here if (flag3 == 1): if (guard[2].rect.centerx < 22 * 32): flag3 = 2 else: guard[2].rect.centerx -= 2 elif (flag3 == 2): if (guard[2].rect.centerx > 31 * 32): flag3 = 1 else: guard[2].rect.centerx += 2 #updating the danger tiles for the first guard if (flag3 == 1): for i in range(6, 0, -1): for j in range(i): danger[index].rect.center = ((guard[2].rect.centerx - j * 16), (guard[2].rect.centery + (6 - i) * 16)) index += 1 for i in range(0, 6): for j in range(i): danger[index].rect.center = ((guard[2].rect.centerx - j * 16), (guard[2].rect.centery - (6 - i) * 16)) index += 1 if (flag3 == 2): for i in range(6, 0, -1): for j in range(i): danger[index].rect.center = ((guard[2].rect.centerx + j * 16), (guard[2].rect.centery + (6 - i) * 16)) index += 1 for i in range(0, 6): for j in range(i): danger[index].rect.center = ((guard[2].rect.centerx + j * 16), (guard[2].rect.centery - (6 - i) * 16)) index += 1 #taking map and map change condition here with the scroll if (portal1.collidepoint(hero.rect.midtop) and pygame.key.get_pressed()[pygame.K_SPACE] == 1): sprite_layers[2].remove_sprite(map_trap) mixer.music.stop() sv = pk.load(open("./save.p", "rb")) #saving the data in the file sv['pirate_map'] = 1 sv['pirate_vil'] = 1 sv['talk_vil']['./maps/ship.tmx'][0] = 1 pk.dump(sv, open("./save.p", "wb")) portal = True # now change map after end of the loop at the end of the loop running = False # checking collision in red zone for i in range(len(danger)): if (pygame.sprite.collide_rect(hero, danger[i])): """ to palce the hero to starting position if it the redzone is not in intersect field if false is 0 then the hero is moved to the initial position the intersect case is only for the first guard """ false = 0 if (flag1 == 1): for j in range(len(intersect1)): if (pygame.sprite.collide_rect(danger[i], intersect1[j])): false = 1 if (false == 0): #print hero.rect.center hero_pos_x = 3 * 32 hero_pos_y = 21 * 32 mixer.music.stop() sound_guard_watch.play() time.sleep(1) mixer.music.play() #print hero.rect.center break elif (flag1 == 2): for j in range(len(intersect2)): if (pygame.sprite.collide_rect(danger[i], intersect2[j])): false = 1 if (false == 0): #print hero.rect.center hero_pos_x = 3 * 32 hero_pos_y = 21 * 32 mixer.music.stop() sound_guard_watch.play() time.sleep(1) mixer.music.play() #print hero.rect.center break # after crossing #stroing the hole image size for changing it later when hero crossing r1 = hole.rect im = hole.image r2 = im.get_rect() w = r2.width """ cross_guards storing the checkpoint of the hero 1 after crossing all the guards 2 after crossing the hole """ if (count > 0): count += 1 if (hero_pos_y < 3 * 32): cross_guards = 1 #print cross_guards if (cross_guards == 1 and hero_pos_x < 20 * 32 and hero_pos_y < 3 * 32): r1 = hole.rect im = hole.image r2 = im.get_rect() w = r2.width # if hole is large to limit hero falls and sent to starting position if (w < 60): im = pygame.transform.scale(im, (w + 2, w + 2)) r = im.get_rect() r.center = r1.center hole.image = im hole.rect = r else: cross_guards = 0 hero_pos_x = 3 * 32 hero_pos_y = 21 * 32 mixer.music.stop() sound_hole_fall.play() time.sleep(1) im = pygame.transform.scale(im, (12, 12)) r = im.get_rect() r.center = r1.center hole.image = im hole.rect = r mixer.music.play() # condition that hero has crossed the hole trap count for pin from ground is started #showkillbill is bool value for activating the pin ground trap elif (cross_guards == 1 and hero_pos_x < 19 * 32 and hero_pos_y > 3 * 32): cross_guards = 2 count = 1 elif (cross_guards == 2 and not showkillbill == 1): showkillbill = 1 elif (cross_guards == 2 and hero_pos_y > 16 * 32): cross_guards = 0 im = pygame.transform.scale(im, (12, 12)) r = im.get_rect() r.center = r1.center hole.image = im hole.rect = r # sendin the hero back to start from position if collsion of midbottom with pin trap if (kill_active == 1): if (killbill.rect.collidepoint(hero.rect.midbottom)): cross_guards = 0 hero_pos_x = 3 * 32 hero_pos_y = 21 * 32 mixer.music.stop() sound_guard_watch.play() time.sleep(1) im = pygame.transform.scale(im, (12, 12)) r = im.get_rect() r.center = r1.center hole.image = im hole.rect = r mixer.music.play() # timed fluctuation of the pin trap if (showkillbill == 1 and count > 56): count = 1 if (sprite_layers[3].contains_sprite(killbill)): sprite_layers[3].remove_sprite(killbill) kill_active = 0 else: sprite_layers[3].add_sprite(killbill) kill_active = 1 # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False # calling the hero_move fucntion from movements1 file for changing the position of the hero mov = movements1.hero_move(mr, ml, md, mu, hero_pos_x, hero_pos_y, hero, speed, sprite_layers[5]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() if portal == True: shifty1.demo_pygame('./maps/ship.tmx', 1)
def demo_pygame(file_name, frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode( file_name) mixer.init() #background music and special sound effects sound = mixer.Sound('./sounds/oh.ogg') file = './sounds/SunnyDay.ogg' m = mixer.music.load(file) mixer.music.play(-1) #set up a screen screen_width = min(1000, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() #decide hero location based on the previous map if frm == 0: hero_pos_x = 200 hero_pos_y = 1860 else: hero_pos_x = 200 hero_pos_y = 47 * 20 # create hero sprite hero = person.create_person(hero_pos_x, hero_pos_y, './images/hero_u2.png') # create treasurechest sprite treasure_width = 3 treasure_height = 3 #create pot sprite pot_width = 3 pot_height = 4 #create pot2 sprite pot2_width = 4 pot2_height = 4 # dimensions of the hero for collision detection hero_width = hero.rect.width hero_height = 5 # cam_offset is for scrolling cam_world_pos_x = hero.rect.centerx cam_world_pos_y = hero.rect.centery # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [ layer for layer in sprite_layers if not layer.is_object_group ] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[3].add_sprite(hero) #load the saved game variables sv = pk.load(open("./save.p", "rb")) ft = sv['flagtreasure'] # add pots positions pots_pos_x = [240, 760, 600, 960] pots_pos_y = [60, 320, 880, 1800] #create gold pots based on whether the pots have already been opened or not pots = [] for i in range(4): if ft[i] == 0: pots.append(create_pot(pots_pos_x[i], pots_pos_y[i])) sprite_layers[2].add_sprite(pots[len(pots) - 1]) # add pots2 positions pots2_pos_x = [700, 80] pots2_pos_y = [440, 160] pots2 = [] #create gold pots2 based on whether the pots have already been opened or not for i in range(2): if ft[i + 4] == 0: pots2.append(create_pot2(pots2_pos_x[i], pots2_pos_y[i])) sprite_layers[2].add_sprite(pots2[len(pots2) - 1]) # add treasure positions treasure_pos_x = [960, 820, 320, 780] treasure_pos_y = [180, 840, 1200, 1440] treasure = [] #create treasure chest based on whether the pots have already been opened or not for i in range(4): if ft[i + 6] == 0: treasure.append( create_treasure(treasure_pos_x[i], treasure_pos_y[i])) sprite_layers[2].add_sprite(treasure[len(treasure) - 1]) # variables for the main loop clock = pygame.time.Clock() running = True speed = 6 health = 100 mr = ml = md = mu = 0 flag1 = [0 for x in range(4)] flag2 = [0 for x in range(4)] flag3 = [0 for x in range(4)] # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) #create portals to detect collision with these to change maps portal1 = pygame.Rect(0, 98 * 20, 49 * 20, 20) portal2 = pygame.Rect(0, 0, 49 * 20, 20) portal = False # mainloop while running: dt = clock.tick(40) sv = pk.load(open("./save.p", "rb")) ft = sv['flagtreasure'] # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False # find directions mov = movements1.hero_move(mr, ml, md, mu, hero_pos_x, hero_pos_y, hero, speed, sprite_layers[4]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] # adjust camera according to the hero's position, follow him if (hero.rect.centery >= 1600): renderer.set_camera_position(500, 1600) elif (hero.rect.centery <= 385): renderer.set_camera_position(500, 385) else: renderer.set_camera_position(500, hero.rect.centery) #go to previous map or next map based on the portal it collides with if (pygame.Rect.colliderect(portal1, hero.rect)): portal = True portal_num = 0 nextlevel = next_map(file_name, 0) running = False mixer.music.stop() elif (pygame.Rect.colliderect(portal2, hero.rect)): portal = True portal_num = 1 nextlevel = next_map(file_name, 1) running = False mixer.music.stop() # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) #render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) #detects which treasure chest the hero collides with n = hero.rect.collidelist(treasure) if n != -1: r1 = treasure[n].rect #change the image to open treasure chest im = pygame.image.load('./images/treasure2.png') treasure[n].image = im treasure[n].rect = im.get_rect() treasure[n].rect.center = r1.center #if gold not already taken update hero's gold if (flag1[n] == 0): flag1[n] = 1 ft[n + 6] = 1 sv['gold'] += 13 mixer.music.stop() sound.play(0) mixer.music.play(-1) #detects which pot the hero collides with n = hero.rect.collidelist(pots) if n != -1: sprite_layers[2].remove_sprite(pots[n]) #if gold not already taken update hero's gold if (flag2[n] == 0): ft[n] = 1 flag2[n] = 1 sv['gold'] += 7 mixer.music.stop() sound.play(0) mixer.music.play(-1) #detects which pot the hero collides with n = hero.rect.collidelist(pots2) if n != -1: sprite_layers[2].remove_sprite(pots2[n]) #if gold not already taken update hero's gold if (flag3[n] == 0): ft[n + 4] = 1 flag3[n] = 1 sv['gold'] += 7 mixer.music.stop() sound.play(0) mixer.music.play(-1) sv['flagtreasure'] = ft pygame.display.flip() #save the new game variables back to dictionary pk.dump(sv, open("./save.p", "wb")) if (portal == True and portal_num == 0): mp = nextlevel[0] frm = nextlevel[1] #go to previous map shifty1.demo_pygame(mp, frm) elif (portal == True and portal_num == 1): mp = nextlevel[0] frm = nextlevel[1] #go to next map goodtunnel2.demo_pygame(mp, frm)
def demo_pygame(file_name,frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) mixer.init() # background music play infinitely unless stopped explicitly file = './sounds/Sunny2.ogg' m = mixer.music.load(file) mixer.music.play(-1); #set up a screen screen_width = min(930, world_map.pixel_width) screen_height = min(760, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite hero_pos_x = 500 hero_pos_y = 1450 #create hero at specified location with specified image hero = person.create_person(hero_pos_x, hero_pos_y ,'./images/hero_u2.png') # dimensions of the hero for collision detection hero_width = hero.rect.width hero_height = 5 # cam_offset is for scrolling cam_world_pos_x = screen_width/2 cam_world_pos_y = screen_height/2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero sprite sprite_layers[2].add_sprite(hero) # variables for the main loop clock = pygame.time.Clock() running = True speed=3 portal=False # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT,1000) mr=ml=md=mu=0 #create portal to detect collision with player and update map portal1 = pygame.Rect(1*20,74*20,49*20,20) # mainloop while running: dt = clock.tick(50) # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False # find directions mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[3]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] #update camera position according to hero's position if ( hero.rect.centery >=1150): renderer.set_camera_position(490, 1150) elif (hero.rect.centery <=380): renderer.set_camera_position(490, 380) else: renderer.set_camera_position(490,hero.rect.centery ) #detect collision with portal if(portal1.collidepoint(hero.rect.midbottom)): portal=True # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) #render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() if portal==True: #stop the background music and change the map mixer.music.stop() goodtunnel.demo_pygame('./maps/tunnel.tmx',1)
def demo_pygame(file_name,frm): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) #for background music and special sound effects mixer.init() sound1 = mixer.Sound('./sounds/ouch.ogg') sound2=mixer.Sound('./sounds/stone.ogg') file = './sounds/Rock_Slide.ogg' m = mixer.music.load(file) #(-1) argument plays it infinitely unless stopped explicitly mixer.music.play(-1); #set up a screen screen_width = min(704, world_map.pixel_width) screen_height = min(800, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite hero_pos_x = screen_width/2 hero_pos_y = 6300 #create hero on specified co-ordinates and with specified image hero = person.create_person(hero_pos_x, hero_pos_y ,'./images/up.png') #portal to detect change of map portal2 = pygame.Rect(0,1*32,21*32,60) # create stones sprite stone_width =3 stone1_height=3 stone2_height=4 stone3_height=5 stone1=[] stone2=[] stone3=[] # dimensions of the hero for collision detection hero_width = hero.rect.width hero_height = 5 # cam_offset is for scrolling cam_world_pos_x = hero.rect.centerx cam_world_pos_y = hero.rect.centery # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero to the the right layer sprite_layers[1].add_sprite(hero) # add stone positions stone1_pos_x=[] stone1_pos_y=[] stone2_pos_x=[] stone2_pos_y=[] stone3_pos_x=[] stone3_pos_y=[] # variables for the main loop clock = pygame.time.Clock() running = True speed_x = 4 speed_y= 6 last=0 #load the saved game variables based on game progress sv=pk.load(open("./save.p","rb")) health=sv['hp'] hp=sv['hp'] hp_max=sv['max_hp'] c_pos=[cam_world_pos_x, cam_world_pos_y] interf_toggle=0 interface=menu.create_interface(renderer,sprite_layers,screen,c_pos) hp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/hp_bar.png') l_g=menu.create_l_g(renderer,sprite_layers,screen,c_pos) [hp_sprite,hp]=menu.create_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos) xp_sprite=person.create_person(c_pos[0],c_pos[1],'./images/exp_bar.png') xp_sprite=menu.create_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos) # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT,1000) cl = 0 # mainloop while running: dt = clock.tick(40) sv=pk.load(open("./save.p","rb")) # event handling for event in pygame.event.get(): #update the health,experience and armour menu.update_lg(l_g,c_pos) menu.update_hp_bar(renderer,sprite_layers,screen,hp_sprite,c_pos,0) menu.update_xp_bar(renderer,sprite_layers,screen,xp_sprite,c_pos,0) if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False #based on collision with environment decide number of steps allowed mov = climb.hero_climb(cl,hero_pos_x,hero_pos_y,hero,speed_x,speed_y,sprite_layers[3]) cl = mov[0] hero_pos_x = mov[1] hero_pos_y = mov[2] #check collision with portal to change map if(pygame.Rect.colliderect(portal2,hero.rect)): portal=True #stop the background music for this map mixer.music.stop() running =False # adjust camera according to the hero's position, follow him if ( hero.rect.centery >=6000): renderer.set_camera_position(350, 6000) c_pos=(350,6000) elif (hero.rect.centery <=400): renderer.set_camera_position(350, 400) c_pos=(350,400) else: renderer.set_camera_position(350,hero.rect.centery ) c_pos=(350,hero.rect.centery) #position health bar, experience bar and armour interface.rect.topleft=(c_pos[0]-352,c_pos[1]-384) hp_sprite.rect.topleft=(c_pos[0]-240,c_pos[1]-382) xp_sprite.rect.topleft=(c_pos[0]-240,c_pos[1]-345) l_g.rect.topleft=(c_pos[0]-348,c_pos[1]-381) # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: continue else: renderer.render_layer(screen, sprite_layer) time=(pygame.time.get_ticks() / 500) #to decide interval when to drop stones if time > last and len(stone1)+len(stone2)+len(stone3) <30: last=time hero_temp_x = hero.rect.centerx #decide x co-ordinate of stone randomly r=random.randint(0,100) if( r < 25): left_limit=hero_temp_x - 10 right_limit = hero_temp_x +10 elif ( r < 90) : left_limit = hero_temp_x - 200 right_limit = hero_temp_x +200 if(left_limit<40): left_limit = 40 right_limit = 400 if(right_limit >640): left_limit = 300 right_limit = 660 else : left_limit=10 right_limit=690 #to decide randomly the type of stone t=random.randint(0,math.floor(hero_pos_y)) if t < 2000: t=3 elif t < 4000: t=2 else : t=1 permission = random.randint(left_limit,right_limit); if(permission<50): permission = 55 elif (permission > 650): permission = 645 #append initial stone locations and create stone sprites if( t==1): stone1_pos_x.append(permission) stone1_pos_y.append(max(hero_pos_y -800,50)) stone1.append(create_stone(stone1_pos_x[len(stone1)],stone1_pos_y[len(stone1)],1)) sprite_layers[1].add_sprite(stone1[len(stone1)-1]) elif t==2 : stone2_pos_x.append(permission) stone2_pos_y.append(max(hero_pos_y -800,50)) stone2.append(create_stone(stone2_pos_x[len(stone2)],stone2_pos_y[len(stone2)],2)) sprite_layers[1].add_sprite(stone2[len(stone2)-1]) else : stone3_pos_x.append(permission) stone3_pos_y.append(max(hero_pos_y -800,50)) stone3.append(create_stone(stone3_pos_x[len(stone3)],stone3_pos_y[len(stone3)],3)) sprite_layers[1].add_sprite(stone3[len(stone3)-1]) n=0 while n < len(stone1): #moving the stones of type1 step_x, step_y = climb.check_collision(stone1_pos_x[n], stone1_pos_y[n], 0,8 *(6400-hero_pos_y) //6400 +10, stone_width, stone1_height, sprite_layers[3]) stone1_pos_y[n] += step_y stone1[n].rect.midbottom = (stone1_pos_x[n], stone1_pos_y[n]) #if stone is out of visible region remove stone sprite if (stone1_pos_y[n] >=hero_pos_y +400 or stone1_pos_y[n]>= 6300) : sprite_layers[1].remove_sprite(stone1[n]) stone1.pop(n) stone1_pos_y.pop(n) stone1_pos_x.pop(n) #stop background music and play sound of stone reaching bottom of sea mixer.music.stop() sound2.play(0) #play background music again mixer.music.play(-1); continue else: n=n+1 #to check players' collision with stone type1 n=hero.rect.collidelist(stone1) if n!= -1: #remove stone sprite sprite_layers[1].remove_sprite(stone1[n]) stone1.pop(n) stone1_pos_y.pop(n) stone1_pos_x.pop(n) #decrease the health health=health-3 sv['hp']=health pk.dump(sv,open("./save.p","wb")) mixer.music.stop() #play the hurt sound sound1.play(0) mixer.music.play(-1) if health <=0: #go back to initial position hero_pos_x=screen_width/2 hero_pos_y=6300 sv['hp']=sv['max_hp'] health=sv['hp'] n=0 #similarly for stones of type2 while n < len(stone2): step_x, step_y = climb.check_collision(stone2_pos_x[n], stone2_pos_y[n], 0,8 *(6400-hero_pos_y) //6400 + 10, stone_width, stone2_height, sprite_layers[3]) stone2_pos_y[n] += step_y stone2[n].rect.midbottom = (stone2_pos_x[n], stone2_pos_y[n]) if (stone2_pos_y[n] >=hero_pos_y +400 or stone2_pos_y[n]>= 6300): sprite_layers[1].remove_sprite(stone2[n]) stone2.pop(n) stone2_pos_y.pop(n) stone2_pos_x.pop(n) mixer.music.stop() sound2.play(0) mixer.music.play(-1); continue else: n=n+1 n=hero.rect.collidelist(stone2) if n!= -1: sprite_layers[1].remove_sprite(stone2[n]) stone2.pop(n) stone2_pos_y.pop(n) stone2_pos_x.pop(n) health=health-6 sv['hp']=health pk.dump(sv,open("./save.p","wb")) mixer.music.stop() sound1.play(0) mixer.music.play(-1); if health <=0 : # changes to switch screen to game over hero_pos_x=screen_width/2 hero_pos_y=6300 sv['hp']=sv['max_hp'] health=sv['hp'] n=0 #similarly for stone of type3 while n < len(stone3): step_x, step_y = climb.check_collision(stone3_pos_x[n], stone3_pos_y[n], 0,8 *(6400-hero_pos_y) //6400 +10, stone_width, stone3_height, sprite_layers[3]) stone3_pos_y[n] += step_y stone3[n].rect.midbottom = (stone3_pos_x[n], stone3_pos_y[n]) if (stone3_pos_y[n] >=hero_pos_y +400 or stone3_pos_y[n]>= 6300): sprite_layers[1].remove_sprite(stone3[n]) stone3.pop(n) stone3_pos_y.pop(n) stone3_pos_x.pop(n) mixer.music.stop() sound2.play(0) mixer.music.play(-1); continue else: n=n+1 n=hero.rect.collidelist(stone3) if n!= -1: sprite_layers[1].remove_sprite(stone3[n]) stone3.pop(n) stone3_pos_y.pop(n) stone3_pos_x.pop(n) health=health-10 sv['hp']=health pk.dump(sv,open("./save.p","wb")) mixer.music.stop() sound1.play(0) mixer.music.play(-1); if health <=0 : hero_pos_x=screen_width/2 hero_pos_y=6300# changes to switch screen to game over sv['hp']=sv['max_hp'] health=sv['hp'] pygame.display.flip() if portal==True: #chnage the map mountain_top.main()
def demo_pygame(file_name): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(file_name) mixer.init() #background music sound = mixer.Sound('./sounds/bats.ogg') file = './sounds/spooky.ogg' m = mixer.music.load(file) mixer.music.play(-1); #set up a screen screen_width = min(950, world_map.pixel_width) screen_height = min(760, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite hero_pos_x = 400 hero_pos_y = 800 hero = person.create_person(hero_pos_x, hero_pos_y ,'./images/hero_u2.png') # dimensions of the hero for collision detection hero_width = hero.rect.width hero_height = 3 # cam_offset is for scrolling cam_world_pos_x = screen_width/2 cam_world_pos_y = screen_height/2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [layer for layer in sprite_layers if not layer.is_object_group] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[2].add_sprite(hero) # variables for the main loop clock = pygame.time.Clock() running = True speed=5 health=100 # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT,1000) mr=ml=md=mu=0 #create portal to change map portal1 = pygame.Rect(19*20,42*20,180,20) #create the spooky guy vil=person.create_villager(file_name) sprite_layers[1].add_sprite(vil[0]['sprte']) # mainloop while running: dt = clock.tick(40) #update camera position as per hero's position if ( hero.rect.centery >=570): renderer.set_camera_position(475, 570) c_pos=(475,570) elif (hero.rect.centery <=380): renderer.set_camera_position(475, 380) c_pos=(475,380) else: renderer.set_camera_position(475,hero.rect.centery ) c_pos=(475,hero.rect.centery) # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False x=event.key if (vil!=None): talk_result=talk.iftalk(0,x,vil,0,hero_pos_x,hero_pos_y,file_name) else: talk_result=None if(talk_result[0]==1): menutext=menu.create_menu_vil(0,file_name,talk_result[2]) dialog_show=0 txtim=person.create_text_img('./images/textbox.png',menutext,dialog_show) menu_ui=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,txtim) sprite_layers[2].add_sprite(menu_ui) shifty1.render_update(renderer,sprite_layers,screen) #the loop for showing text box (again and again) till dialogues not completed while(dialog_show<len(menutext)): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x=event.key if(x==pygame.K_SPACE): sprite_layers[2].remove_sprite(menu_ui) dialog_show +=1 if dialog_show==len(menutext): break txtim=person.create_text_img('./images/textbox.png',menutext, \ dialog_show) menu_ui=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,\ txtim) sprite_layers[2].add_sprite(menu_ui) sv['spook']=1 sv['talk_vil'][file_name][0]=1 sv['talk_vil']['./maps/village2_inside.tmx'][2]=1 pk.dump(sv,open("./save.p","wb")) shifty1.render_update(renderer,sprite_layers,screen) menu.exit_menu(x)##an infite loop till 'x' is pressed sprite_layers[2].remove_sprite(menu_ui) # find directions mov = movements1.hero_move(mr,ml,md,mu,hero_pos_x,hero_pos_y,hero,speed,sprite_layers[3]) mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] hero_pos_x = mov[4] hero_pos_y = mov[5] sv=pk.load(open("./save.p","rb")) if(portal1.collidepoint(hero.rect.midbottom) and sv['talk_vil'][file_name][0]==1): portal=True running = False mixer.music.stop(); # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) #render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) t=random.randint(0,1000) #based on random numnber play bats sound if(t<5): mixer.music.stop() sound.play(0) mixer.music.play(-1); # changes to switch screen to game over pygame.display.flip() if portal==True: #change the map shifty1.demo_pygame('./maps/village2_inside.tmx',2)
def create_interface_spec_arrow(renderer,sprite_layers,screen,c_pos): interface=person.create_person(c_pos[0]-700,c_pos[1]-100,'./images/spec_arrow_interf.png') sprite_layers[1].add_sprite(interface) shifty1.render_update(renderer,sprite_layers,screen) return interface
def demo_pygame(file_name, frm): ##FILE NAME GIVES THE CURRENT MAP if (file_name == './maps/tunnel3.tmx'): tunnel3.main() elif (file_name == './maps/tunnel.tmx'): goodtunnel.main() elif (file_name == './maps/mountainclimbing.tmx'): climb_mountain.main() elif (file_name == './maps/maze.tmx'): maze_code.main() elif (file_name == './maps/maze2.tmx'): maze_code2.main() elif (file_name == './maps/hotel.tmx'): hotel.main() elif (file_name == './maps/tunnel2_4.tmx'): tunnel2_4.main(frm) elif (file_name == './maps/palace.tmx'): pal_lava.main() elif (file_name == './maps/palace_final.tmx'): palace.main() # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode( file_name) # init pygame and set up a screen pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() #loading the main dictionary into "savegame" #pk.dump(savegame,open("./save.p","wb")) -> donates dumping/saving the updated #dictionaty "savegame" to the "save.p" file so that can be used again with the updated values savegame = pk.load(open("./save.p", "rb")) ##Creating hero #getting the entry position depending on the map starting = entry(file_name, frm) hero_pos_x = starting[0] hero_pos_y = starting[1] #creating the hero sprite hero = person.create_person(hero_pos_x, hero_pos_y, './images/hero_d2.png') ##Creating villagers #villager count is 0 if no villager on the current map vcount = 0 #defining the villager directions muv = 'up' mdv = 'down' mrv = 'right' mlv = 'left' #no direction -> not moving no = '' #creating the villager sprites #villagers created according to map vil = person.create_villager(file_name) vcount = len(vil) ##Giving initial random direction to every villager #initializing the variable drc = no #the villager direction list drctn = [] #using randint to decide direction for i in range(0, vcount): a = random.randint(1, 10) if (a == 1): drc = muv elif (a == 2): drc = mrv elif (a == 3): drc = mdv elif (a == 4): drc = mlv elif (a <= 10): drc = no drctn.append(drc) # cam_offset is for scrolling cam_world_pos_x = hero.rect.centerx cam_world_pos_y = hero.rect.centery # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [ layer for layer in sprite_layers if not layer.is_object_group ] # add the hero the the right layer, it can be changed using 0-9 keys sprite_layers[1].add_sprite(hero) ##Adding the villager sprites i = 0 for i in range(0, vcount): sprite_layers[1].add_sprite(vil[i]['sprte']) ##Misc object sprites #creating the sprite misc = person.create_misc(file_name) #adding the sprites if misc != None: mcount = len(misc) i = 0 while (i >= 0 and i < mcount): ##check if any misc is already taken if (savegame[misc[i]['name']] == 0): sprite_layers[1].add_sprite(misc[i]['sprte']) i += 1 else: misc.pop(i) mcount = len(misc) # variables for the main loop clock = pygame.time.Clock() running = True speed = 4 ##Sign board for the tunnel riddle portal_board = None if (file_name == './maps/village1.tmx'): portal_board = pygame.Rect(81 * 32, 9 * 32, 40, 80) signboard = person.create_person(81 * 32, 9 * 32, './images/signboard.png') sprite_layers[2].add_sprite(signboard) ##The variables for changing the movement pictures -> to give animation to movement mr = ml = md = mu = 0 vmr = vml = vmd = vmu = 0 # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 1000) #Creating portals -> For map changing portals = person.create_portal(file_name) #Creating the shopping portal shop_portal = person.create_shop_portal(file_name) #Variable for the quests/tasks/side missions villager_job = 0 #To check if ship is on the shore in "Ship.tmx" map (pirate ship) ship_present = 0 #Initial value of portal -> if True -> map changes portal = False #check for the river sound in Burning village map -> heard only if close to river flag_crossed = 0 #This is check for talking to villager -> talks to villager-> shows the first dialog box-> if 1 count = 0 ###FOR INTERFACE #initiaizing variables from savegame hp = savegame['hp'] hp_max = savegame['max_hp'] #camera postion stored in c_pos c_pos = camra.camera(file_name, renderer, hero) #variable for turning the interface on and off interf_toggle = 0 #creating the background for health bar, xp bar interface = menu.create_interface(renderer, sprite_layers, screen, c_pos) #creating the health bar sprite and creating the bar hp_sprite = person.create_person(c_pos[0], c_pos[1], './images/hp_bar.png') [hp_sprite, hp] = menu.create_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos) #creating the xp bar sprite and creating the bar xp_sprite = person.create_person(c_pos[0], c_pos[1], './images/exp_bar.png') xp_sprite = menu.create_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos) #creating the level and gold sprite l_g = menu.create_l_g(renderer, sprite_layers, screen, c_pos) #creating the weapons interface background and values f_i = menu.create_f_i(renderer, sprite_layers, screen, c_pos) interf_fight = menu.create_interface_fight(renderer, sprite_layers, screen, c_pos) ##Aditional background music that turns onn and off add = None #Creating the main background music musicbg = sound.create_music(file_name) #Creating the additional full time running background music if file_name == './maps/village2_out1.tmx': music_add = sound.create_music_add('./sounds/vil2add.ogg') #--------------------------------------- """MAIN GAME LOOP""" while running: #fixing the FPS dt = clock.tick(50) ##Checking for map exit -> -1 no change -> !=-1 Specific portal number change_map = exit_map(hero, portals) if change_map != -1: portal = True #Giving the nextmap's name and frm -> "frm"-> tells if the player came from which map # -> to give the respective starting position nextlevel = next_map(file_name, change_map) ##Giving the warning messages wherever needed #In Ship map -> warning for not enough gold if (file_name == './maps/ship.tmx' and (savegame['pirate'] == 0 or savegame['pirate_map'] == 1)): portal = False warning = menu.warning_msg(file_name, renderer, sprite_layers, screen, c_pos, 1) ##Infinite loop until menu is to be removed i = 0 while (i != 1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i = 1 continue sprite_layers[2].remove_sprite(warning) hero_pos_x -= 10 #In burning village map -> "Something is missing" if player do not have a melee weapon elif (file_name == './maps/village1.tmx' and savegame['dagger'] == 0): portal = False warning = menu.warning_msg(file_name, renderer, sprite_layers, screen, c_pos, 0) ##Infinite loop until menu is to be removed i = 0 while (i != 1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i = 1 continue sprite_layers[2].remove_sprite(warning) hero_pos_y += 10 #In village2 inside -> "Something is missing" if no melee weapon or not talked to the spooky guy elif (file_name == './maps/village2_inside.tmx' and (savegame['eqp_weapon'] == None or savegame['spook'] == 0) and (change_map == 1 or change_map == 2)): portal = False warning = menu.warning_msg(file_name, renderer, sprite_layers, screen, c_pos, 0) ##Infinite loop until menu is to be removed i = 0 while (i != 1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i = 1 continue sprite_layers[2].remove_sprite(warning) hero_pos_y += 10 #Quit the while loop if portal is true if portal == True: running = False ##loading the main dictionary into "savegame" savegame = pk.load(open("./save.p", "rb")) #Getting the current camera position c_pos = camra.camera(file_name, renderer, hero) ##IN Ship map to move the ship when hreo reaches a certain point if (file_name == './maps/ship.tmx' and hero_pos_x > 14 * 32 and ship_present == 0): #Creating the addtional bg music (which continues once started) music_add = sound.create_music_add('./sounds/pirate.ogg') music_add.set_volume(0.7) ship_moving = True #Creating the Ship sprite and adding it ship = person.create_person(9 * 32, 29 * 32, './images/ship.png') sprite_layers[1].add_sprite(ship) #while function for the ship moving while (ship_moving): #moving the ship ship.rect.top -= 1 #rendering the screen to keep the screen updated render_update(renderer, sprite_layers, screen) #Stopping the ship if (ship.rect.top < 7 * 32): #Ship reached the shore ship_present = 1 i = 0 while (i != 30): i = i + 1 continue #changing to second image ship.image = pygame.image.load('./images/ship2.png') render_update(renderer, sprite_layers, screen) ##adding some delay to ship image change while (i != 60): i = i + 1 continue #changing to third image and ship.image = pygame.image.load('./images/ship3.png') ship.rect.top = 4 * 32 ship.rect.right += 32 #Coming out of while loop ship_moving = False #Creating the Captian as villger in the format in which other villagers are added in person file vil=[{'sprte':person.create_person(5*32,5*32-16,'./images/cappy.png'),\ 'toplx':None,'toply':None,'w':None,'h':None}] #adding the Captian sprite_layers[1].add_sprite(vil[0]['sprte']) ##MOVING THE HERO mov = movements.hero_move(mr, ml, md, mu, hero_pos_x, hero_pos_y, hero, speed, sprite_layers, vil, misc) #The variables for the animation images returned from the movement fucntion #Then the same variables are passed again to keep the animation smoother mr = mov[0] ml = mov[1] md = mov[2] mu = mov[3] #position variables -> called and passed again hero_pos_x = mov[4] hero_pos_y = mov[5] #hypothetical rectagle -> where the hero will move next? #used to check collision against villagers hero_hypo = mov[7] #Additional bg music (on/off) if (file_name == './maps/village1.tmx' and hero_pos_y <= 28 * 32 and flag_crossed == 0): add = sound.create_music_add('./sounds/river.ogg') ##to check wether first time crossed or other flag_crossed = 1 elif (file_name == './maps/village1.tmx' and hero_pos_y >= 28 * 32 and flag_crossed == 1): sound.stop_soundfx(add) flag_crossed = 0 ##Moving the villager if there is one if (vil != None): ##Moving the villager -> the function gives the old direction in which the villagers were ##travelling. In every loop they take one step drctn = movements.move_villager(drctn, speed, vil, hero_hypo, vmu, vmr, vmd, vml, file_name) ##Gives the index of colliding vilager coll = movements.colliding_other_living(vil, hero_hypo) #Checking if there is any misc elif (misc != None): collm = movements.colliding_other_living(misc, hero_hypo) #Moving the interface with camera interface.rect.topleft = (c_pos[0] - 512, c_pos[1] - 384) hp_sprite.rect.topleft = (c_pos[0] - 400, c_pos[1] - 382) xp_sprite.rect.topleft = (c_pos[0] - 400, c_pos[1] - 345) l_g.rect.topleft = (c_pos[0] - 508, c_pos[1] - 381) f_i.rect.bottomright = (c_pos[0] + 500, c_pos[1] + 350) interf_fight.rect.bottomright = (c_pos[0] + 512, c_pos[1] + 384) #-------------------------- EVENT HANDLING --------------------------------- for event in pygame.event.get(): #Updating the interface whenever an event happens menu.update_lg(l_g, c_pos) menu.update_hp_bar(renderer, sprite_layers, screen, hp_sprite, c_pos, 0) menu.update_xp_bar(renderer, sprite_layers, screen, xp_sprite, c_pos, 0) menu.update_f_i(f_i, c_pos) #For Key pressed event if event.type == pygame.KEYDOWN: x = event.key if (x == pygame.K_ESCAPE): pygame.quit() #Saving the game elif (x == pygame.K_s): #saving the present file name savegame['last_map'] = file_name #saving the present frm-> where to put the hero when game loaded savegame['last_frm'] = frm #to allow the load game function to work savegame['save'] = 1 pk.dump(savegame, open("./save.p", "wb")) sv = menu.save_menu(c_pos) sound.create_soundfx('./sounds/savegame.ogg') sprite_layers[2].add_sprite(sv) render_update(renderer, sprite_layers, screen) menu.exit_menu(x) sprite_layers[2].remove_sprite(sv) #Printing the dictionary elif (x == pygame.K_q): print savegame #Starting the shopping interface elif (x == pygame.K_SPACE and shop_portal != None and pygame.Rect.colliderect(hero.rect, shop_portal)): shop(c_pos, renderer, sprite_layers, screen, l_g) #Showing the tunnel riddle elif (x == pygame.K_SPACE and portal_board != None and pygame.Rect.colliderect(hero.rect, portal_board)): riddle = person.create_person( hero.rect.centerx, hero.rect.centery + 200, './images/tunnel_riddle.png') sprite_layers[2].add_sprite(riddle) (renderer, sprite_layers, screen) = render_update(renderer, sprite_layers, screen) ##Infinite loop until menu is to be removed i = 0 while (i != 1): for event in pygame.event.get(): if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE): i = 1 continue sprite_layers[2].remove_sprite(riddle) ##Showing the Travel option of the ship elif (file_name == './maps/ship.tmx' and ship_present == 1 and x == pygame.K_SPACE and collision.checkCollision(hero, ship)): #creating the menu imgtx = Image.open('./images/textbox.png') draw = ImageDraw.Draw(imgtx) font = ImageFont.truetype("./PAPYRUS.ttf", 30) draw.text((260, 70), 'Are you sure you want to travel?', (0, 0, 0), font=font) draw.text((260, 110), '(Y)es (N)o', (0, 0, 0), font=font) imgtx.save('./images/ship_conf.png') ship_conf = person.create_menu_bg( c_pos[0], c_pos[1] - 768 / 2, './images/ship_conf.png') sprite_layers[2].add_sprite(ship_conf) render_update(renderer, sprite_layers, screen) ##Infinite loop until menu is to be removed result = 'x' while (result == 'x'): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x = event.key if (x == pygame.K_y): result = 'y' else: result = 'n' break sprite_layers[2].remove_sprite(ship_conf) render_update(renderer, sprite_layers, screen) #Checking the conditions if pressed 'y' -> want to travel if (result == 'y'): #condition for job done and then gold does not matter if (savegame['talk_vil']['./maps/ship.tmx'][0] == 1): pirate_mapchange = 1 running = False #condition for job not done but have gold elif (savegame['gold'] >= 50): savegame['gold'] -= 50 pk.dump(savegame, open("./save.p", "wb")) pirate_mapchange = 1 running = False #condition for job not done and not enough gold elif (savegame['gold'] < 50 and savegame['pirate_map'] == 0): menu.warning_msg(file_name, renderer, sprite_layers, screen, c_pos, 0) break #Key pressed near a collectable object elif (x == pygame.K_SPACE and misc != None): i = 0 l = len(misc) while (i >= 0 and i < l): if pygame.Rect.colliderect(hero.rect, misc[i]['sprte'].rect): savegame['misc'].append(misc[i]['name']) savegame['misc'].append(misc[i]['value']) savegame[misc[i]['name']] = 1 pk.dump(savegame, open("./save.p", "wb")) sprite_layers[1].remove_sprite(misc[i]['sprte']) misc.pop(i) else: i += 1 l = len(misc) #toggling the interface off elif (x == pygame.K_f and interf_toggle == 0): sprite_layers[2].remove_sprite(hp_sprite) sprite_layers[2].remove_sprite(xp_sprite) sprite_layers[1].remove_sprite(interface) sprite_layers[2].remove_sprite(l_g) sprite_layers[1].remove_sprite(interf_fight) sprite_layers[2].remove_sprite(f_i) interf_toggle = 1 #toggling the interface on elif (x == pygame.K_f and interf_toggle == 1): sprite_layers[2].add_sprite(hp_sprite) sprite_layers[2].add_sprite(xp_sprite) sprite_layers[1].add_sprite(interface) sprite_layers[2].add_sprite(l_g) sprite_layers[1].add_sprite(interf_fight) sprite_layers[2].add_sprite(f_i) interf_toggle = 0 ##Making the Inventory elif (x == pygame.K_i): sound.create_soundfx('./sounds/inventory.ogg') inven = menu.create_menu_inventory(c_pos) sprite_layers[2].add_sprite(inven) render_update(renderer, sprite_layers, screen) ##Infinite loop until inventory is to be removed while (x != pygame.K_SPACE): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x = event.key continue sprite_layers[2].remove_sprite(inven) render_update(renderer, sprite_layers, screen) #------------------TALKING TO VILLAGER------------------ #Give the required values for showing the talk to villager number 'coll' (line 394) if (vil != None): talk_result = talk.iftalk( coll, x, vil, count, hero_pos_x, hero_pos_y, file_name) ##Gives : count(for checking if talking) ##coll (which villager he's talking to) ##talktime(talking again or not) #if no villager colliding else: talk_result = None #talk_result[0] -> count --- shows the talking interface only if count is 1-> talking to someone #count remains 0 as called before mainloop if (talk_result[0] == 1): ##gives back the text for respective villager menutext = menu.create_menu_vil(coll, file_name, talk_result[2]) ##variable to check for for how many number of times the loop should work dialog_show = 0 sound.create_soundfx('./sounds/talk.ogg') ##gives the name of the created image txtim = person.create_text_img('./images/textbox.png', menutext, dialog_show) ##gives the sprite for the menu image menu_ui = person.create_menu_bg(c_pos[0], c_pos[1] - 768 / 2, txtim) sprite_layers[2].add_sprite(menu_ui) render_update(renderer, sprite_layers, screen) #the loop for showing text box (again and again) while (dialog_show < len(menutext)): for event in pygame.event.get(): if event.type == pygame.KEYDOWN: x = event.key #for the villagers that have Yes/No option if (dialog_show == len(menutext) - 1): if x == pygame.K_y: if (file_name == './maps/village1.tmx' and coll == 1 and savegame['b_h_vil'] == 0): #sound created as this 'add' variable is closing when going out of village1 #main reason -> prevent error add = sound.create_music_add( './sounds/river.ogg') savegame['b_h_vil'] = 1 villager_job = 1 running = False sprite_layers[2].remove_sprite( menu_ui) dialog_show += 1 elif (file_name == './maps/village2_out1.tmx' and coll == 0 and savegame['f_vil'] == 0): savegame['f_vil'] = 1 villager_job = 2 running = False sprite_layers[2].remove_sprite( menu_ui) dialog_show += 1 elif (file_name == './maps/village2_inside.tmx' and coll == 2 and savegame['spook'] == 0): savegame['spook'] = 1 villager_job = 3 running = False sprite_layers[2].remove_sprite( menu_ui) dialog_show += 1 elif x == pygame.K_n: sprite_layers[2].remove_sprite(menu_ui) dialog_show += 1 #all other villagers if (x == pygame.K_SPACE): ##remove the prev text image sprite_layers[2].remove_sprite(menu_ui) ##indicates for the next one dialog_show += 1 ##for not going in the loop again if dialog_show == len(menutext): break ##if any other key pressed elif (x != pygame.K_SPACE): continue ##for not going in the loop again elif dialog_show == len(menutext): break sound.create_soundfx('./sounds/talk.ogg') #next text image created and its sprite created and added txtim=person.create_text_img('./images/textbox.png',menutext, \ dialog_show) menu_ui=person.create_menu_bg(c_pos[0],c_pos[1]-768/2,\ txtim) sprite_layers[2].add_sprite(menu_ui) render_update(renderer, sprite_layers, screen) if x == pygame.K_SPACE: ##an infite loop till 'x' is pressed menu.exit_menu(x) sprite_layers[2].remove_sprite(menu_ui) #--------------------TALKING ENDS------------------- #----------------------------- EVENT HANDLING ENDED ---------------------------- # adjust camera according to the hero's position, follow him # clear screen, might be left out if every pixel is redrawn anyway screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() """------------------------------------- OUT OF MAIN GAME LOOP----------------------------------""" #stopping the additional background music if (file_name == './maps/village2_out1.tmx' or file_name == './maps/ship.tmx'): music_add.stop() #stopping the fluctuating bg music #'add' created (in line 585) to prevent error in this snippet if (file_name == './maps/village1.tmx'): sound.stop_soundfx(add) musicbg.stop() #If portal was the reason for stopping the game loop if portal == True: #name of next map and respective frm mp = nextlevel[0] frm = nextlevel[1] #calling the map demo_pygame(mp, frm) #If main loop ended because of a side task if villager_job == 1: knifehouse1.main() elif villager_job == 2: fish.main() elif villager_job == 3: spooky.main() #when pressed 'yes' to the ship travel if pirate_mapchange == 1: demo_pygame('./maps/village2_out1.tmx', 0)
def demo_pygame(file_name): # parser the map (it is done here to initialize the # window the same size as the map if it is small enough) world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode( file_name) pygame.display.set_caption("tiledtmxloader - " + file_name + \ " - keys: arrows, 0-9") screen_width = min(1024, world_map.pixel_width) screen_height = min(768, world_map.pixel_height) screen = pygame.display.set_mode((screen_width, screen_height)) mixer.init() # loading the sound files in different sound formats of mixer and main background sound in mixer stream fish_catch = mixer.Sound('./sounds/zish_catch.ogg') file = './sounds/zish_back.ogg' mixer.music.load(file) mixer.music.play(-1) # load the images using pygame resources = tiledtmxloader.helperspygame.ResourceLoaderPygame() resources.load(world_map) # prepare map rendering assert world_map.orientation == "orthogonal" # renderer renderer = tiledtmxloader.helperspygame.RendererPygame() # create hero sprite # use floats for hero position hero_pos_x = 1048 / 2 hero_pos_y = 768 / 2 + 6 * 32 hero = create_hero(hero_pos_x, hero_pos_y) hero_width = 31 hero_height = 5 # creating random fish fishes = [] fish_count = 10 fish_loc = [] for i in range(fish_count): fishes.append(create_fish()) #Storing the fishes in an array for further addition for i in range(fish_count): fish_loc.append(fishes[i].rect) # for different directions different images to be set on the moving fish. im1 = pygame.image.load('./images/ztile1.png') im2 = pygame.image.load('./images/ztile2.png') # cam_offset is for scrolling cam_world_pos_x = screen_width / 2 cam_world_pos_y = screen_height / 2 # set initial cam position and size renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \ screen_width, screen_height) # retrieve the layers sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources) # filter layers sprite_layers = [ layer for layer in sprite_layers if not layer.is_object_group ] # adding the hero and the firshes to the the right layer sprite_layers[1].add_sprite(hero) flag = [0 for x in range(fish_count)] #small fishes added in bottom of screen showing the count of remaining fishes left to complete the game small_fish = [] for i in range(fish_count): small_fish.append( person.create_person(64 + i * 32, 22 * 32, './images/ztile_small.png')) for i in range(len(flag)): sprite_layers[1].add_sprite(fishes[i]) for i in range(len(flag)): sprite_layers[1].add_sprite(small_fish[i]) # variables for the main loop clock = pygame.time.Clock() running = True speed_x = 0.0 speed_y = 0.0 #initializing random values for the direction of 10 fishes for i in range(len(flag)): flag[i] = random.randint(1, 2) # mainloop # set up timer for fps printing pygame.time.set_timer(pygame.USEREVENT, 10000) while running: dt = clock.tick(50) # value set to work same with different processors # event handling for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # showing the fps elif event.type == pygame.USEREVENT: print("fps: ", clock.get_fps()) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False # deciding fish speed at each instant along with the need to change direction with another function for i in range(len(flag)): f_temp_x = fishes[i].rect.centerx f_temp_y = fishes[i].rect.centery if (flag[i] == 0): flag[i] = random.randint(1, 2) if (flag[i] == 1): f_temp_x += random.randint(6, 11) else: f_temp_x -= random.randint(6, 11) f_temp_x, f_temp_y, flag[i] = dist_bound_x( f_temp_x, f_temp_y, flag[i]) # returns new position with direction flag if (flag[i] == 1): fishes[i].image = im2 else: fishes[i].image = im1 # assiging the new final positon of every fish in every tick fishes[i].rect.centerx = f_temp_x fishes[i].rect.centery = f_temp_y fish_loc[i] = fishes[i].rect # find directions direction_x = pygame.key.get_pressed()[ pygame.K_RIGHT] - pygame.key.get_pressed()[pygame.K_LEFT] direction_y = pygame.key.get_pressed()[ pygame.K_DOWN] - pygame.key.get_pressed()[pygame.K_UP] # make sure the hero moves with same speed in all directions (diagonal!) speed_x += direction_x * 0.0056 speed_y += direction_y * 0.0056 dir_len = math.hypot(direction_x, direction_y) dir_len = dir_len if dir_len else 1.0 if (math.fabs(speed_x) > 0.74): if (speed_x > 0): speed_x = 0.7 else: speed_x = -0.7 # update position step_x = speed_x * 36 / dir_len step_y = speed_y * 36 / dir_len step_x, step_y = check_collision( hero_pos_x, hero_pos_y, step_x, step_y, hero_width, hero_height, sprite_layers[3]) # to check collision from boundary for the hook hero_pos_x += step_x hero_pos_y += step_y if (step_x == 0): speed_x = 0.0 if (step_y == 0): speed_y = 0.0 hero.rect.center = (hero_pos_x, hero_pos_y) # checking for the contact with the hook midtop for catching fish flag = fish_collision(fish_loc, hero.rect, flag) i = 0 # always check for any value in flag to be 0 if yes to remove that fish while (i < len(flag)): #print i if (flag[i] == 0): fish_catch.play() sprite_layers[1].remove_sprite( fishes[i]) # removing big fish from big screen flag.pop(i) sprite_layers[1].remove_sprite(small_fish[len( flag)]) # removing small fish from big screen fishes.pop(i) fish_loc.pop(i) continue i += 1 #print("cleared here") # synchronizing fishes sound along with their catch. if (len(flag) == 0): mixer.music.stop() sv = pk.load(open("./save.p", "rb")) sv['f_vil'] = 1 sv['talk_vil']['./maps/village2_out1.tmx'][0] = 1 pk.dump( sv, open("./save.p", "wb") ) # saving the results in the file to check for the next time in the story where to go or not to go running = False # adjust camera according to the hero's position, follow him screen.fill((0, 0, 0)) # render the map for sprite_layer in sprite_layers: if sprite_layer.is_object_group: # we dont draw the object group layers # you should filter them out if not needed continue else: renderer.render_layer(screen, sprite_layer) pygame.display.flip() # calling the other map after completion of catching all the fishes shifty1.demo_pygame('./maps/village2_out1.tmx', 2)