Advertisement
KsaneK

Pygame Map Editor(almost working)

Feb 11th, 2015
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.30 KB | None | 0 0
  1. import pygame
  2. from pygame.locals import *
  3. from math import ceil
  4.  
  5. tile_files = [
  6.     "../pictures/tiles1.png"
  7. ]
  8. tile_files = [pygame.image.load(f) for f in tile_files]
  9.  
  10. class Tile(pygame.sprite.Sprite):
  11.     """ Create 32x32 Tile Sprite """
  12.     def __init__(self, i, file_index, tile_x, tile_y):
  13.         pygame.sprite.Sprite.__init__(self)
  14.         self.tile_index = i
  15.         self.image = tile_files[file_index].subsurface((tile_x*32, tile_y*32, 32, 32))
  16.         self.image = self.image.convert_alpha()
  17.         self.rect = self.image.get_rect()
  18.         self.rect.x = (i%8)*37+4
  19.         self.rect.y = (i/8)*37+4
  20. class Scroll_Button(pygame.sprite.Sprite):
  21.     """ Create Tile Area Scrolling Button """
  22.     def __init__(self, image, btn_x, btn_y, scroll_dir):
  23.         pygame.sprite.Sprite.__init__(self)
  24.         self.image = pygame.image.load(image)
  25.         self.rect = self.image.get_rect()
  26.         self.rect.x = btn_x
  27.         self.rect.y = btn_y
  28.         self.scroll_dir = scroll_dir
  29.  
  30.  
  31. class Editor:
  32.     """ Main Map Editor Class """
  33.     tile_area = None
  34.     buttons = None
  35.     selected_tile = None
  36.     def __init__(self):
  37.         """ Init a window and surfaces """
  38.         pygame.init()
  39.         pygame.display.set_caption("Map Editor")
  40.         self.map_preview_font = pygame.font.Font(None, 128)
  41.         self.running = True
  42.         self.clock = pygame.time.Clock()
  43.         self.screen = pygame.display.set_mode((1324,600), DOUBLEBUF)
  44.         self.map_preview = pygame.Surface((1024,600))
  45.         self.button_panel = pygame.Surface((300,30)).convert()
  46.         self.screen.fill((255,255,255))
  47.         self.load_tiles()
  48.         self.loop()
  49.     def load_tiles(self):
  50.         """ Get all tiles and add them to sprite group, create 2 scrolling buttons and mouse object """
  51.         self.tiles = pygame.sprite.Group()
  52.         tiles = []
  53.         num_of_tiles = 0
  54.  
  55.         # ~ # Count tiles and create list # ~ #
  56.         for i, f in enumerate(tile_files):
  57.             _, _, width, height = f.get_rect()
  58.             num_of_tiles += width/32 * height/32
  59.             tiles += [(i, x, y) for y in range(height/32) for x in range(width/32)]
  60.  
  61.         # ~ # Create Tile Area And Add Tiles + Scrolling Offset/Limit # ~ #
  62.         height = 37*ceil(float(num_of_tiles)/8)+10
  63.         self.tile_area = pygame.Surface((300, height))
  64.         self.scroll_offset = 0
  65.         self.scroll_limit = -height+570
  66.         for j, (i, x, y) in enumerate(tiles):
  67.             self.tiles.add(Tile(j, i, x, y))
  68.  
  69.         # ~ # Create Scrolling Buttons # ~ #
  70.         self.buttons = pygame.sprite.Group()
  71.         btn_up = Scroll_Button("../pictures/btn_up.png", 0, 570, 5)
  72.         self.buttons.add(btn_up)
  73.         btn_down = Scroll_Button("../pictures/btn_down.png", 100, 570, -5)
  74.         self.buttons.add(btn_down)
  75.  
  76.         # ~ # Mouse # ~ #
  77.         self.mouse = pygame.sprite.Sprite()
  78.         self.mouse.rect = pygame.Rect((0,0,0,0))
  79.     def get_events(self):
  80.         """ Check for pygame events """
  81.         for event in pygame.event.get():
  82.             # ~ # Quit Editor # ~ #
  83.             if event.type==QUIT or (event.type==KEYDOWN and event.key==K_ESCAPE):
  84.                 self.running = False
  85.             # ~ # Select Tile # ~ #
  86.             if event.type==MOUSEBUTTONDOWN:
  87.                 clicked = pygame.sprite.spritecollide(self.mouse, self.tiles, False)
  88.                 for t in clicked:
  89.                     self.selected_tile = t
  90.                     print t.tile_index
  91.  
  92.         # ~ # Scrolling Tile Area # ~ #
  93.         scroll = pygame.sprite.spritecollide(self.mouse, self.buttons, False)
  94.         for b in scroll:
  95.             if self.scroll_offset >= 0 and b.scroll_dir > 0:
  96.                 continue
  97.             elif self.scroll_offset <= self.scroll_limit and b.scroll_dir < 0:
  98.                 continue
  99.             self.scroll_offset+=b.scroll_dir
  100.             for s in self.tiles:
  101.                 s.rect.y+=b.scroll_dir
  102.     def loop(self):
  103.         """ Main program loop, display everything 60 times per second """
  104.         while self.running:
  105.             # ~ # Update Mouse Sprite # ~ #
  106.             pos = pygame.mouse.get_pos()
  107.             self.mouse.rect.x = pos[0]
  108.             self.mouse.rect.y = pos[1]
  109.  
  110.             # ~ # Events # ~ #
  111.             self.get_events()
  112.  
  113.             # ~ # Show map preview # ~ #
  114.             self.screen.fill((200,200,200))
  115.             self.screen.blit(self.map_preview, (300, 0))
  116.             txt2 = self.map_preview_font.render("Map Preview", True, (255,255,255))
  117.             self.map_preview.blit(txt2, (300,236))
  118.  
  119.             # ~ # Show tile menu # ~ #
  120.             self.tile_area.fill((0,0,0))
  121.             self.tiles.draw(self.tile_area)
  122.             self.screen.blit(self.tile_area, (0, 0))
  123.             self.button_panel.fill((200,200,200))
  124.             self.screen.blit(self.button_panel, (0, 570))
  125.             self.buttons.draw(self.screen)
  126.             pygame.draw.line(self.screen, (255,0,0), (300,0), (300, 600), 1)
  127.  
  128.             self.clock.tick(60)
  129.             pygame.display.update()
  130. if __name__=="__main__":
  131.     editor = Editor()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement