#!python # -*- coding: utf-8 -*- u""" Display tilemap BG. cursor key or WASD : scroll Windows10 x64 21H1 + Python 3.9.7 64bit + pygame 2.0.1 """ import json import pygame import sys SCRW, SCRH = 800, 600 pygame.init() screen = pygame.display.set_mode((SCRW, SCRH), pygame.DOUBLEBUF) # load Tiled json file bglayout = "road_layout.json" with open(bglayout, 'r') as f: data = json.load(f) map_w = int(data["width"]) map_h = int(data["height"]) tile_w = int(data["tilewidth"]) tile_h = int(data["tileheight"]) # get tilemap, convert start ID 1 to 0. bgtilemap = list(map(lambda x: x-1, data["layers"][0]["data"])) # load bg chip image imgname = "road_chip.png" img = pygame.image.load(imgname).convert_alpha() # split bg chip image bgchips = [] w, h = tile_w, tile_h xc = img.get_width() // w yc = img.get_height() // h for yi in range(yc): for xi in range(xc): x, y = xi * w, yi * h bgchips.append(img.subsurface(pygame.Rect(x, y, w, h))) xofs, yofs = 0, 0 xofs_max = max(0, map_w - (SCRW // tile_w)) yofs_max = max(0, map_h - (SCRH // tile_h)) running = True clock = pygame.time.Clock() # Main loop while running: # update # check event for ev in pygame.event.get(): if ev.type == pygame.QUIT: running = False if ev.type == pygame.KEYDOWN: if ev.key == pygame.K_ESCAPE or ev.key == pygame.K_q: # Push ESC or Q key running = False # scroll BG pygame.event.pump() pressed = pygame.key.get_pressed() if pressed[pygame.K_LEFT] or pressed[pygame.K_a]: xofs -= 1 if xofs < 0: xofs = 0 if pressed[pygame.K_RIGHT] or pressed[pygame.K_d]: xofs += 1 if xofs > xofs_max: xofs = xofs_max if pressed[pygame.K_UP] or pressed[pygame.K_w]: yofs -= 1 if yofs < 0: yofs = 0 if pressed[pygame.K_DOWN] or pressed[pygame.K_s]: yofs += 1 if yofs > yofs_max: yofs = yofs_max # draw start screen.fill((40, 60, 200)) # clear screen # draw tilemap BG xc = SCRW // tile_w yc = SCRH // tile_h for yi in range(yc): for xi in range(xc): xii = xi + xofs yii = yi + yofs if xii >= map_w or yii >= map_h: continue i = bgtilemap[yii * map_w + xii] x = xi * tile_w y = yi * tile_h screen.blit(bgchips[i], (x, y)) pygame.display.flip() clock.tick_busy_loop(60) cap = "Tilemap BG - %5.2f FPS" % (clock.get_fps()) pygame.display.set_caption(cap) pygame.quit() sys.exit()