#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2021/10/13 20:24:38 +0900> """ Draw block test. Windows10 x64 21H1 + Python 3.9.7 64bit """ import json import pygame import sys SCRW, SCRH = 512, 512 map_w, map_h = 64, 64 tile_w, tile_h = 8, 8 block_w, block_h = 8, 8 imgname = "road_chip.png" # block_json = "block_road_middle.json" block_json = "block_road_large.json" def split_image(img, tilew, tileh): """Split image.""" imgs = [] w, h = tilew, tileh 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 imgs.append(img.subsurface(pygame.Rect(x, y, w, h))) return imgs def put_block(bgmap, blocks, bx, by, id): i = 0 d = blocks[id] for y in range(block_h): for x in range(block_w): bgmap[by + y][bx + x] = d[i] i += 1 def create_bg(bgmap, blocks): mw = len(bgmap[0]) id = 0 x, y = 0, 0 while id < len(blocks): put_block(bgmap, blocks, x, y, id) id += 1 x += block_w if x > (mw - block_w): x = 0 y += block_h def main(): pygame.init() screen = pygame.display.set_mode((SCRW, SCRH), pygame.DOUBLEBUF) bgmap = [[0 for i in range(map_w)] for j in range(map_h)] # load bg block json with open(block_json, 'r') as f: block_middle = json.load(f) # load bg chip image img = pygame.image.load(imgname).convert_alpha() # split bg chip image imgs = split_image(img, tile_w, tile_h) xofs, yofs = 0, 0 xofs_max = max(0, map_w - (SCRW // tile_w)) yofs_max = max(0, map_h - (SCRH // tile_h)) create_bg(bgmap, block_middle) 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 if ev.key == pygame.K_SPACE: pass # 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): x = xi + xofs y = yi + yofs if x >= map_w or y >= map_h: continue screen.blit(imgs[bgmap[y][x]], (xi * tile_w, yi * tile_h)) 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() if __name__ == "__main__": main()