2016-05-19 6 views
2

Ich mache ein Spiel für mein Abschlussprojekt in der Klasse. Ich bin ziemlich neu bei Pygame und dieser ganzen Spielentwicklungssache. Ich habe diese video als meinen Leitfaden verwendet.pygame binascii.Error lösen: Falsche Auffüllung?

I verwendet Fliesen- eine Fliese Karte für mein Spiel zu machen, aber wenn ich es mit pygame zu laufen versucht, ich habe dies:

Traceback (most recent call last): 
File "C:\Users\Rose\Desktop\mp2 shits\shit.py", line 114, in <module> 
Game().main(screen) 
File "C:\Users\Rose\Desktop\mp2 shits\shit.py", line 58, in main 
self.tilemap = tmx.load('tileMap.tmx', screen.get_size()) 
File "C:\Users\Rose\Desktop\mp2 shits\tmx.py", line 835, in load 
return TileMap.load(filename, viewport) 
File "C:\Users\Rose\Desktop\mp2 shits\tmx.py", line 714, in load 
layer = Layer.fromxml(tag, tilemap) 
File "C:\Users\Rose\Desktop\mp2 shits\tmx.py", line 255, in fromxml 
data = data.decode('base64').decode('zlib') 
File "C:\Python27\lib\encodings\base64_codec.py", line 42, in base64_decode 
output = base64.decodestring(input) 
File "C:\Python27\lib\base64.py", line 325, in decodestring 
return binascii.a2b_base64(s) 
binascii.Error: Incorrect padding 
[Finished in 5.0s] 

Hier ist mein Code:

import pygame 
import tmx 

class Player(pygame.sprite.Sprite): 
def __init__(self, location, *groups): 
    super(Player, self).__init__(*groups) 
    self.image = pygame.image.load('red.gif').convert() 
    self.rect = pygame.rect.Rect(location, self.image.get_size()) 
    self.resting = False 
    self.dy = 0 

def update(self, dt, game): 
    last = self.rect.copy() 

    key = pygame.key.get_pressed() 
    if key[pygame.K_LEFT]: 
     self.rect.x -= 150 * dt 
    if key[pygame.K_RIGHT]: 
     self.rect.x += 150 * dt 

    if self.resting and key[pygame.K_SPACE]: 
     self.dy = -500 
    self.dy = min(400, self.dy + 40) 

    self.rect.y += self.dy * dt 

    new = self.rect 
    self.resting = False 
    for cell in game.tilemap.layers['triggers'].collide(new, 'blockers'): 
     if last.right <= cell.left and new.right > cell.left: 
      new.right = cell.left 
     if last.left >= cell.right and new.left < cell.right: 
      new.left = cell.right 
     if last.bottom <= cell.top and new.bottom > cell.top: 
      self.resting = True 
      new.bottom = cell.top 
      self.dy = 0 
     if last.top >= cell.bottom and new.top < cell.bottom: 
      new.top = cell.bottom 
      self.dy = 0 

    game.tilemap.set_focus(new.x, new.y) 

class Game(object): 
def main(self, screen): 
    clock = pygame.time.Clock() 

    background = pygame.image.load('bg.png') 

    self.tilemap = tmx.load('tileMap.tmx', screen.get_size()) 

    self.sprites = tmx.SpriteLayer() 
    start_cell = self.tilemap.layers['triggers'].find('player')[0] 
    self.player = Player((start_cell.px, start_cell.py), self.sprites) 
    self.tilemap.layers.append(self.sprites) 

    fps = 30 
    running = True 
    while running: 
     dt = clock.tick(fps) 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       running = False 
      if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: 
       running = False 

     self.tilemap.update(dt/1000., self) 
     pygame.display.set_caption("Little Red") 
     screen.blit(background, (0,0)) 
     self.tilemap.draw(screen) 
     pygame.display.flip() 

if __name__ == '__main__': 
    pygame.init() 
    width = 1024 
    height = 480 
    screen = pygame.display.set_mode((width, height)) 
    Game().main(screen) 

Danke an diejenigen vorrücken, die freundlich genug wären, um zu helfen!

EDIT: Dies ist, was meine Karte aussieht ... tmx file

+0

Können Sie Ihre 'tmx.py' posten oder beschreiben? (Die aktuelle Version des Pakets tmx bietet nicht 'tmx.load()'.) – nwk

+0

ja, es ist jetzt im unteren Teil der Frage verknüpft. Danke. – Rose

+0

Nein, ich meine ** tmx.py **. Ihr Stack-Trace zeigt an, dass Sie ihn im selben Verzeichnis wie Ihr Spiel haben. – nwk

Antwort

2

Es sieht aus wie tmx.py bedingungslos base64-decode versucht und zlib-dekodieren die Daten, ohne zu prüfen, was das Datenformat tatsächlich in ist neueren Datums. Bei den Versionen von Tiled werden standardmäßig CSV-formatierte Daten verwendet. Stellen Sie daher sicher, dass das Datenformat der Kachelebene in den Karteneigenschaften in Tiled in base64 + zlib geändert wird.

Wenn Sie eine neue Karte erstellen, müssen Sie diese nur einmal einrichten, da sich Tiled an Ihre Präferenz erinnert.

+1

habe es, vielen Dank! – Rose