0

我担心这个问题过于本地化,但我希望你仍然会针对这种情况提供一些建议。

我会直截了当,左上角不断显示“草”,偶尔也会出现“立方体”图块。我找不到我的代码在哪里执行此操作,这真的让我很困惑。请查看以下代码,并发表您对我的代码为什么会这样做的想法。我附上了一段视频以作进一步说明。

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

    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 链接到这里的视频

4

1 回答 1

1

你有两个问题:

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

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

为了解决这个问题,像这样实现 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在方法中设置坐标。
于 2014-05-10T04:35:34.220 回答