迷宫换屏

2024-04-24 23:32:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想让程序正常工作,这样当精灵到达迷宫出口(-15&;+780)时,屏幕将切换到阵列房间中的下一个迷宫[]。你知道吗

我尝试使用现有的自身位置虽然这似乎不起作用。我还将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


Tags: noposrectimageselfnewmoveif
1条回答
网友
1楼 · 发布于 2024-04-24 23:32:03

为了使用pos,您需要在main的开头指定global pos。一般来说,使用全局变量不是一个好的做法,请尝试重构代码,使函数中有pos。我很担心你想把tupleint作比较。这也会产生一个错误。你知道吗

我冒昧修改了你的密码。你知道吗

  • 我使用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()

相关问题 更多 >