如何在Pygame中绘制图像和精灵?

19 投票
4 回答
47726 浏览
提问于 2025-04-17 10:18

我该如何使用Pygame绘制图像呢?我知道怎么加载它们。

我已经创建了一个空白的窗口。

当我使用 screen.blit(blank, (10,10)) 时,图像没有显示出来,屏幕还是空白的。

4 个回答

5

使用:

import pygame, sys, os
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((100, 100))

player = pygame.image.load(os.path.join("player.png"))
player.convert()

while True:
    screen.blit(player, (10, 10))
    pygame.display.flip()

pygame.quit()

它会加载一个名为 player.png 的文件。

运行这个代码,它会完美地工作。

8

图像在Pygame中是通过“pygame.Surface”对象来表示的。你可以使用pygame.image.load从图像创建一个Surface

my_image_surface = pygame.load.image('my_image.jpg')

不过,Pygame的文档提到:

返回的Surface会保持与原文件相同的颜色格式、颜色键和透明度。通常你会想调用convert(),这样可以创建一个在屏幕上绘制时更快的副本。
对于像.png这样的透明度图像,加载后使用convert_alpha()方法,这样图像就会有每个像素的透明度。

为了获得最佳性能,使用合适的转换方法:

image_surface = pygame.load.image('my_image.jpg').convert()
alpha_image_surface = pygame.load.image('my_icon.png').convert_alpha()

你可以使用blit方法将一个Surface绘制到另一个Surface上或与之混合。blit的第一个参数是要绘制的Surface,第二个参数是一个元组(x, y),表示左上角的位置,或者是一个矩形。使用矩形时,只考虑矩形的左上角。需要提到的是,窗口或显示器本身也是一个Surface。因此,在窗口中绘制一个Surface就等于在一个Surface上绘制另一个Surface

window_surface.blit(image_surface, (x, y))
window_surface.blit(image_surface,
    image_surface.get_rect(center = window_surface.get_rect().center))

最简单的例子:

import pygame

pygame.init()
window = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()

pygameSurface = pygame.image.load('apple.png').convert_alpha()

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.fill((127, 127, 127))
    window.blit(pygameSurface, pygameSurface.get_rect(center = window.get_rect().center))
    pygame.display.flip()

pygame.quit()
exit()

pygame.image.load能够加载大多数图像。根据文档,支持的格式有:JPG、PNG、GIF(非动画)、BMP、PCX、TGA(未压缩)、TIF、LBM(和PBM)、PBM(以及PGM、PPM)、XPM。

如果你想在Pygame中使用其他库加载的图像,可以查看:

关于加载可缩放矢量图形(SVG)文件的信息,请查看:

加载动画GIF文件的相关内容可以参考:

或者查看如何加载NumPy帧:

24

这是一个典型的布局:

myimage = pygame.image.load("myimage.bmp")
imagerect = myimage.get_rect()

while 1:
    your_code_here

    screen.fill(black)
    screen.blit(myimage, imagerect)
    pygame.display.flip()

撰写回答