2013-04-23 86 views
0

我需要创建具有网格列表中的数字1特征的精灵列表。但我需要拆分窗口len(grid),len(grid [0])如何在WallTile类中进行操作。但是我需要在网格中的数字1的位置填充窗口。这将是瓷砖的迷宫。我想使用精灵,因为我需要使用瓷砖墙进行碰撞检测。如何从网格模板列表中制作精灵列表

width, height = 700, 700 #window size 

grid = [[0, 1, 0, 0, 0, 0, 0], 
     [0, 1, 0, 1, 1, 1, 0], 
     [0, 1, 0, 1, 0, 0, 0], 
     [0, 0, 0, 1, 0, 1, 1], 
     [0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 0, 0], 
     [0, 1, 0, 1, 1, 1, 1]] 



class WallTile(pygame.sprite.Sprite): 
    def __init__(self): 
     super(WallTile, self).__init__() 
     self.TILE_W = width/len(grid)  # spliting window by len(grid) and set size of one tile 
     self.TILE_H = height/len(grid[0]) 
     self.tiles_x = width/self.TILE_W # size of all tiles 
     self.tiles_y = height/self.TILE_H 
     self.imageMaster = pygame.image.load("images/wallBig.png") 
     self.image = self.imageMaster 
     self.pozX = 0.0 
     self.pozY = 0.0 
     self.image = pygame.transform.scale(self.imageMaster, (self.TILE_W, self.TILE_H)) 
     self.rect = self.image.get_rect() 
     self.rect.center = (self.pozX, self.pozY) 



     # here I need fill some sprite list with tiles with different coordinates. 
      # I want to put tile on place where is number 1 in grid. But put it to screen. 

     for y in range(self.tiles_y): 
      for x in range(self.tiles_x): 
       for i in range(len(grid[0])): 
        for j in range(len(grid)): 
         if grid[i][j] is 1: 
           # I need make new tile and put it to sprite list 

           self.pozX, self.pozY = (x * self.TILE_W), (y * self.TILE_H) 

           # 
           #--- here I dont know what to do... 
           # 

class MainClass: 
    def Main(self): 

      # here is how Im drawing sprites on screen. 

      screen = pygame.display.set_mode(size) 
      screen.fill((grey)) 


      wallTile = WallTile() 
      spriteGroup_1 = pygame.sprite.Group(wallTile) 

      background = pygame.Surface(obrazovka.get_size()) 
      background.fill((grey)) 
      background.set_colorkey((60,0,0)) 

      running = True 
      while running: 
       for event in pygame.event.get(): 
        if event.type == QUIT or \ 
         event.type == KEYDOWN and (event.key in [K_ESCAPE, K_q]): 
          running = False 


         spriteGroup_1.clear(screen, background) 
         spriteGroup_1.update() 
         updateScreen = spriteGroup_1.draw(screen) 

         pygame.display.update(updateScreen) 
         pygame.display.flip() 




if __name__ == '__main__': 
    mainWin = MainClass() 
    sys.exit((mainWin.Main())) 

真的非常感谢您的建议。

+0

我无法确切地理解问题是什么。你为什么要在WallTile类中维护一个精灵列表,这是一个精灵本身? – Haz 2013-04-23 19:27:57

+0

我不知道如何创建更多的瓷砖像1.因为在网格列表中有更多的数字1.所以我知道如何创建1个精灵瓷砖。我不知道如何创建多少瓦片,网格列表中有多少数字是1。是否有一些可迭代的精灵与一些索引,我可以放更多的瓷砖,并选择哪些获得唯一的坐标。所以问题是如何在这些类中创建更多的tile或多个tile多少个grid有数字1. – Thomas 2013-04-23 20:22:03

+0

首先,您的WallTile类正在扩展Sprite,所以我不明白为什么要保留一个tile列表在WallTile对象内。在WallTile范围外有一个Sprites列表会更有意义,它有一个初始化循环,用于查看网格,并为值为1的网格的每个元素创建Sprites。 – Haz 2013-04-23 20:36:52

回答

0

我会首先重新定义您的WallTile类以仅表示一个图块。 WallTile的构造函数现在接受一个大小和位置参数,它们代表了它在屏幕上的大小和位置。

class WallTile(pygame.sprite.Sprite): 
    def __init__(self, size, location): 
     pygame.sprite.Sprite.__init__(self) 
     self.size = size 
     self.location = location 
     self.image = pygame.image.load("images/wallBig.png") 
     self.image = pygame.transform.scale(self.image, size) 
     self.rect = self.image.get_rect() 

然后,对于WallTile类的代码外,你可以检查为“1'网格,无论何时你发现一个创建一个新的瓷砖。您可以查看网格上该元素的索引,并将这些值乘以每个图块的大小,以确定该图块在屏幕上的位置。然后,您可以获取该磁贴列表并使用它们创建一个Sprite组。

tile_size = (20, 20) 
tiles = list() 
for y in range(len(grid)): 
    for x in range(len(grid[y])): 
     if grid[x][y] == 1:    
      new_tile = WallTile(tile_size, (x * tile_size[0], y * tile_size[1])) 
      tiles.append(new_tile) 

tile_group = pygame.sprite.Group(tiles) 

如果你想拉从组特定的瓷砖,而你还没有到瓦片的参考,你可以遍历所有的组,并找出某个位置

search_location = (40, 80) 
for tile in tile_group: 
    if tile.location = search_location: 
     # we've found that tile, now do something with it 
+0

谢谢你的例子,我会尝试它:)。 – Thomas 2013-04-23 22:49:40