2013-04-29 65 views
0

我對Python/Pygame完全陌生,我試圖將圖像切分成子表面,然後將它們按順序粘貼到屏幕上(以便以後可以修改它會調用某個tile然後blit)。 E1:我認爲我終於設法以正確的方式進行了分割,但與blitting有一點關係。
E2:更新了代碼和錯誤(在我之前嘗試過的大部分代碼中都獲得了這個代碼)。Pygame:如何在圖像上平鋪子表面

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的: '列表' 對象沒有屬性 'get_rect'

+1

顯示您嘗試過的代碼,以及您得到的錯誤或錯誤處理方式。 – Magnilex 2013-04-29 14:17:53

+0

我嘗試過20種不同的方式,我沒有所有人的代碼,但是80%的時間出現的錯誤是超出界限的事情。地下矩形位於表面邊界之外。儘管數學表明事實並非如此。 =/ – 2013-04-29 14:37:39

+0

如果你沒有顯示你所做的事情,恐怕你不會得到任何幫助。展示20項工作中的最佳成果,以及它如何失敗。 – Magnilex 2013-04-29 14:42:23

回答

0

在這個函數在這兒,你創建地形設置:

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是一個列表,以及地形設置的每個元素(標記爲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功能。

+0

是的,它確實修復了它,它並不像我想要的那樣完全工作,但它仍然有效,而且對一些變量進行簡單的重命名會使事情變得更加清晰。謝謝一堆! – 2013-04-29 18:11:03

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任何呼叫。

UPDATE2:

正如哈茲說,地形設置是行的列表(矩陣),你可以使用座標檢索特定的瓷磚:

bg_tile_img = tileset[0][0] 

,或使地形設置一個普通的列表,將所有內容直接添加到tileset而不是使用行。

+0

這樣做只是給我一個活躍的空白窗口。它在做一些事情,但它不會給我任何輸出和錯誤。據我所知,它不斷重新創造一個奇怪的原因窗口。 – 2013-04-29 15:57:53

+0

再次更新了代碼。我不明白爲什麼它使用bg_tile_img作爲列表對象而不是實際包含的對象。 =/ – 2013-04-29 16:47:00