Pygame:如何在图像上平铺次表面

时间:2013-04-29 14:00:25

标签: image python-3.x pygame

我是Python / Pygame的新手,我正在尝试将图像切割成子表面,然后将它们按顺序放到屏幕上(以便稍后我可以修改它以调用某个图块然后blit it)。

E1:我想我终于设法以正确的方式对其进行切片但是有一点点麻烦。
E2:更新了代码和错误(在我之前尝试过的大部分代码中都得到了这个代码和错误。)

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
screen.fill((255, 255, 255))


def load_tileset(filename, width, height):
    image = pygame.image.load(filename).convert()
    image_width, image_height = image.get_size()
    tileset = []
    for tile_x in range(0, image_width//width):
        line = []
            tileset.append(line)
        for tile_y in range(0, image_height//height):
            rect = (tile_x*width, tile_y*height, width, height)
            line.append(image.subsurface(rect))
    return tileset

def draw_background(screen, tile_img, field_rect):
    img_rect = tile_img.get_rect()

    for y in range(0,400,32):
        for x in range(0,600,32):
            screen.blit(tile_img, (x,y))


Field_Rect = Rect(50,50, 300,300)
tileset = load_tileset("platform1.bmp", 17, 17)    
bg_tile_img = tileset[0]
draw_background(screen, bg_tile_img, Field_Rect)    

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                pygame.quit()

    pygame.display.flip()

它给出的错误是:
img_rect = tile_img.get_rect()
AttributeError:'list'对象没有属性'get_rect'

2 个答案:

答案 0 :(得分:0)

您没有分配tileset:

load_tileset("platform1.bmp", 17, 17)

应该是:

tileset = load_tileset("platform1.bmp", 17, 17)

<强>更新

set_mode创建窗口,因此它应该在主循环之外(load_tileset):

screen = pygame.display.set_mode((640, 480))
tileset = load_tileset("platform1.bmp", 17, 17)

while True:
    for event in pygame.event.get():
        ...

另外,我看不到对draw_background的任何电话。

<强> UPDATE2:

正如Haz所说,tileset是一个行列表(矩阵),您可以使用坐标来检索特定的图块:

bg_tile_img = tileset[0][0]

或者将tileset设置为普通列表,将所有内容直接添加到tileset而不是使用行。

答案 1 :(得分:0)

在此功能中,您可以在此处创建tileset:

def load_tileset(filename, width, height):
    image = pygame.image.load(filename).convert()
    image_width, image_height = image.get_size()
    tileset = []
    for tile_x in range(0, image_width//width):
        line = []
            tileset.append(line)
        for tile_y in range(0, image_height//height):
            rect = (tile_x*width, tile_y*height, width, height)
            line.append(image.subsurface(rect))
    return tileset

...您会注意到tileset是一个列表,而tileset的每个元素(标记为line)也是一个列表。

所以在这里的代码中:

tileset = load_tileset("platform1.bmp", 17, 17)    
bg_tile_img = tileset[0]
draw_background(screen, bg_tile_img, Field_Rect)

...您正在将一个名为bg_tile_img的列表传递给draw_background函数。

您的draw_background功能应该更像是这样:

def draw_background(screen, tile_img, field_rect):
    for img in tile_img:
        img_rect = img.get_rect()

        for y in range(0,400,32):
            for x in range(0,600,32):
                screen.blit(img, (x,y))

或者,不要将bg_tile_img作为列表传递,而是从中弹出一个元素以传递给draw_background函数。