Advertisement
Windspar

Pygame Moving Sprite By Direction

Nov 3rd, 2019
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.91 KB | None | 0 0
  1. import os
  2. import pygame
  3. from pygame.sprite import Sprite
  4. from math import radians, sin, cos
  5.  
  6. class Scene:
  7.     def on_draw(self, surface): pass
  8.     def on_event(self, event): pass
  9.     def on_update(self, delta): pass
  10.  
  11. class Manager:
  12.     def __init__(self, caption, width, height, center=True):
  13.         if center:
  14.             os.environ['SDL_VIDEO_CENTERED'] = '1'
  15.  
  16.         # Basic pygame setup
  17.         pygame.display.set_caption(caption)
  18.         self.surface = pygame.display.set_mode((width, height))
  19.         self.rect = self.surface.get_rect()
  20.         self.clock = pygame.time.Clock()
  21.         self.running = False
  22.         self.delta = 0
  23.         self.fps = 60
  24.  
  25.         # Scene Interface
  26.         self.scene = Scene()
  27.  
  28.     def mainloop(self):
  29.         self.running = True
  30.         while self.running:
  31.             for event in pygame.event.get():
  32.                 self.scene.on_event(event)
  33.  
  34.             self.scene.on_update(self.delta)
  35.             self.scene.on_draw(self.surface)
  36.             pygame.display.flip()
  37.             self.delta = self.clock.tick(self.fps)
  38.  
  39. class BaseSprite(Sprite):
  40.     def __init__(self, image, position, anchor="topleft"):
  41.         Sprite.__init__(self)
  42.         self.original_image = image
  43.         self.image = image
  44.         self.rect = image.get_rect()
  45.         setattr(self.rect, anchor, position)
  46.  
  47.     def draw(self, surface):
  48.         surface.blit(self.image, self.rect)
  49.  
  50. class RotationMovementKeys:
  51.     def __init__(self, sprite, up, down, left, right):
  52.         self.sprite = sprite
  53.         self.up = up
  54.         self.down = down
  55.         self.left = left
  56.         self.right = right
  57.  
  58.         self.angle = 0
  59.         self.speed = 0.04
  60.         self.rotation_speed = 0.08
  61.         self.center = pygame.Vector2(self.sprite.rect.center)
  62.         self.set_direction()
  63.  
  64.     def set_direction(self):
  65.         rad = radians(self.angle)
  66.         self.direction = pygame.Vector2(sin(rad), cos(rad))
  67.  
  68.     def do_rotate(self):
  69.         self.sprite.image = pygame.transform.rotate(self.sprite.original_image, self.angle)
  70.         self.sprite.rect = self.sprite.image.get_rect()
  71.         self.sprite.rect.center = self.center
  72.         self.set_direction()
  73.  
  74.     def on_keydown(self, keys_press, delta):
  75.         if keys_press[self.up]:
  76.             self.center -= self.direction * delta * self.speed
  77.             self.sprite.rect.center = self.center
  78.         elif keys_press[self.down]:
  79.             self.center += self.direction * delta * (self.speed / 2)
  80.             self.sprite.rect.center = self.center
  81.  
  82.         if keys_press[self.right]:
  83.             self.angle = (self.angle - self.rotation_speed * delta) % 360
  84.             self.do_rotate()
  85.         elif keys_press[self.left]:
  86.             self.angle = (self.angle + self.rotation_speed * delta) % 360
  87.             self.do_rotate()
  88.  
  89. class Example(Scene):
  90.     def __init__(self, manager):
  91.         self.create_image()
  92.         self.manager = manager
  93.         self.sprite = BaseSprite(self.rectangle, manager.rect.center, "center")
  94.         self.sprite_movement = RotationMovementKeys(self.sprite,
  95.             pygame.K_w, pygame.K_s, pygame.K_a, pygame.K_d)
  96.  
  97.     def create_image(self):
  98.         self.rectangle = pygame.Surface((10, 20), pygame.SRCALPHA)
  99.         self.rectangle.fill(pygame.Color('dodgerblue'))
  100.         self.rectangle.fill(pygame.Color('white'), (2, 2, 6, 3))
  101.  
  102.     def on_draw(self, surface):
  103.         surface.fill(pygame.Color("black"))
  104.         self.sprite.draw(surface)
  105.  
  106.     def on_event(self, event):
  107.         if event.type == pygame.QUIT:
  108.             self.manager.running = False
  109.  
  110.     def on_update(self, delta):
  111.         keys = pygame.key.get_pressed()
  112.         self.sprite_movement.on_keydown(keys, delta)
  113.  
  114. def main():
  115.     pygame.init()
  116.     manager = Manager("Rotation Example", 800, 600)
  117.     manager.scene = Example(manager)
  118.     manager.mainloop()
  119.  
  120. if __name__ == "__main__":
  121.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement