Advertisement
Windspar

Pygame Simple Boiler Plate With Object Move Example

Feb 18th, 2021
1,455
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.23 KB | None | 0 0
  1. import pygame
  2.  
  3. # Simple state
  4. class State:
  5.     def __init__(self, engine):
  6.         self.engine = engine
  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, ticks):
  15.         pass
  16.  
  17. # Simple display and state manager
  18. class DisplayEngine:
  19.     def __init__(self, caption, width, height, flags=0):
  20.         pygame.display.set_caption(caption)
  21.         self.surface = pygame.display.set_mode((width, height), flags)
  22.         self.rect = self.surface.get_rect()
  23.         self.clock = pygame.time.Clock()
  24.         self.running = False
  25.         self.delta = 0
  26.         self.fps = 60
  27.  
  28.         self.state = State(self)
  29.         self.on_quit = self.quit
  30.  
  31.     @property
  32.     def width(self):
  33.         return self.rect.width
  34.  
  35.     @property
  36.     def height(self):
  37.         return self.rect.height
  38.  
  39.     @property
  40.     def size(self):
  41.         return self.rect.size
  42.  
  43.     def main_loop(self):
  44.         self.running = True
  45.         while self.running:
  46.             for event in pygame.event.get():
  47.                 if event.type == pygame.QUIT:
  48.                     self.on_quit()
  49.                 else:
  50.                     self.state.on_event(event)
  51.  
  52.             ticks = pygame.time.get_ticks()
  53.             self.state.on_draw(self.surface)
  54.             self.state.on_update(self.delta, ticks)
  55.             pygame.display.flip()
  56.             self.delta = self.clock.tick(self.fps)
  57.  
  58.     def quit(self):
  59.         self.running = False
  60.  
  61. class Player:
  62.     def __init__(self, image, position, speed):
  63.         self.image = image
  64.         self.rect = image.get_rect(center=position)
  65.         self.center = pygame.Vector2(self.rect.center)
  66.         self.speed = speed
  67.         self.vector = pygame.Vector2()
  68.  
  69.     def draw(self, surface):
  70.         surface.blit(self.image, self.rect)
  71.  
  72.     def update(self, delta):
  73.         self.center += self.vector * delta * self.speed
  74.         self.rect.center = self.center
  75.  
  76. class ExampleState(State):
  77.     def __init__(self, engine):
  78.         State.__init__(self, engine)
  79.         self.moving = None
  80.         player_image = self.create_player_image()
  81.         self.player = Player(player_image, self.engine.rect.center, 0.1)
  82.  
  83.     def create_player_image(self):
  84.         surface = pygame.Surface((32, 32))
  85.         surface.fill(pygame.Color("dodgerblue"))
  86.         return surface
  87.  
  88.     def on_draw(self, surface):
  89.         surface.fill(pygame.Color("black"))
  90.         self.player.draw(surface)
  91.  
  92.     def on_event(self, event):
  93.         if event.type == pygame.MOUSEBUTTONDOWN:
  94.             # Left mouse button
  95.             if event.button == 1:
  96.                 self.moving = pygame.Vector2(event.pos)
  97.                 self.player.vector = (self.moving - self.player.center).normalize()
  98.  
  99.     def on_update(self, delta, ticks):
  100.         if self.moving:
  101.             self.player.update(delta)
  102.  
  103.             if self.player.center.x - 1 < self.moving.x < self.player.center.x + 1:
  104.                 if self.player.center.y - 1 < self.moving.y < self.player.center.y + 1:
  105.                     self.moving = None
  106. def main():
  107.     pygame.init()
  108.     engine = DisplayEngine("Example", 800, 600)
  109.     state = ExampleState(engine)
  110.     engine.state = state
  111.     engine.main_loop()
  112.  
  113. main()
  114.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement