Изменение экрана лабиринта

#python #pygame

#python #pygame

Вопрос:

Я хочу заставить программу работать так, чтобы, когда спрайт достиг выхода из лабиринта (-15 и 780), экран переключался на следующий лабиринт в массиве комнат [].

Я попытался интегрировать средство проверки положения, используя уже существующий self.pos, хотя это, похоже, не работает. Я также добавил 4 лабиринта в массив с именем rooms

 import pygame

pos = (0,0)
class Player(pygame.sprite.Sprite):
    def __init__(self, image, pos, background):
        super().__init__()
        self.image = image
        self.pos = pygame.Vector2(pos)
        self.rect = self.image.get_rect(center=self.pos)
        self.background = background

    def update(self, events, dt):
        pressed = pygame.key.get_pressed()
        move = pygame.Vector2((0, 0))
        if pressed[pygame.K_w]: move  = (0, -1)
        if pressed[pygame.K_a]: move  = (-1, 0)
        if pressed[pygame.K_s]: move  = (0, 1)
        if pressed[pygame.K_d]: move  = (1, 0)
        #if move.length() > 0: move.normalise_ip()

        new_pos = self.pos   move*(dt/5)
        new_rect = self.rect.copy()
        new_rect.center = new_pos
        new_rect.clamp_ip(self.background.get_rect())
        new_pos = new_rect.center

        hit_box = self.background.subsurface(new_rect)
        for x in range(new_rect.width):
            for y in range(new_rect.height):
                if sum(hit_box.get_at((x, y))) < 500:
                    return

        self.pos = new_pos
        self.rect.center = self.pos
        global pos 
        pos = self.pos

# Scenes
def room1():
    background = (pygame.image.load('maze1.jpg'))
    background = pygame.transform.rotate(background, -90)
    background = pygame.transform.scale(background, (800,600))

def room2():
    background = (pygame.image.load('maze2.jpg'))
    background = pygame.transform.rotate(background, -90)
    background = pygame.transform.scale(background, (800,600))

def room3():
    background = (pygame.image.load('maze3.jpg'))
    background = pygame.transform.rotate(background, -90)
    background = pygame.transform.scale(background, (800,600))

def room4():
    background = (pygame.image.load('maze4.jpg'))
    background = pygame.transform.rotate(background, -90)
    background = pygame.transform.scale(background, (800,600))

def main():
    pygame.init()
    screen = pygame.display.set_mode((800, 600))
    screen_rect = screen.get_rect()

    clock = pygame.time.Clock()
    sprites = pygame.sprite.Group()

    rooms = []

    room = room1()
    rooms.append(room)
    room = room2()
    rooms.append(room)
    room = room3()
    rooms.append(room)
    room = room4()
    rooms.append(room)
    current_room_no = 0
    current_room = rooms[current_room_no]

    dt = 0
    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return
        if pos < -15:
            if current_room_no == 0:
                current_room_no = 2
                current_room = rooms[current_room_no]
                pos = 790
            elif current_room_no == 2:
                current_room_no = 1
                current_room = rooms[current_room_no]
                pos = 790
            else:
                current_room_no = 0
                current_room = rooms[current_room_no]
                pos = 790

        if pos > 801:
            if current_room_no == 0:
                current_room_no = 1
                current_room = rooms[current_room_no]
                pos = 0
            elif current_room_no == 1:
                current_room_no = 2
                current_room = rooms[current_room_no]
                pos = 0
            else:
                current_room_no = 0
                current_room = rooms[current_room_no]
                pos = 0

        pimg = pygame.Surface((10, 10))
        pimg.fill((200, 20, 20))
        sprites.add(Player(pimg, (50, 50), background))
        sprites.update(events, dt)
        screen.fill(pygame.Color('grey'))
        screen.blit(background, (0, 0))
        sprites.draw(screen)
        pygame.display.flip()
        dt = clock.tick(60)

if __name__ == '__main__':
    main()
  

Я надеюсь, что кто-нибудь может помочь мне интегрировать функцию смены экрана, поскольку в настоящее время код выдает ошибку о том, что pos не является переменной и / или pos вызывается после ее необходимости, но, как вы можете видеть, я четко вызываю переменную pos в начале кода как глобальную переменную.

Изображения: https://imgur.com/a/AgN5uJa

Ответ №1:

Для того, чтобы использовать pos , вам нужно указать global pos в начале main . В целом использование глобальных переменных не является хорошей практикой, попробуйте провести рефакторинг вашего кода, чтобы иметь pos внутри функции. Я обеспокоен тем, что вы пытаетесь сравнить tuple с int . Это также приведет к ошибке.

Я взял на себя смелость немного изменить ваш код.

  • Я использовал player.pos для отслеживания положения спрайта проигрывателя
  • Я инициализировал player только один раз для каждой комнаты, потому что игрок появлялся несколько раз, когда в игре происходили события
  • Я удалил room функции, поскольку вы делали что-то вроде rooms.append(room()) , вы в основном добавляли результат room функций, который был в основном None . Я не совсем понял, почему вы хотели это сделать
  • загруженный фон также один раз, не имеет смысла воссоздавать фоновую поверхность при каждой перерисовке
  • изменено начальное положение игрока, чтобы оно соответствовало входу в лабиринт
  • обнаруженная позиция выхода игрока, может быть изменена

Полный код:

 import pygame


class Player(pygame.sprite.Sprite):
    def __init__(self, image, pos, background):
        super().__init__()
        self.image = image
        self.pos = pygame.Vector2(pos)
        self.rect = self.image.get_rect(center=self.pos)
        self.background = background

    def update(self, events, dt):
        pressed = pygame.key.get_pressed()
        move = pygame.Vector2((0, 0))
        if pressed[pygame.K_w]: move  = (0, -1)
        if pressed[pygame.K_a]: move  = (-1, 0)
        if pressed[pygame.K_s]: move  = (0, 1)
        if pressed[pygame.K_d]: move  = (1, 0)
        #if move.length() > 0: move.normalise_ip()

        new_pos = self.pos   move*(dt/5)
        new_rect = self.rect.copy()
        new_rect.center = new_pos
        new_rect.clamp_ip(self.background.get_rect())
        new_pos = new_rect.center

        hit_box = self.background.subsurface(new_rect)
        for x in range(new_rect.width):
            for y in range(new_rect.height):
                if sum(hit_box.get_at((x, y))) < 500:
                    return

        self.pos = new_pos
        self.rect.center = self.pos
        pos = self.pos


# Scenes
def load_background(filename):
    background = (pygame.image.load(filename))
    background = pygame.transform.rotate(background, -90)
    background = pygame.transform.scale(background, (800,600))
    return background

def load_player(background):
    pimg = pygame.Surface((10, 10))
    pimg.fill((200, 20, 20))
    return Player(pimg, (25, 325), background)

def main():
    pygame.init()
    screen = pygame.display.set_mode((800, 600))
    screen_rect = screen.get_rect()

    clock = pygame.time.Clock()
    sprites = pygame.sprite.Group()

    mazes = [
        "maze1.jpg",
        "maze2.jpg",
        "maze3.jpg",
        "maze4.jpg",
    ]

    mazes_len = len(mazes)

    player = None
    initialized = False
    current_maze = None
    dt = 0

    while True:
        events = pygame.event.get()

        for e in events:
            if e.type == pygame.QUIT:
                return

        if not initialized:
            current_maze = 0
            background = load_background(mazes[current_maze])
            player = load_player(background)
            sprites.add(player)
            initialized = True

        player_x = player.pos[0]
        player_y = player.pos[1]

        if player_x >= 780 and 275 < player_y < 375:
            current_maze  = 1

            # reset to first maze if all mazes were done
            if current_maze >= mazes_len:
                current_maze = 0

            background = load_background(mazes[current_maze])
            sprites.empty()
            player = load_player(background)
            sprites.add(player)

        sprites.update(events, dt)

        screen.fill(pygame.Color('grey'))
        screen.blit(background, (0, 0))

        sprites.draw(screen)
        pygame.display.flip()
        dt = clock.tick(60)

if __name__ == '__main__':
    main()
  

Комментарии:

1. Да, только что получил эту точную ошибку, как я мог это исправить

2. Я хочу восстановить положение спрайтов, но не знаю, как это сделать tbh

3. @KallumHancox , не могли бы вы загрузить изображения лабиринта? Я хочу поместить их и играть

4. добавлены изображения, приятель

5. @KallumHancox ага. смотрю на это.