2

I'm aware there is a similar question but the answers were not specific enough to be useful in my case.

I am trying to create a program that can display a tiled map created in Tiled and uploaded into Pygame using pytmx. The only issue I'm having is blitting the images onto the screen in Pygame.

This is the error I keep receiving: Traceback (most recent call last): File "C:\Users\b\Desktop\Frozen Map Textures\test.py", line 32, in screen.blit(images[i],(x*32,y*32)) TypeError: argument 1 must be pygame.Surface, not None

If anybody knows how to fix the issue is, I would be very grateful! Thanks for all your help!

The code is below:

import pygame
from pytmx import load_pygame
import random


white = (255,255,255)


#create window
screenSize = (800,600)
screen = pygame.display.set_mode(screenSize)
pygame.display.set_caption("GameName")
screen.fill(white)


gameMap = load_pygame("Frozen.tmx")


#creates list of single tiles in first layer
images = []
for y in range(50):
    for x in range(50):
        image = gameMap.get_tile_image(x,y,0)
        images.append(image)


#displays tiles in locations
i = 0
for y in range(50):
    for x in range(50):
        screen.blit(images[i],(x*32,y*32))
        i += 1


#main loop
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    pygame.display.flip()

pygame.quit()

1 Answers1

1

I am not very familiar with pytmx, but I think the problem is that variable i runs from 0 to 2600 in the first for-loop (you have 2600 items / images / tiles in the images list). But when you create the list of tile locations (imageLocs), i only runs from 0 to 49, so you have a list 50 different locations.

This means you don´t have "enough" locations for each tile.

In addition to that you don´t need to increment any variables in a for i in rang(value)-loop in python, because i runs throw (i.e. gets assigned to) all values the range() function returns.

You could update your code to avoid this problem:

#Original code    

#create a list of 2600 single tiles in first layer
images = []

for y in range(50):
    for x in range(50):
        image = gameMap.get_tile_image(x,y,0)
        images.append(image)

#blit all tiles onto the screen
i = 0 #runs from 0 to 2600

for y in range(50):
    for x in range(50):
        screen.blit(images[i],(x * 32, y * 32))
        i += 1

#Orginal code

I hope this helps :)

elegent
  • 3,857
  • 3
  • 23
  • 36
  • I updated my code and added the error message I was receiving also. Do you know what the issue is? I just can't find why the list index is providing type None. – Christian Ermann Mar 17 '15 at 02:14
  • Hey! Just ignore my last comment. It turned out there was a single blank space in my map file.... Thanks for all your time! Your suggestions really made my code look nice! – Christian Ermann Mar 17 '15 at 02:33
  • i think i is 0 to 2500 (i.e. 50 * 50) – umbe1987 Jul 12 '16 at 15:30