4.2    拆分图集

拆分图集可以使用pygame.Surface类的subsurface()方法,可以通过传入一个 Rect 对象来指定要拆分的位置和尺寸。下面用代码拆分每个瓦片图,将其放大两倍,并在窗口上显示。代码如下所示:

04\01\showTiles.py

import pygame

 

pygame.init()

screen = pygame.display.set_mode((600, 400))

pygame.display.set_caption("显示瓦片图")

 

# 填充白色背景

screen.fill((255, 255, 255))

 

# 加载图集

tileMap = pygame.image.load("tile_set.png").convert_alpha()

 

# 设置瓦片大小

tileWidth = 16

tileHeight = 16

 

# 获取的宽度和高度

mapWidth, mapHeight = tileMap.get_size()

 

# 计算每行每列的瓦片数量

numCols = mapWidth // tileWidth

numRows = mapHeight // tileHeight

 

# 拆分并显示所有瓦片

for row in range(numRows):

    for col in range(numCols):

        # 拆分瓦片

        tileSurface = tileMap.subsurface(col * tileWidth, row * tileHeight, tileWidth, tileHeight)

        # 放大两倍

        scaledTileSurface = pygame.transform.scale(tileSurface,

                                                   (tileWidth * 2, tileHeight * 2))

        screen.blit(scaledTileSurface, (col * (tileWidth + 5) * 2, row * (tileHeight + 2) * 2))  # 间距5

 

# 更新窗口显示

pygame.display.flip()

 

# 游戏循环

running = True

while running:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            running = False

 

# 退出 Pygame

pygame.quit()

 

首先,用pygame.image.load("tile_set.png")载入png图片,然后立即使用convert_alpha()方法转换透明度信息。对于 PNG 图片,建议在载入后立即进行转换,以提高渲染性能。接下来,使用 subsurface()方法根据每个瓦片图的位置和尺寸拆分出瓦片,得到一个 Surface 对象。这个 Surface 对象可以进行进一步的处理转换,例如使用 pygame.transform.scale 方法将图片放大两倍,第二个参数是一个元祖格式(width, height),表示新尺寸。最后,使用 blit 方法绘制这个 Surface 对象,第二个参数指定绘制的位置(左上角坐标)。

运行程序,画面如4‑4所示。

44拆分瓦片图