我是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'
答案 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
函数。