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 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)