Windspar

Pygame Vector2 make math simple

Oct 13th, 2022
1,948
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.09 KB | None | 0 0
  1. # Rotate image around another. Key movement vector on the other.
  2. import pygame
  3. from pygame.sprite import Group, Sprite
  4.  
  5. # Quick Simple Framework
  6. class State:
  7.     def __init__(self, manager=None, name=None):
  8.         if manager:
  9.             self.manager = manager
  10.             if name:
  11.                 manager.states[name] = self
  12.  
  13.     def on_draw(self, surface): pass
  14.     def on_event(self, event): pass
  15.     def on_update(self, ticks, delta): pass
  16.  
  17.  
  18. class StateMachine:
  19.     def __init__(self, width, height, fps, flags):
  20.         self.surface = pygame.display.set_mode((width, height), flags)
  21.         self.rect = self.surface.get_rect()
  22.         self.clock = pygame.time.Clock()
  23.         self.running = False
  24.         self.delta = 0
  25.         self.ticks = 0
  26.         self.fps = fps
  27.  
  28.         self._state = State()
  29.         self.next_state = None
  30.  
  31.     def loop(self):
  32.         self.running = True
  33.         while self.running:
  34.             if self.next_state:
  35.                 self._state = self.next_state
  36.                 self.next_state = None
  37.  
  38.             for event in pygame.event.get():
  39.                 self._state.on_event(event)
  40.  
  41.             self.ticks = pygame.time.get_ticks()
  42.             self._state.on_draw(self.surface)
  43.             self._state.on_update(self.ticks, self.delta)
  44.             pygame.display.flip()
  45.             self.delta = self.clock.tick(self.fps) * 0.001
  46.  
  47. class Manager:
  48.     def __init__(self, caption, width, height, fps=60, flags=0):
  49.         pygame.display.set_caption(caption)
  50.         self.engine = StateMachine(width, height, fps, flags)
  51.         self.images = ImageHandler()
  52.         self.states = {}
  53.  
  54.     def run(self, name=None):
  55.         if name:
  56.             self.engine._state = self.states[name]
  57.  
  58.         self.engine.loop()
  59.  
  60.     def set_state(self, name):
  61.         print(name)
  62.         print(self.states)
  63.         self.engine.next_state = self.states[name]
  64.  
  65.     def quit(self):
  66.         self.engine.running = False
  67.  
  68. class ImageHandler:
  69.     def __init__(self):
  70.         self.transparent = pygame.Color(0, 0, 0, 0)
  71.         self.square = self.create_square('navyblue', 30)
  72.         self.triangle = self.create_triangle("darkgreen", 30)
  73.  
  74.     def create_square(self, color, size):
  75.         size = size, size
  76.         self.surface = pygame.Surface(size)
  77.         self.surface.fill(color)
  78.         return self.surface
  79.  
  80.     def create_triangle(self, color, size):
  81.         sz = size
  82.         half = size // 2
  83.         size = size, size
  84.         self.surface = pygame.Surface(size, pygame.SRCALPHA)
  85.         self.surface.fill(self.transparent)
  86.         points = (0, sz), (half, 0), (sz, sz)
  87.         pygame.draw.polygon(self.surface, color, points)
  88.         return self.surface
  89.  
  90. # End Of Framework
  91.  
  92. class Entity(Sprite):
  93.     def __init__(self, image, position, anchor="topleft"):
  94.         super().__init__()
  95.         self.image = image
  96.         self.rect = image.get_rect()
  97.         setattr(self.rect, anchor, position)
  98.  
  99. class RotateAround:
  100.     def __init__(self, sprite, sprite_around, speed):
  101.         self.sprite = sprite
  102.         self.around = sprite_around
  103.         self.speed = speed
  104.         self.origin = pygame.Vector2(sprite.rect.center) - self.around.rect.center
  105.  
  106.     def update(self, delta):
  107.         self.origin.rotate_ip(delta * self.speed)
  108.         self.sprite.rect.center = self.around.rect.center + self.origin
  109.  
  110. class KeyMovement:
  111.     def __init__(self, sprite, speed):
  112.         self.center = sprite.rect.center
  113.         self.sprite = sprite
  114.         self.speed = speed
  115.  
  116.     def update(self, delta):
  117.         direction = pygame.Vector2()
  118.         keys = pygame.key.get_pressed()
  119.         if keys[pygame.K_UP] or keys[pygame.K_w]:
  120.             direction.y -= 1
  121.  
  122.         if keys[pygame.K_DOWN] or keys[pygame.K_s]:
  123.             direction.y += 1
  124.  
  125.         if keys[pygame.K_LEFT] or keys[pygame.K_a]:
  126.             direction.x -= 1
  127.  
  128.         if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
  129.             direction.x += 1
  130.  
  131.         if direction != pygame.Vector2():
  132.             direction.normalize_ip()
  133.             self.center += direction * self.speed * delta
  134.             self.sprite.rect.center = self.center
  135.  
  136. class MainState(State):
  137.     def __init__(self, manager, name):
  138.         super().__init__(manager, name)
  139.  
  140.         center = manager.engine.rect.center
  141.         self.square = Entity(manager.images.square, center, "center")
  142.         self.triangle = Entity(manager.images.triangle, (center[0] + 100, center[1]), "center")
  143.         self.sprites = Group(self.square, self.triangle)
  144.         self.around = RotateAround(self.triangle, self.square, 50)
  145.         self.movement = KeyMovement(self.square, 80)
  146.  
  147.     def on_draw(self, surface):
  148.         surface.fill('gray60')
  149.         self.sprites.draw(surface)
  150.  
  151.     def on_event(self, event):
  152.         if event.type == pygame.QUIT:
  153.             self.manager.quit()
  154.  
  155.     def on_update(self, ticks, delta):
  156.         self.around.update(delta)
  157.         self.movement.update(delta)
  158.  
  159. if __name__ == "__main__":
  160.     pygame.init()
  161.     manager = Manager("Math Test", 800, 600)
  162.     MainState(manager, "Main")
  163.     manager.run("Main")
  164.     pygame.quit()
  165.  
Advertisement
Add Comment
Please, Sign In to add comment