显示渲染切片中的错误 - PyGame

时间:2014-05-10 01:49:18

标签: python pygame tiling

我担心这个问题过于局部化了,但我希望你仍然会对这种情况提出一些建议。

我会直截了当地说,左上角不断显示“草”,偶尔会出现“立方体”瓷砖闪烁。我无法找到我的代码在哪里这样做,这真的令我感到困惑。请查看以下代码,并发表您对我的代码为何会这样做的想法。我附上了一段视频,以便进一步澄清。

编辑:删除了不相关的代码。

    class Grass(pygame.sprite.Sprite):
            def __init__(self, tileX, tileY):
                pygame.sprite.Sprite.__init__(self)
                self.image = tile_dict[0]
                self.rect = self.image.get_rect()
                self.tileX = tileX
                self.tileY = tileY
            def update(self):
                screen.blit(self.image, (self.tileX, self.tileY))

    class Rock(pygame.sprite.Sprite):
            def __init__(self, tileX, tileY):
                pygame.sprite.Sprite.__init__(self)
                self.image = tile_dict[1]
                self.rect = self.image.get_rect()
                self.tileX = tileX
                self.tileY = tileY
            def update(self):
                screen.blit(self.image, (self.tileX, self.tileY))


    class Cube(pygame.sprite.Sprite):
            def __init__(self, tileX, tileY):
                pygame.sprite.Sprite.__init__(self)
                self.image = tile_dict[2]
                self.rect = self.image.get_rect()
                self.tileX = tileX
                self.tileY = tileY
            def update(self):
                screen.blit(self.image, (self.tileX, self.tileY))


    tile_set = pygame.sprite.Group()


    class MapControl(object):
        def __init__(self, cameraX, cameraY):
            self.tileX = cameraX
            self.tileY = cameraY
            self.length = 0
            self.count = 0
            self.map_array = [] 
            self.file = open("C:\Users\Software Development\Desktop\Map00L0.txt")
        def LoadMap(self, map, cameraX, cameraY):
            self.tileX = cameraX    
            self.tileY = cameraY
            for x in map:
                for tile in x:
                    if tile == '0':
                        grass = Grass(self.tileX, self.tileY)
                        tile_set.add(grass)
                        self.tileX = self.tileX+32
                    if tile == '1':
                        rock = Rock(self.tileX, self.tileY)
                        tile_set.add(rock)
                        self.tileX = self.tileX+32

                    if tile == '2':
                        cube = Cube(self.tileX, self.tileY)
                        tile_set.add(cube)
                        self.tileX = self.tileX+32  
                    if tile == '\n':
                        self.tileX = cameraX
                        self.tileY += 32
                self.tileX = cameraX
                self.tileY = cameraY

        def CalcMapBorders(self, map):
            for ba in map:
                for line in self.file:
                    self.length += 1
                    self.count = len(list(line.strip('\n')))




    file = open('C:\Users\Software Development\Desktop\Map00L0.txt', 'r')   
    map00ly0 = list(file.read())    
    map = [map00ly0]

    def Loop(screen, map, cameraX, cameraY):
        cameraX, cameraY = 0,0
        player = Player(cameraX, cameraY)
        mapcontrol = MapControl(cameraX, cameraY)

        while gamestate.state == 'in_progress':
            sprite_list.add(player) 
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()



            screen.fill((0,0,0))

            mapcontrol.LoadMap(map, cameraX, cameraY)

            mapcontrol.CalcMapBorders(map)


            key = pygame.key.get_pressed()

            if key[pygame.K_DOWN] and not(key[pygame.K_LEFT] or key[pygame.K_RIGHT]):
                time.sleep(0.0)
                player.rect.y += 2
                player.index += 1
                player.list_index = 1
                player.mov = True
            if key[pygame.K_UP] and not(key[pygame.K_LEFT] or key[pygame.K_RIGHT]):
                time.sleep(0.0)
                player.rect.y -= 2
                player.index += 1
                player.list_index = 0
                player.mov = True
            if key[pygame.K_RIGHT]:
                time.sleep(0.0)
                player.rect.x += 2
                player.index += 1
                player.list_index = 3
                player.mov = True
            if key[pygame.K_LEFT]:
                time.sleep(0.0)
                player.rect.x -= 2
                player.index += 1
                player.list_index = 2
                player.mov = True       
            if not key[pygame.K_UP] and not key[pygame.K_DOWN] and not key[pygame.K_LEFT] and not key[pygame.K_RIGHT]:
                player.index = 0    



            if player.rect.y > height - 25:
                player.rect.y -= 2
                player.index += 1
                cameraY -= 3
            if player.rect.y < 0:
                player.rect.y += 2
                player.index += 1
                cameraY += 3
            if player.rect.x > width - 15:
                player.rect.x -= 2
                player.index += 1
                cameraX -= 3
            if player.rect.x < 0:
                player.rect.x += 2
                player.index += 1
                cameraX += 3
            if player.rect.y < cameraY:
                cameraY -= 3
            if player.rect.x < cameraX:
                cameraX -= 3
            if player.rect.y > (cameraY + (mapcontrol.length*32) - 15):
                cameraY += 3
            if player.rect.x > (cameraX + (mapcontrol.count*32) - 15):
                cameraX += 3

            tile_set.update()
            tile_set.draw(screen)
            tile_set.empty()
            sprite_list.update()        
            sprite_list.draw(screen)
            pygame.display.update()
            clock.tick(30)
            gamestate.state_eval()
    Loop(screen, map, cameraX, cameraY)

Youtube链接到视频here

1 个答案:

答案 0 :(得分:1)

你有两个问题:

  1. 您正在使用Sprite.update()进行绘制,然后您正在调用tile_set.draw(screen),因此每个图块都会绘制两次。

  2. 您没有为贴图设置rect属性,因此当您调用draw时,每个贴图都会根据其rect属性绘制在0,0位置

  3. 要解决此问题,请执行如下的Sprite子类:

    class Grass(pygame.sprite.Sprite):
        def __init__(self, tileX, tileY):
            pygame.sprite.Sprite.__init__(self)
            self.image = tile_dict[0]
            self.rect = self.image.get_rect(topleft=(tileX,tileY))
    
    1. 取消update方法(如果将来需要它,请不要在其中绘制)。
    2. get_rect方法中设置坐标。