示例#1
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)
示例#2
0
def demo_pygame(file_name, frm):

    # parser the map (it is done here to initialize the
    # window the same size as the map if it is small enough)
    world_map = tiledtmxloader.tmxreader.TileMapParser().parse_decode(
        file_name)

    pygame.display.set_caption("tiledtmxloader - " + file_name + \
                                                        " - keys: arrows, 0-9")
    screen_width = min(1024, world_map.pixel_width)
    screen_height = min(768, world_map.pixel_height)
    screen = pygame.display.set_mode((screen_width, screen_height))
    # loading the sound files in different sound formats of mixer and main background sound in mixer stream
    mixer.init()
    sound_guard_watch = mixer.Sound('./sounds/pain.ogg')
    sound_hole_fall = mixer.Sound('./sounds/scream2.ogg')
    file = './sounds/zrap_back.ogg'
    mixer.music.load(file)
    mixer.music.play(-1)

    # load the images using pygame
    resources = tiledtmxloader.helperspygame.ResourceLoaderPygame()
    resources.load(world_map)

    # prepare map rendering
    assert world_map.orientation == "orthogonal"

    # renderer
    renderer = tiledtmxloader.helperspygame.RendererPygame()

    # create hero sprite
    # use floats for hero position
    hero_pos_x = 3 * 32
    hero_pos_y = 21 * 32
    hero = person.create_person(hero_pos_x, hero_pos_y, './images/hero_u2.png')
    hero_width = hero.rect.width
    hero_height = 5
    # laoding the scroll
    map_trap = person.create_person(8 * 32 + 16, 3 * 32 + 30,
                                    './images/map_trap.png')
    #creating the 3 guards
    guard = []
    guard_pos_x = random.randint(10 * 32, 18 * 32)
    guard_pos_y = 18 * 32
    guard.append(create_guard(guard_pos_x, guard_pos_y))
    guard.append(create_guard(random.randint(22 * 32, 31 * 32), 15 * 32))
    guard.append(create_guard(random.randint(22 * 32, 31 * 32), 6 * 32))
    # field of view of different guards
    # collision with this tile is death for hero
    danger = []
    # kill flag for last trap tile of pins from ground
    showkillbill = 0
    # creating the pintrap but not adding to the sprite
    killbill = create_kill(18 * 32, 8 * 32 + 48)
    hole = create_hole(18 * 32, 2 * 32)
    danger_count = 140 + 1  # for kill tile
    # intersect tiles for nullyfying guard filed of view near stones
    intersect1 = []
    for i in range(5):
        for j in range(5):
            intersect1.append(
                create_dang(13 * 32 + j * 16 + 16, (21 * 32 - 16) + i * 16))
    intersect2 = []
    for i in range(5):
        for j in range(5):
            intersect2.append(
                create_dang(13 * 32 + j * 16 + 48, (21 * 32 - 16) + i * 16))

    for i in range(danger_count - 1):
        danger.append(create_dang(100, 100))

    # dimensions of the hero for collision detection

    # cam_offset is for scrolling
    cam_world_pos_x = 512
    cam_world_pos_y = 768 / 2

    # set initial cam position and size
    renderer.set_camera_position_and_size(cam_world_pos_x, cam_world_pos_y, \
                                        screen_width, screen_height)

    # retrieve the layers
    sprite_layers = tiledtmxloader.helperspygame.get_layers_from_map(resources)

    # filter layers
    sprite_layers = [
        layer for layer in sprite_layers if not layer.is_object_group
    ]

    # adding the hero and the danger and the traps to the the right layer

    sprite_layers[4].add_sprite(hero)
    sprite_layers[4].add_sprite(guard[0])
    sprite_layers[4].add_sprite(guard[1])
    sprite_layers[4].add_sprite(guard[2])
    sprite_layers[2].add_sprite(map_trap)
    for i in range(56, len(danger)):
        sprite_layers[1].add_sprite(danger[i])
    sprite_layers[3].add_sprite(hole)
    # set up timer for fps printing
    pygame.time.set_timer(pygame.USEREVENT, 1000)

    # variables for the main loop
    cross_guards = 0
    clock = pygame.time.Clock()
    running = True
    speed = 3.6505
    flag1 = random.randint(1, 2)
    flag2 = random.randint(1, 2)
    flag3 = random.randint(1, 2)
    count = -1
    mr = ml = md = mu = 0
    kill_active = 0
    portal1 = pygame.Rect(7 * 32, 2 * 32, 96, 64)

    # mainloop
    while running:
        """
		for 3 guards flag1 flag2 flag3 for their directions in horizontal direction 
	"""
        dt = clock.tick(35)
        # for guard1 movement here
        if (flag1 == 1):
            if (guard[0].rect.centerx < 10 * 32): flag1 = 2
            else: guard[0].rect.centerx -= 2
        elif (flag1 == 2):
            if (guard[0].rect.centerx > 18 * 32): flag1 = 1
            else: guard[0].rect.centerx += 2
        index = 0
        #updating the danger tiles for the first guard
        if (flag1 == 1):
            for i in range(10, 0, -1):
                for j in range(i):
                    danger[index].rect.center = ((guard[0].rect.centerx -
                                                  j * 16),
                                                 (guard[0].rect.centery +
                                                  (10 - i) * 16))
                    index += 1
        elif (flag1 == 2):
            for i in range(10, 0, -1):
                for j in range(i):
                    danger[index].rect.center = ((guard[0].rect.centerx +
                                                  j * 16),
                                                 (guard[0].rect.centery +
                                                  (10 - i) * 16))
                    index += 1

        # for guard 2  movement here
        if (flag2 == 1):
            if (guard[1].rect.centerx < 22 * 32): flag2 = 2
            else: guard[1].rect.centerx -= 2
        elif (flag2 == 2):
            if (guard[1].rect.centerx > 31 * 32): flag2 = 1
            else: guard[1].rect.centerx += 2

        #updating the danger tiles for the first guard
        if (flag2 == 1):
            for i in range(7, 0, -1):
                for j in range(i):
                    danger[index].rect.center = ((guard[1].rect.centerx -
                                                  j * 16),
                                                 (guard[1].rect.centery +
                                                  (7 - i) * 16))
                    #danger[index].rect.center = ((guard[1].rect.centerx - j *16 ), (guard[1].rect.centery - (i * 16)))
                    index += 1
            for i in range(0, 7):
                for j in range(i):
                    #danger[index].rect.center = ((guard[1].rect.centerx - j *16 ), (guard[1].rect.centery + (7 - i) * 16))
                    danger[index].rect.center = ((guard[1].rect.centerx -
                                                  j * 16),
                                                 (guard[1].rect.centery -
                                                  (7 - i) * 16))
                    index += 1

        if (flag2 == 2):
            for i in range(7, 0, -1):
                for j in range(i):
                    danger[index].rect.center = ((guard[1].rect.centerx +
                                                  j * 16),
                                                 (guard[1].rect.centery +
                                                  (7 - i) * 16))
                    index += 1
            for i in range(0, 7):
                for j in range(i):
                    danger[index].rect.center = ((guard[1].rect.centerx +
                                                  j * 16),
                                                 (guard[1].rect.centery -
                                                  (7 - i) * 16))
                    index += 1

        # for guard 3 movement here
        if (flag3 == 1):
            if (guard[2].rect.centerx < 22 * 32): flag3 = 2
            else: guard[2].rect.centerx -= 2
        elif (flag3 == 2):
            if (guard[2].rect.centerx > 31 * 32): flag3 = 1
            else: guard[2].rect.centerx += 2

        #updating the danger tiles for the first guard
        if (flag3 == 1):
            for i in range(6, 0, -1):
                for j in range(i):
                    danger[index].rect.center = ((guard[2].rect.centerx -
                                                  j * 16),
                                                 (guard[2].rect.centery +
                                                  (6 - i) * 16))
                    index += 1
            for i in range(0, 6):
                for j in range(i):
                    danger[index].rect.center = ((guard[2].rect.centerx -
                                                  j * 16),
                                                 (guard[2].rect.centery -
                                                  (6 - i) * 16))
                    index += 1

        if (flag3 == 2):
            for i in range(6, 0, -1):
                for j in range(i):
                    danger[index].rect.center = ((guard[2].rect.centerx +
                                                  j * 16),
                                                 (guard[2].rect.centery +
                                                  (6 - i) * 16))
                    index += 1
            for i in range(0, 6):
                for j in range(i):
                    danger[index].rect.center = ((guard[2].rect.centerx +
                                                  j * 16),
                                                 (guard[2].rect.centery -
                                                  (6 - i) * 16))
                    index += 1

        #taking map and map change condition here with the scroll
        if (portal1.collidepoint(hero.rect.midtop)
                and pygame.key.get_pressed()[pygame.K_SPACE] == 1):
            sprite_layers[2].remove_sprite(map_trap)
            mixer.music.stop()
            sv = pk.load(open("./save.p", "rb"))
            #saving the data in the file
            sv['pirate_map'] = 1
            sv['pirate_vil'] = 1
            sv['talk_vil']['./maps/ship.tmx'][0] = 1
            pk.dump(sv, open("./save.p", "wb"))
            portal = True
            # now change map after end of the loop at the end of the loop
            running = False

        # checking collision in red zone

        for i in range(len(danger)):
            if (pygame.sprite.collide_rect(hero, danger[i])):
                """ 
				to palce the hero to starting position if it the redzone is not in intersect field 
				if false is 0 then the hero is moved to the initial position 
				the intersect case is only for the first guard 
                """
                false = 0
                if (flag1 == 1):
                    for j in range(len(intersect1)):
                        if (pygame.sprite.collide_rect(danger[i],
                                                       intersect1[j])):
                            false = 1
                    if (false == 0):
                        #print hero.rect.center
                        hero_pos_x = 3 * 32
                        hero_pos_y = 21 * 32
                        mixer.music.stop()
                        sound_guard_watch.play()
                        time.sleep(1)
                        mixer.music.play()
                        #print hero.rect.center
                        break
                elif (flag1 == 2):

                    for j in range(len(intersect2)):
                        if (pygame.sprite.collide_rect(danger[i],
                                                       intersect2[j])):
                            false = 1
                    if (false == 0):
                        #print hero.rect.center
                        hero_pos_x = 3 * 32
                        hero_pos_y = 21 * 32
                        mixer.music.stop()
                        sound_guard_watch.play()
                        time.sleep(1)
                        mixer.music.play()
                        #print hero.rect.center
                        break

        # after crossing
