Advertisement
Windspar

Pygame Moving Smooth Between Points

Jun 18th, 2024
628
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.31 KB | Gaming | 0 0
  1. import pygame
  2.  
  3. class Scene:
  4.     def __init__(self, display):
  5.         self.display = display
  6.  
  7.     def on_draw(self, surface): pass
  8.     def on_event(self, event): pass
  9.     def on_update(self, delta): pass
  10.  
  11. class Display:
  12.     def __init__(self, caption, width, height, flags=0, fps=60):
  13.         pygame.display.set_caption
  14.         self.display = pygame.display.set_mode((width, height), flags)
  15.         self.rect = self.display.get_rect()
  16.         self.clock = pygame.time.Clock()
  17.         self.running = True
  18.         self.delta = 0
  19.         self.fps = fps
  20.  
  21.         self.scene = None
  22.  
  23.     def run(self, scene):
  24.         self.scene = scene
  25.  
  26.         while self.running:
  27.             for event in pygame.event.get():
  28.                 if event.type == pygame.QUIT:
  29.                     self.running = False
  30.                 else:
  31.                     self.scene.on_event(event)
  32.  
  33.             self.scene.on_update(self.delta)
  34.             self.scene.on_draw(self.display)
  35.             pygame.display.flip()
  36.             self.delta = self.clock.tick(self.fps) / 1000
  37.  
  38. class Sprite:
  39.     def __init__(self, image, center):
  40.         self.image = image
  41.         self.rect = image.get_rect(center=center)
  42.         self.center = pygame.Vector2(self.rect.center)
  43.  
  44.     def draw(self, surface):
  45.         surface.blit(self.image, self.rect)
  46.  
  47.     def move(self, movement):
  48.         self.center += movement
  49.         self.rect.center = self.center
  50.  
  51.     def set_center(self, center):
  52.         self.center = center
  53.         self.rect.center = center
  54.  
  55. class Moving:
  56.     def __init__(self, sprite, speed):
  57.         self.sprite = sprite
  58.         self.start = sprite.center
  59.         self.target = None
  60.         self.speed = speed
  61.         self.lerp = 0
  62.  
  63.     def set_target(self, mpos):
  64.         if self.target is None:
  65.             self.target = pygame.Vector2(mpos)
  66.  
  67.     def update(self, delta):
  68.         if self.target:
  69.             self.lerp += delta * self.speed / 100
  70.             if self.lerp >= 1:
  71.                 self.lerp = 1
  72.  
  73.             center = self.start.lerp(self.target, self.lerp)
  74.             self.sprite.set_center(center)
  75.  
  76.             if self.lerp == 1:
  77.                 self.target = None
  78.                 self.start = center
  79.                 self.lerp = 0
  80.  
  81. class Example(Scene):
  82.     def __init__(self, display):
  83.         super().__init__(display)
  84.         self.background_color = 'grey5'
  85.         image = self.create_image((50, 50), 'dodgerblue')
  86.         self.sprite = Sprite(image, display.rect.center)
  87.         self.moving = Moving(self.sprite, 50)
  88.  
  89.     def create_image(self, size, color):
  90.         surface = pygame.Surface(size, pygame.SRCALPHA)
  91.         surface.fill((0, 0, 0, 0))
  92.         rect = surface.get_rect()
  93.         points = rect.midright, rect.bottomleft, rect.topleft
  94.         pygame.draw.polygon(surface, color, points)
  95.         return surface
  96.  
  97.     def on_draw(self, surface):
  98.         surface.fill(self.background_color)
  99.         self.sprite.draw(surface)
  100.  
  101.     def on_event(self, event):
  102.         if event.type == pygame.MOUSEBUTTONDOWN:
  103.             self.moving.set_target(event.pos)
  104.  
  105.     def on_update(self, delta):
  106.         self.moving.update(delta)
  107.  
  108. def main():
  109.     pygame.init()
  110.     display = Display("Example Smooth Movement Between Point", 800, 600)
  111.     display.run(Example(display))
  112.     pygame.quit()
  113.  
  114. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement