Возникли проблемы при попытке реализовать уровни в моей игре, сделанные в Pygame правильно - PullRequest
0 голосов
/ 12 января 2020

Хорошо, это последний шаг в моей разочаровывающей игре. Я работал над игрой, в которой на каждом уровне есть ловушки, которых вы должны избегать, чтобы перейти на следующий уровень. Разобрался во всем, кроме уровней. Вот с чем я работал. Вот мой файл Maps.py:

rage_map = [[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,],
            [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
            [0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]

de_dirt = [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
            [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]

class Create_level(object):
    def load_map(self, Map):
        wall = Sprite(pygame.Surface([1,700]), -1,0)
        spr.objects_sprites.add(wall)
        spr.all_sprites.add(wall)
        current_map = list(Map)
        y = 0
        for layer in current_map:
            x = 0
            for tile in layer:
                if tile == 0:
                    Terr = Sprite(img.dirt_img, x*32, y*16 + 340)
                    spr.objects_sprites.add(Terr)
                    spr.all_sprites.add(Terr)
                    con.ToClean.append(Terr)
                if tile == 1:
                    Terr = Sprite(img.grass_img, x*32, y*16 + 340)
                    spr.objects_sprites.add(Terr)
                    spr.all_sprites.add(Terr)
                    con.ToClean.append(Terr)
                x += 1
            y += 1

    def clean_level(self):
        con.level_no += 1
        spr.all_sprites.remove(con.ToClean)
        play.reset()

class Level_01(Create_level):
    def __init__(self):
        self.load_map(current_map[0])
        self.trap = AutoHazard(img.lul_img, 1000, con.height - 50)
        spr.all_sprites.add(self.trap)

        self.trap3 = AutoHazard(img.lul_img, 900, con.height - 50)
        self.trap3.make_rect(936,536,500,500)
        spr.all_sprites.add(self.trap3)


        self.trap4 = AutoHazard(img.lul_img, 1500, 270)
        self.trap4.make_rect(596, 380, 156, 34)
        spr.all_sprites.add(self.trap4)

        self.trap5 = AutoHazard(img.zulul_img, 1400, -50)
        spr.all_sprites.add(self.trap5)

        self.trap2 = AutoHazard(img.lul_img, 800, con.height - 50)
        spr.all_sprites.add(self.trap2)

    def set_level(self):
        self.trap3.set(20, 0, 'special')

        self.trap4.set(-25, 0, 'special')

        self.trap5.set(0, 30)

        self.trap2.set(0, -20)

        self.trap.set(0, -20)
        if play.rect.x >= con.width - 50:
            self.clean_level()
class Level_02(Create_level):
    def __init__(self):
        self.load_map(current_map[1])
        self.trap = AutoHazard(img.lul_img, 500, con.height - 50)
        spr.all_sprites.add(self.trap)

        self.trap3 = AutoHazard(img.lul_img, 600, con.height - 50)
        self.trap3.make_rect(636,536,500,500)
        spr.all_sprites.add(self.trap3)


        self.trap2 = AutoHazard(img.lul_img, 300, con.height - 50)
        spr.all_sprites.add(self.trap2)

    def set_level(self):
        self.trap3.set(20, 0, 'special')
        self.trap2.set(0, -20)
        self.trap.set(0, -20)
        if play.rect.x >= con.width - 50:
            self.clean_level()
    def reset_level():
        spr.all_sprites.add(play)
        spr.all_sprites.add(con.killed_sprites)
        #command to delete all elements in killed_sprites, otherwise it keeps on adding infinitely
        del con.killed_sprites[:]
        play.change_y = 0
        play.is_dead == 0
        spr.reset_sprites()

До сих пор я сделал 2 уровня, чтобы мне было легче.

Хорошо, теперь проблема в том, чтобы правильно реализовать его в моем главном file:

#code above not necessary
con.level_no = 0
level_list = []
level_list.append(Level_01())
current_level = level_list[con.level_no]
if con.level_no == 1:
    spr.all_sprites.remove(con.ToClean)
    level_list.append(Level_02())

GameRunning = True
while GameRunning:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            GameRunning = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                play.go_left()
            elif event.key == pygame.K_RIGHT:
                play.go_right()
            elif event.key == pygame.K_UP:
                play.yahoo()
                play.jumping = True
            elif event.key == pygame.K_r:
                reset_level()
            elif event.key == pygame.K_ESCAPE:
                gamerunning = False

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT and play.change_x < 0:
                play.stop()
            if event.key == pygame.K_RIGHT and play.change_x > 0:
                play.stop()



    con.screen.blit(img.back_img, [-300,-100])
    spr.all_sprites.draw(con.screen)
    spr.all_sprites.update()


    intro()
    death_counter()

    for current_level in level_list:
        current_level.set_level()


    #con.screen.blit(pygame.transform.scale(display, con.window_size),(0,0))
    pygame.display.update()
    clock.tick(60)
pygame.quit()

Что я не могу понять, как это сделать правильно, так это как на самом деле настроить эти уровни. Поскольку Level_01 и Level_02 являются классами конструктора, они создаются, как только они создаются. У меня много проблем с поиском обходного пути для этого.

Спасибо за помощь.

...