0

我对 Python/Pygame 完全陌生,我正在尝试将图像分割成次表面,然后将它们 blit 以显示在屏幕上(以便稍后我可以修改它以调用某个图块,然后 blit 它) .

E1:我想我终于设法以正确的方式对其进行切片,但是在 blitting 中出现了一点问题。
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()

它给 atm 的错误是:
img_rect = tile_img.get_rect()
AttributeError: 'list' object has no attribute 'get_rect'

4

2 回答 2

1

在此处创建图块集的此函数中:

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函数。

于 2013-04-29T17:19:49.940 回答
0

您没有分配图块集:

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.

更新2:

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

bg_tile_img = tileset[0][0]

或者使图块集成为一个简单的列表,将所有内容直接添加到图块集中,而不是使用线条。

于 2013-04-29T15:33:04.077 回答