Advertisement
furas

Python - Pygame - simple template with classes

Jan 8th, 2016
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.10 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. # ---------------------------------------------------------------------
  4. # pygame (simple) template with classes (by furas)
  5. # ---------------------------------------------------------------------
  6.  
  7. import pygame
  8. #import random
  9.  
  10. # === CONSTANTS ===
  11.  
  12. BLACK = (  0,   0,   0)
  13. WHITE = (255, 255, 255)
  14.  
  15. RED   = (255,   0,   0)
  16. GREEN = (  0, 255,   0)
  17. BLUE  = (  0,   0, 255)
  18.  
  19. SCREEN_WIDTH  = 800
  20. SCREEN_HEIGHT = 600
  21.  
  22. BLOCK_SIZE = 50
  23.  
  24. # === CLASSES ===
  25.  
  26. class StartState():
  27.  
  28.     def __init__(self, screen):
  29.         self.screen = screen
  30.         self.screen_rect = self.screen.get_rect()
  31.        
  32.         self.font_30 = pygame.font.SysFont(None, 30)
  33.         self.font_50 = pygame.font.SysFont(None, 50)
  34.  
  35.         self.text_start = self.font_50.render("START", True, GREEN)
  36.         self.text_start_rect = self.text_start.get_rect()
  37.         # center on screen
  38.         self.text_start_rect.center = self.screen_rect.center
  39.        
  40.         self.text_press = self.font_30.render("PRESS ANY KEY", True, WHITE)
  41.         self.text_press_rect = self.text_press.get_rect()
  42.         # middle bottom screen
  43.         self.text_press_rect.midbottom = self.screen_rect.midbottom
  44.  
  45.  
  46.     def draw(self):
  47.         self.screen.fill(BLACK)
  48.         self.screen.blit(self.text_start, self.text_start_rect)
  49.         self.screen.blit(self.text_press, self.text_press_rect)
  50.  
  51.     def update(self):
  52.         # TODO: move object, etc. (without drawing)
  53.         pass
  54.  
  55.     def event_handle(self, event):
  56.         # press any key
  57.         if event.type == pygame.KEYDOWN:
  58.             self.running = False
  59.  
  60.     def mainloop(self):
  61.    
  62.         self.clock = pygame.time.Clock()
  63.        
  64.         self.running = True
  65.        
  66.         while self.running:
  67.  
  68.             # --- events ---
  69.            
  70.             for event in pygame.event.get():
  71.  
  72.                 # --- global events ---
  73.                
  74.                 if event.type == pygame.QUIT:
  75.                     self.running = False
  76.                 elif event.type == pygame.KEYDOWN:
  77.                     if event.key == pygame.K_ESCAPE:
  78.                         self.running = False
  79.  
  80.                 # --- local events ---
  81.                
  82.                 self.event_handle(event)
  83.            
  84.             # --- updates ---
  85.  
  86.             self.update()
  87.            
  88.             # --- draws ---
  89.    
  90.             self.draw()
  91.        
  92.             pygame.display.flip()
  93.  
  94.             # --- FPS ---
  95.  
  96.             self.clock.tick(25)
  97.  
  98.         return True
  99.        
  100. class EndState():
  101.  
  102.     def __init__(self, screen):
  103.         self.screen = screen
  104.         self.screen_rect = self.screen.get_rect()
  105.        
  106.         self.font_30 = pygame.font.SysFont(None, 30)
  107.         self.font_50 = pygame.font.SysFont(None, 50)
  108.  
  109.         self.text = self.font_50.render("END", True, RED)
  110.         self.text_rect = self.text.get_rect()
  111.         # center on screen
  112.         self.text_rect.center = self.screen_rect.center
  113.        
  114.         self.text_press = self.font_30.render("PRESS ANY KEY", True, WHITE)
  115.         self.text_press_rect = self.text_press.get_rect()
  116.         # middle bottom screen
  117.         self.text_press_rect.midbottom = self.screen_rect.midbottom
  118.  
  119.  
  120.     def draw(self):
  121.         self.screen.fill(BLACK)
  122.         self.screen.blit(self.text, self.text_rect)
  123.         self.screen.blit(self.text_press, self.text_press_rect)
  124.  
  125.     def update(self):
  126.         # TODO: move object, etc. (without drawing)
  127.         pass
  128.  
  129.     def event_handle(self, event):
  130.         if event.type == pygame.KEYDOWN:
  131.             self.running = False
  132.  
  133.     def mainloop(self):
  134.    
  135.         self.clock = pygame.time.Clock()
  136.        
  137.         self.running = True
  138.        
  139.         while self.running:
  140.  
  141.             # --- events ---
  142.            
  143.             for event in pygame.event.get():
  144.  
  145.                 # --- global events ---
  146.                
  147.                 if event.type == pygame.QUIT:
  148.                     self.running = False
  149.                 elif event.type == pygame.KEYDOWN:
  150.                     if event.key == pygame.K_ESCAPE:
  151.                         self.running = False
  152.  
  153.                 # --- local events ---
  154.                
  155.                 self.event_handle(event)
  156.            
  157.             # --- updates ---
  158.  
  159.             self.update()
  160.            
  161.             # --- draws ---
  162.    
  163.             self.draw()
  164.  
  165.             pygame.display.flip()
  166.  
  167.             # --- FPS ---
  168.  
  169.             self.clock.tick(25)
  170.  
  171.         return True
  172.  
  173. class GameState():
  174.  
  175.     def __init__(self, screen):
  176.         self.screen = screen
  177.         self.screen_rect = self.screen.get_rect()
  178.  
  179.         self.player = pygame.Surface((BLOCK_SIZE, BLOCK_SIZE))
  180.         self.player.fill(GREEN)
  181.         self.player_rect = self.player.get_rect()
  182.         self.player_rect.center = self.screen_rect.center
  183.        
  184.         self.player_move_x = 0
  185.         self.player_move_y = 0
  186.  
  187.         self.font_30 = pygame.font.SysFont(None, 30)
  188.                
  189.         self.text_press = self.font_30.render("PRESS 'ESCAPE' TO EXIT", True, WHITE)
  190.         self.text_press_rect = self.text_press.get_rect()
  191.         # middle bottom screen
  192.         self.text_press_rect.midbottom = self.screen_rect.midbottom
  193.  
  194.         self.text_arrows = self.font_30.render("USE 'ARROWS' TO MOVE OBJECT", True, WHITE)
  195.         self.text_arrows_rect = self.text_arrows.get_rect()
  196.         # middle top screen
  197.         self.text_arrows_rect.midtop = self.screen_rect.midtop
  198.  
  199.     def draw(self):
  200.         self.screen.fill(BLACK)
  201.         self.screen.blit(self.player, self.player_rect)    
  202.         self.screen.blit(self.text_press, self.text_press_rect)
  203.         self.screen.blit(self.text_arrows, self.text_arrows_rect)
  204.    
  205.     def update(self):
  206.         # --- updates ---
  207.  
  208.         self.player_rect.x += self.player_move_x
  209.         self.player_rect.y += self.player_move_y
  210.  
  211.         self.player_rect.clamp_ip(self.screen_rect)
  212.    
  213.  
  214.     def event_handle(self, event):
  215.         # --- player events ---
  216.  
  217.         if event.type == pygame.KEYDOWN:
  218.             if event.key == pygame.K_LEFT:
  219.                 self.player_move_x -= 10
  220.             elif event.key == pygame.K_RIGHT:
  221.                 self.player_move_x += 10
  222.             elif event.key == pygame.K_UP:
  223.                 self.player_move_y -= 10
  224.             elif event.key == pygame.K_DOWN:
  225.                 self.player_move_y += 10
  226.  
  227.         elif event.type == pygame.KEYUP:
  228.             if event.key == pygame.K_LEFT:
  229.                 self.player_move_x += 10
  230.             elif event.key == pygame.K_RIGHT:
  231.                 self.player_move_x -= 10
  232.             elif event.key == pygame.K_UP:
  233.                 self.player_move_y += 10
  234.             elif event.key == pygame.K_DOWN:
  235.                 self.player_move_y -= 10
  236.  
  237.  
  238.     def mainloop(self):
  239.    
  240.         self.clock = pygame.time.Clock()
  241.        
  242.         self.running = True
  243.        
  244.         while self.running:
  245.  
  246.             # --- events ---
  247.            
  248.             for event in pygame.event.get():
  249.  
  250.                 # --- global events ---
  251.                
  252.                 if event.type == pygame.QUIT:
  253.                     self.running = False
  254.                 elif event.type == pygame.KEYDOWN:
  255.                     if event.key == pygame.K_ESCAPE:
  256.                         self.running = False
  257.  
  258.                 # --- local events ---
  259.                
  260.                 self.event_handle(event)
  261.            
  262.             # --- updates ---
  263.  
  264.             self.update()
  265.            
  266.             # --- draws ---
  267.    
  268.             self.draw()
  269.        
  270.             pygame.display.flip()
  271.  
  272.             # --- FPS ---
  273.  
  274.             self.clock.tick(25)
  275.  
  276.         return True
  277.                
  278. # === FUNCTIONS ===
  279.  
  280. # empty
  281.  
  282. # === MAIN ===
  283.  
  284. # --- init (only once for all classes) ---
  285.  
  286. pygame.init()
  287.  
  288. screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
  289.  
  290. # --- states (almost "finite states machine" [FSM])---
  291.  
  292. result = StartState(screen).mainloop()
  293.  
  294. if result:
  295.     result = GameState(screen).mainloop()
  296.  
  297. if result:
  298.     result = EndState(screen).mainloop()
  299.  
  300. # --- the end (only once for all classes) ---
  301.    
  302. pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement