Pygame(将简单矩形更改为图像)

Pygame (changing simple rectangle to image)

所以我不知道如何将代表玩家的矩形变成图像(飞船)。我知道这一定很简单,但是几个小时后我有点沮丧,所以我正在寻求帮助:(

bg_color = pygame.Color('black')
text_color = pygame.Color('darkgrey')
obstacles_color = pygame.Color('darkred')
player_color = pygame.Color('yellow')

fps = 60


window_height = 1200
window_width = 1200

player_speed = 4
player_size = 8
player_max_up = 125

obstacle_spawn_rate = 1
obstacle_min_size = 3
obstacle_max_size = 6
obstacle_min_speed = 2
obstacle_max_speed = 2




class Player:
    def __init__(self):
        self.size = player_size
        self.speed = player_speed
        self.color = player_color
        self.position = (window_width / 2, (window_height - (window_height / 10)))

    def draw(self, surface):
        r = self.get_rect()
        pygame.draw.rect(surface, self.color, r)


    def move(self, x, y):
        newX = self.position[0] + x
        newY = self.position[1] + y
        if newX < 0 or newX > window_width - player_size:
            newX = self.position[0]
        if newY < window_height - player_max_up or newY > window_height - player_size:
            newY = self.position[0]
        self.position = (newX, newY)

    def collision_detection(self, rect):
        r = self.get_rect()
        return r.colliderect(rect)

    def get_rect(self):
        return pygame.Rect(self.position, (self.size, self.size))


class Obstacles:
    def __init__(self):
        self.size = random.randint(obstacle_min_size, obstacle_max_size)
        self.speed = random.randint(obstacle_min_speed, obstacle_max_speed)
        self.color = obstacles_color
        self.position = (random.randint(0, window_width - self.size), 0 - self.size)

    def draw(self, surface):
        r = self.get_rect()
        pygame.draw.rect(surface, self.color, r)

    def move(self):
        self.position = (self.position[0], self.position[1] + self.speed)

    def is_off_window(self):
        return self.position[1] > window_height

    def get_rect(self):
        return pygame.Rect(self.position, (self.size, self.size))


class World:
    def __init__(self):
        self.reset()

    def reset(self):
        self.player = Player()
        self.obstacles = []
        self.gameOver = False
        self.score = 0
        self.obstacles_counter = 0
        self.moveUp = False
        self.moveDown = False
        self.moveLeft = False
        self.moveRight = False

    def is_game_over(self):
        return self.gameOver

    def update(self):
        self.score += 1

        if self.moveUp:
            self.player.move(0, - player_speed)
        if self.moveUp:
            self.player.move(0, player_speed)
        if self.moveLeft:
            self.player.move(-player_speed, 0)
        if self.moveRight:
            self.player.move(player_speed, 0)

        for each in self.obstacles:
            each.move()
            if self.player.collision_detection(each.get_rect()):
                self.gameOver = True
            if each.is_off_window():
                self.obstacles.remove(each)

        self.obstacles_counter += 1
        if self.obstacles_counter > obstacle_spawn_rate:
            self.obstacles_counter = 0
            self.obstacles.append(Obstacles())

    def draw(self, surface):
        self.player.draw(surface)
        for each in self.obstacles:
            each.draw(surface)

    def movement_keys(self, event):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                self.moveUp = True
            if event.key == pygame.K_DOWN:
                self.moveDown = True
            if event.key == pygame.K_LEFT:
                self.moveLeft = True
            if event.key == pygame.K_RIGHT:
                self.moveRight = True

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                 self.moveUp = False
            if event.key == pygame.K_DOWN:
                 self.moveDown = False
            if event.key == pygame.K_LEFT:
                 self.moveLeft = False
            if event.key == pygame.K_RIGHT:
                 self.moveRight = False


def run():
    pygame.init()
    clock = pygame.time.Clock()
    window = pygame.display.set_mode((window_height, window_width))
    pygame.display.set_caption("Avoid Obstacles")
    surface = pygame.Surface(window.get_size())
    surface = surface.convert()

    world = World()

    font = pygame.font.SysFont("Times", 35, "bold")

    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN and event.key == ord("r"):
                world.reset()
            else:
                world.movement_keys(event)

        if not world.is_game_over():
            world.update()

        window.fill(bg_color)
        clock.tick(fps)
        world.draw(window)

        surface.blit(surface, (0, 0))
        text = font.render("Score {0}".format(world.score), 1, text_color)
        window.blit(text, (1, 1))
        if world.is_game_over():
            end = font.render("The end of your journey", 1, text_color)
            window.blit(end, (window_width / 2 - 220, window_height / 2))
            restart = font.render("Hit R to reset", 1, text_color)
            window.blit(restart, (window_width / 2 - 120, window_height / 2 + 45))
        pygame.display.update()


if __name__ == '__main__':
    run()
    pygame.quit()

我尝试更改播放器中的绘图功能 class,但仍然不知道如何正确执行。我正在 screen/window 上绘制宇宙飞船的图像,但无法将其移动到播放器矩形。

我不知道你试过什么,但下面是调用 blit 的方法:

myimage = pygame.image.load("bar.png")

...

def draw(self, surface):
    r = self.get_rect()
    surface.blit(myimage, r)

这里的关键点是您给 blit 的坐标与您用来绘制矩形的坐标相同。当我尝试这样做时,即使 r 矩形的尺寸不同,我也得到了图像的 correct/natural 大小。如果结果导致问题,您可以将矩形的尺寸调整为与图像相同。您可能还想调整 r 的坐标,使图像以您希望绘制的位置为中心绘制。

'draw' 系列函数是创建 Surface 对象然后在其上绘制对应于基本形状(如圆形、矩形等,填充或其他形状)的像素的便利函数。

相反,您需要创建一个 Surface,其中的像素已通过图像进行了初始化。为此,您需要“image”系列函数(请参阅 https://www.pygame.org/docs/ref/image.html 了解图像函数)。

除此之外,pygame 中的所有内容都是表面,并且您正在操纵和更新显示器上的表面,因此您的代码不应更改,无论您的表面是否通过 'draw' 初始化或 'image'.