Windspar

Pygame Smooth Movement Example

Jul 17th, 2024
371
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. class KeyState:
  4.     def __init__(self):
  5.         self.update()
  6.  
  7.     def __call__(self, *keys):
  8.         count = len(keys)
  9.         if count == 1:
  10.             return self.pressed[keys[0]]
  11.         elif count > 1:
  12.             return any([self.pressed[k] for k in keys])
  13.  
  14.     def update(self):
  15.         self.pressed = pygame.key.get_pressed()
  16.  
  17. class Display:
  18.     def __init__(self, caption, width, height, flags=0, fps=60):
  19.         pygame.display.set_caption(caption)
  20.         self.surface = pygame.display.set_mode((width, height), flags)
  21.         self.rect = self.surface.get_rect()
  22.         self.clock = pygame.Clock()
  23.         self.running = True
  24.         self.delta = 0
  25.         self.fps = fps
  26.  
  27.     def flip(self):
  28.         if self.running:
  29.             pygame.display.flip()
  30.             # For Smooth Movement
  31.             self.delta = self.clock.tick(self.fps) / 1000
  32.  
  33. class Square(pygame.sprite.Sprite):
  34.     def __init__(self, image, center, speed):
  35.         super().__init__()
  36.         self.image = image
  37.         self.rect = image.get_rect(center=center)
  38.         self.center = pygame.Vector2(center)
  39.         self.speed = speed
  40.  
  41.     def move(self, movement, delta):
  42.         self.center += movement * delta * self.speed
  43.         self.rect.center = self.center
  44.  
  45. class ImageHandler:
  46.     def __init__(self):
  47.         self.square = pygame.Surface((50, 50))
  48.         self.square.fill('dodgerblue')
  49.  
  50. class Target:
  51.     def __init__(self, sprite):
  52.         self.vector = pygame.Vector2()
  53.         # Center is a weak reference.
  54.         self.center = sprite.center
  55.         self.sprite = sprite
  56.         self.target = None
  57.  
  58.     def is_done(self):
  59.         return self.vector.length() == 0
  60.  
  61.     def set(self, position):
  62.         self.target = position
  63.         self.vector = (position - self.center).normalize()
  64.  
  65.     def update(self, delta):
  66.         if self.target:
  67.             self.sprite.move(self.vector, delta)
  68.             if self.vector.x < 0:
  69.                 if self.sprite.center.x <= self.target[0]:
  70.                     self.vector.x = 0
  71.                     self.center.x = self.target[0]
  72.             elif self.vector.x > 0:
  73.                 if self.center.x >= self.target[0]:
  74.                     self.vector.x = 0
  75.                     self.center.x = self.target[0]
  76.  
  77.             if self.vector.y < 0:
  78.                 if self.sprite.center.y <= self.target[1]:
  79.                     self.vector.y = 0
  80.                     self.center.y = self.target[1]
  81.             elif self.vector.y > 0:
  82.                 if self.center.y >= self.target[1]:
  83.                     self.vector.y = 0
  84.                     self.center.y = self.target[1]
  85.  
  86.             if self.is_done():
  87.                 self.target = None
  88.  
  89. class Game:
  90.     def __init__(self):
  91.         self.display = Display("Example", 600, 600)
  92.         self.image = ImageHandler()
  93.         self.key = KeyState()
  94.         self.square = Square(self.image.square, self.display.rect.center, 80)
  95.         self.sprites = pygame.sprite.Group(self.square)
  96.         self.target = Target(self.square)
  97.  
  98.     def movement(self):
  99.         self.key.update()
  100.         direction = pygame.Vector2()
  101.         if self.key(pygame.K_UP, pygame.K_w):
  102.             direction.y -= 1
  103.  
  104.         if self.key(pygame.K_DOWN, pygame.K_s):
  105.             direction.y += 1
  106.  
  107.         if self.key(pygame.K_LEFT, pygame.K_a):
  108.             direction.x -= 1
  109.  
  110.         if self.key(pygame.K_RIGHT, pygame.K_d):
  111.             direction.x += 1
  112.  
  113.         if direction.length() > 0:
  114.             # Real World Movement
  115.             direction.normalize_ip()
  116.             self.square.move(direction, self.display.delta)
  117.  
  118.     def loop(self):
  119.         while self.display.running:
  120.             for event in pygame.event.get():
  121.                 if event.type == pygame.MOUSEBUTTONDOWN:
  122.                     if event.button == 1:
  123.                         self.target.set(event.pos)
  124.                 elif event.type == pygame.QUIT:
  125.                     self.display.running = False
  126.  
  127.             self.target.update(self.display.delta)
  128.             if self.target.is_done():
  129.                 self.movement()
  130.  
  131.             self.display.surface.fill('black')
  132.             self.sprites.draw(self.display.surface)
  133.             self.display.flip()
  134.  
  135. pygame.init()
  136. game = Game()
  137. game.loop()
  138. pygame.quit()
  139.  
Advertisement
Add Comment
Please, Sign In to add comment