Смена лабиринта - PullRequest
       10

Смена лабиринта

0 голосов
/ 06 апреля 2019

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

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

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 Ответ

1 голос
/ 06 апреля 2019

Чтобы использовать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...