#stroing the hole image size for changing it later when hero crossing
        r1 = hole.rect
        im = hole.image
        r2 = im.get_rect()
        w = r2.width
        """
		cross_guards storing the checkpoint of the hero 
		1 after crossing all the guards 
		2 after crossing the hole 
        """
        if (count > 0):
            count += 1
        if (hero_pos_y < 3 * 32):
            cross_guards = 1

            #print cross_guards
        if (cross_guards == 1 and hero_pos_x < 20 * 32
                and hero_pos_y < 3 * 32):
            r1 = hole.rect
            im = hole.image
            r2 = im.get_rect()
            w = r2.width
            # if hole is large to limit hero falls and sent to starting position
            if (w < 60):
                im = pygame.transform.scale(im, (w + 2, w + 2))
                r = im.get_rect()
                r.center = r1.center
                hole.image = im
                hole.rect = r
            else:
                cross_guards = 0
                hero_pos_x = 3 * 32
                hero_pos_y = 21 * 32
                mixer.music.stop()
                sound_hole_fall.play()
                time.sleep(1)
                im = pygame.transform.scale(im, (12, 12))
                r = im.get_rect()
                r.center = r1.center
                hole.image = im
                hole.rect = r
                mixer.music.play()
        # condition that hero has crossed the hole trap count for pin from ground is started
#showkillbill is bool value for activating the pin ground trap
        elif (cross_guards == 1 and hero_pos_x < 19 * 32
              and hero_pos_y > 3 * 32):
            cross_guards = 2
            count = 1

        elif (cross_guards == 2 and not showkillbill == 1):
            showkillbill = 1

        elif (cross_guards == 2 and hero_pos_y > 16 * 32):
            cross_guards = 0
            im = pygame.transform.scale(im, (12, 12))
            r = im.get_rect()
            r.center = r1.center
            hole.image = im
            hole.rect = r
# sendin the hero back to start from position if collsion of midbottom with pin trap
        if (kill_active == 1):
            if (killbill.rect.collidepoint(hero.rect.midbottom)):
                cross_guards = 0
                hero_pos_x = 3 * 32
                hero_pos_y = 21 * 32
                mixer.music.stop()
                sound_guard_watch.play()
                time.sleep(1)
                im = pygame.transform.scale(im, (12, 12))
                r = im.get_rect()
                r.center = r1.center
                hole.image = im
                hole.rect = r
                mixer.music.play()
        # timed fluctuation of the pin trap
        if (showkillbill == 1 and count > 56):
            count = 1
            if (sprite_layers[3].contains_sprite(killbill)):
                sprite_layers[3].remove_sprite(killbill)
                kill_active = 0
            else:
                sprite_layers[3].add_sprite(killbill)
                kill_active = 1
        # event handling
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.USEREVENT:
                print("fps: ", clock.get_fps())
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    running = False

        # calling the hero_move fucntion from movements1 file for changing the position of the hero
        mov = movements1.hero_move(mr, ml, md, mu, hero_pos_x, hero_pos_y,
                                   hero, speed, sprite_layers[5])
        mr = mov[0]
        ml = mov[1]
        md = mov[2]
        mu = mov[3]
        hero_pos_x = mov[4]
        hero_pos_y = mov[5]
        # clear screen, might be left out if every pixel is redrawn anyway
        screen.fill((0, 0, 0))

        # render the map
        for sprite_layer in sprite_layers:
            if sprite_layer.is_object_group:
                continue
            else:
                renderer.render_layer(screen, sprite_layer)

        pygame.display.flip()

    if portal == True:
        shifty1.demo_pygame('./maps/ship.tmx', 1)
def demo_pygame(file_name,frm):

    #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()
示例#4
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()
示例#5
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)
示例#6
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()
示例#7
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) 
示例#8
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()
示例#9
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)
示例#10
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()
示例#11
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)
示例#12
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)
示例#13
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)
示例#14
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)
示例#15
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)
示例#16
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)
示例#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
    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)
示例#18
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)