我担心这个问题过于本土化,但我希望你仍能对这种情况提出一些建议。
我将直截了当地说,一个“草”不断地显示在左上角,偶尔的“立方体”瓷砖也在那里闪烁。我找不到我的代码在哪里做这件事,这真的令我困惑。请看下面的代码,并发布您的想法,为什么我的代码会这样做。我已附上一段录像,以作进一步澄清。
编辑:删除不相关的代码。
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)
与视频这里的链接
发布于 2014-05-10 04:35:34
你有两个问题:
Sprite.update()
中绘图,然后调用tile_set.draw(screen)
,因此您要绘制两次每个瓷砖。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))
update
方法(如果将来需要它,不要使用它)。get_rect
方法中设置坐标。https://stackoverflow.com/questions/23576332
复制相似问题