2016-03-27 12 views
1

Ich weiß, dass Fragen zu Themen wie diesem bereits gepostet wurden, aber ich habe einen Fehler, den ich in keiner anderen Frage gesehen habe.TileMap Fehler pygame

Ich versuche, einen gekachelten Hintergrund aus einer 2D-Array zu machen, aber wenn ich es laufen lasse, bekomme ich diesen Fehler:

current_tile = Texturen [tilemap [x, y]]
Typeerror: Listenindex ganze Zahlen müssen, Tupel nicht

Dies ist mein Code:

import pygame, sys 
from pygame.locals import * 
pygame.init() 

tilesize = 32 
tileswidth = 11 
tilesheight = 12 

screenwidth = tilesize*tileswidth 
screenheight = tilesize*tilesheight 
screen = pygame.display.set_mode((screenwidth,screenheight)) 

tilemap = [ 
    [9,3,2,2,2,4,2,2,2,3,9], 
    [8,11,10,10,10,10,10,10,10,11,5], 
    [8,1,6,9,9,9,9,9,8,1,5], 
    [8,1,5,9,9,9,9,9,7,1,5], 
    [8,1,6,9,9,9,9,9,7,1,5], 
    [8,1,5,9,9,9,9,9,8,1,5], 
    [8,1,12,4,2,3,2,4,13,1,5], 
    [7,11,10,10,10,11,10,10,10,11,6], 
    [9,9,9,9,7,1,6,9,9,9,9], 
    [9,9,9,9,7,1,6,9,9,9,9], 
    [9,9,9,9,7,1,6,9,9,9,9] 
    ] 

textures = { 
    1 : pygame.image.load("data/tiles/1.jpg").convert_alpha(), 
    2 : pygame.image.load("data/tiles/2.jpg").convert_alpha(), 
    3 : pygame.image.load("data/tiles/3.jpg").convert_alpha(), 
    4 : pygame.image.load("data/tiles/4.jpg").convert_alpha(), 
    5 : pygame.image.load("data/tiles/5.jpg").convert_alpha(), 
    6 : pygame.image.load("data/tiles/6.jpg").convert_alpha(), 
    7 : pygame.image.load("data/tiles/7.jpg").convert_alpha(), 
    8 : pygame.image.load("data/tiles/8.jpg").convert_alpha(), 
    9 : pygame.image.load("data/tiles/9.jpg").convert_alpha(), 
    10 : pygame.image.load("data/tiles/10.jpg").convert_alpha(), 
    11 : pygame.image.load("data/tiles/11.jpg").convert_alpha(), 
    12 : pygame.image.load("data/tiles/12.jpg").convert_alpha(), 
    13 : pygame.image.load("data/tiles/13.jpg").convert_alpha() 
    } 

while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
    for x in range(tilesheight): 
     for y in range(tileswidth): 
      current_tile = textures[tilemap[x,y]] 
      screen.blit(current_tile, (x*tilesize, y*tilesize)) 


    screen.fill(0,0,0) 
    pygame.display.update() 

Jede Hilfe wäre sehr geschätzt.

+0

Sie sollten auch beachten, dass 'screenheight' gleich 11 sein sollte oder der Code einen Indexfehler treffen wird, weil es nur 11 Elemente in' tilemap' gibt und 'screen.fill (0,0,0)' sollte in 'screen.fill ((0,0,0))' geändert werden, um auch einen Wertfehler zu vermeiden. – Flutterguy135

Antwort

0

Sie keine Liste mit einem Tupel zugreifen kann, das ist das, was tilemap[x,y] tut, wollen Sie:

tilemap[x][y] 

, die das Element mit dem Index x von sublist bei Index y nimmt:

In [7]: tilemap = [ 
    ...:  [9,3,2,2,2,4,2,2,2,3,9], 
    ...:  [8,11,10,10,10,10,10,10,10,11,5], 
    ...:  [8,1,6,9,9,9,9,9,8,1,5], 
    ...:  [8,1,5,9,9,9,9,9,7,1,5], 
    ...:  [8,1,6,9,9,9,9,9,7,1,5], 
    ...:  [8,1,5,9,9,9,9,9,8,1,5], 
    ...:  [8,1,12,4,2,3,2,4,13,1,5], 
    ...:  [7,11,10,10,10,11,10,10,10,11,6], 
    ...:  [9,9,9,9,7,1,6,9,9,9,9], 
    ...:  [9,9,9,9,7,1,6,9,9,9,9], 
    ...:  [9,9,9,9,7,1,6,9,9,9,9] 
    ...:  ] 

In [8]: tilemap[0][0] 
Out[8]: 9 

In [9]: tilemap[1][0] 
Out[9]: 8 

Sie können auch einfach über die Tilemap-Liste iterieren:

for ind, sub in enumerate(tilemap): 
    for i, y in enumerate(sub): 
     current_tile = textures[y] 
     screen.blit(current_tile, (ind * tilesize, i * tilesize)) 
+0

Würde gerne wissen, was falsch mit der richtigen Antwort ist –

+0

Ich gab Ihnen nicht die Abstimmung nach unten, aber Sie referenziert nie die Variable "l", wenn Sie vorgeschlagen, durch "Tileset" zu iterieren. 'l 'muss vor den Schleifen deklariert werden, am Ende jeder Iteration von' für y in sub:' um eins erhöht werden und nach jeder Iteration von 'für ind, sub in enumerate (tilemap) wieder auf 0 gesetzt werden: ' . – Flutterguy135

+0

@ Flutterguy135, das ist nicht der Grund, warum meine Antwort abgelehnt wurde, es war ein Troll. Die folgende Antwort gibt im Grunde wieder, was ich bereits ausführlicher erklärt habe und hat eine Verbesserung, so dass es wirklich alles erklärt –

1

TypeError: list indices must be integers, not tuple

Um diesen Fehler zu beheben, müssen Sie Ganzzahlen (Zahlen) und nicht Tupel (1,2) als Listenindizes verwenden. Von dem, was ich sehe, Sie versuchen, 2-dimensionale Liste [1,2] zu tun, die falsch ist, weil 2-dimensionale Arrays/Listen Listen von Listen sind. Deshalb müssen Sie tilemap [x] [y] verwenden. Tilemap [x] gibt die Unterliste von der Kachel zurück und die Kachel [x] [y] ist vonUnterliste bei x, Rückgabeelement y.