Windspar

Example Pygame Grid Structure

Dec 24th, 2025 (edited)
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.27 KB | Gaming | 0 0
  1. import pygame
  2.  
  3. # Simple boiler plate
  4. class Scene:
  5.     def __init__(self, control):
  6.         self.control = control
  7.  
  8.     def on_draw(self, surface):
  9.         pass
  10.  
  11.     def on_event(self, event):
  12.         pass
  13.  
  14.     def on_update(self, delta):
  15.         pass
  16.  
  17. class SceneHandler:
  18.     def __init__(self):
  19.         self.current = None
  20.         self.next_ = None
  21.  
  22.     def push(self, scene):
  23.         self.next_ = scene
  24.  
  25.     def update(self):
  26.         if self.next_:
  27.             self.current = self.next_
  28.             self.next_ = None
  29.  
  30.         return self.current
  31.  
  32. class SceneControl:
  33.     def __init__(self, caption, width, height, flags=0, fps=60):
  34.         pygame.display.set_caption(caption)
  35.         self.display = pygame.display.set_mode((width, height), flags)
  36.         self.rect = self.display.get_rect()
  37.         self.clock = pygame.time.Clock()
  38.         self.running = True
  39.         self.delta = 0
  40.         self.fps = fps
  41.  
  42.         self.scene = SceneHandler()
  43.  
  44.     def loop(self):
  45.         if self.scene.current:
  46.             while self.running:
  47.                 scene = self.scene.update()
  48.                 for event in pygame.event.get():
  49.                     if event.type != pygame.QUIT:
  50.                         scene.on_event(event)
  51.                     else:
  52.                         self.running = False
  53.  
  54.                 scene.on_update(self.delta)
  55.                 scene.on_draw(self.display)
  56.                 pygame.display.flip()
  57.                 self.delta = self.clock.tick(self.fps)/1000
  58.  
  59.     def run(self, scene):
  60.         self.scene.current = scene
  61.         self.loop()
  62.  
  63. class Grid:
  64.     def __init__(self, rect, cut, gap=(0, 0)):
  65.         self.rect = rect
  66.         self.cut = cut
  67.         self.gap = gap
  68.         self.slice = cut[0] + gap[0], cut[1] + gap[1]
  69.         self.blocks = self.get_blocks()
  70.  
  71.     def get_blocks(self):
  72.         blocks = []
  73.         for y in range(self.rect.y, self.rect.h, self.slice[1]):
  74.             xblock = []
  75.             for x in range(self.rect.x, self.rect.w, self.slice[0]):
  76.                 xblock.append(pygame.Rect((x, y), self.cut))
  77.             blocks.append(xblock)
  78.  
  79.         return blocks
  80.  
  81.     def get_cells(self):
  82.         return len(self.blocks[0]), len(self.blocks)
  83.  
  84.     def get_empty_blocks(self):
  85.         w, h = self.get_cells()
  86.         return [[None for _ in range(w)] for _ in range(h)]
  87.  
  88.     def collide(self, mpos):
  89.         x, y = self.get_coords(mpos)
  90.         if self.blocks[y][x].collidepoint(mpos):
  91.             return self.blocks[y][x].copy()
  92.  
  93.     def collision_point(self, mpos):
  94.         x, y = self.get_coords(mpos)
  95.         if self.blocks[y][x].collidepoint(mpos):
  96.             return x, y
  97.  
  98.     def get_coords(self, mpos):
  99.         x = (mpos[0] - self.rect.x) // self.slice[0]
  100.         y = (mpos[1] - self.rect.y) // self.slice[1]
  101.         return x, y
  102.  
  103.     def draw_outline(self, surface):
  104.         for yblock in self.blocks:
  105.             for rect in yblock:
  106.                 pygame.draw.rect(surface, 'lawngreen', rect, 1)
  107.  
  108. class Game(Scene):
  109.     def __init__(self, control):
  110.         super().__init__(control)
  111.         self.grid = Grid(self.control.rect.inflate(-20, -20), (20, 20))
  112.         self.hover = None
  113.         self.blocks = self.grid.get_empty_blocks()
  114.         self.toggle_grid = False
  115.  
  116.     def on_draw(self, surface):
  117.         surface.fill('black')
  118.         if self.toggle_grid:
  119.             self.grid.draw_outline(surface)
  120.            
  121.         for blocks in self.blocks:
  122.             for rect in blocks:
  123.                 if rect:
  124.                     surface.fill('dodgerblue', rect)
  125.  
  126.     def on_event(self, event):
  127.         if event.type == pygame.MOUSEBUTTONDOWN:
  128.             if event.button == 1:
  129.                 point = self.grid.collision_point(event.pos)
  130.                 if point:
  131.                     x, y = point
  132.                     if self.blocks[y][x]:
  133.                         self.blocks[y][x] = None
  134.                     else:
  135.                         self.blocks[y][x] = self.grid.collide(event.pos)
  136.         elif event.type == pygame.KEYDOWN:
  137.             if event.key == pygame.K_SPACE:
  138.                 self.toggle_grid = not self.toggle_grid
  139.  
  140. if __name__ == "__main__":
  141.     pygame.init()
  142.     control = SceneControl("Grid Example", 800, 600)
  143.     control.run(Game(control))
  144.     pygame.quit()
  145.  
Advertisement
Add Comment
Please, Sign In to add comment