Ejemplo n.º 1
0
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])
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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])
Ejemplo n.º 5
0
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]
Ejemplo n.º 6
0
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]
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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])
Ejemplo n.º 11
0
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])
Ejemplo n.º 12
0
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
Ejemplo n.º 13
0
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
Ejemplo n.º 14
0
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()
Ejemplo n.º 15
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
    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)
Ejemplo n.º 16
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) 
Ejemplo n.º 17
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
    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()
Ejemplo n.º 18
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)
Ejemplo n.º 19
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)
    
    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)
Ejemplo n.º 20
0
        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()
Ejemplo n.º 21
0
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
Ejemplo n.º 22
0
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
Ejemplo n.º 23
0
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
Ejemplo n.º 24
0
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
Ejemplo n.º 25
0
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
Ejemplo n.º 26
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)

    #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()
Ejemplo n.º 27
0
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()
Ejemplo n.º 28
0
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
Ejemplo n.º 29
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)

    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)
Ejemplo n.º 30
0
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()
Ejemplo n.º 31
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)
Ejemplo n.º 32
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)
Ejemplo n.º 33
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)

    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)
Ejemplo n.º 34
0
 def test_create_person(self):
     id = create_person('Fred', 'Bloggs', 'sysadmin')
     self.assertTrue(id > 0)
Ejemplo n.º 35
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)
Ejemplo n.º 36
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)
Ejemplo n.º 37
0
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)
Ejemplo n.º 38
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
    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()
Ejemplo n.º 39
0
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)
Ejemplo n.º 40
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)
Ejemplo n.º 41
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)

    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)
Ejemplo n.º 42
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)

    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)
Ejemplo n.º 43
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)

    #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()
Ejemplo n.º 44
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)

    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)
Ejemplo n.º 45
0
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
Ejemplo n.º 46
0
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)
Ejemplo n.º 47
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)