Advertisement
Windspar

Pygame Arc jump

Aug 14th, 2019
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.16 KB | None | 0 0
  1. # Rough Example. Jump in arc.
  2. import pygame
  3. import os
  4.  
  5. from pygame.sprite import Sprite, Group
  6.  
  7. class State:
  8.     def on_draw(self, surface): pass
  9.     def on_event(self, event): pass
  10.     def on_update(self, delta): pass
  11.  
  12. class Engine:
  13.     @classmethod
  14.     def setup(cls, caption, width, height, center=False):
  15.         pygame.display.set_caption(caption)
  16.         cls.surface = pygame.display.set_mode((width, height))
  17.         cls.rect = cls.surface.get_rect()
  18.         cls.clock = pygame.time.Clock()
  19.         cls.running = False
  20.         cls.delta = 0
  21.         cls.fps = 30
  22.  
  23.         if center:
  24.             os.environ['SDL_VIDEO_CENTERED'] = '1'
  25.  
  26.         cls.state = State()
  27.         cls.extension = {}
  28.  
  29.     @classmethod
  30.     def mainloop(cls):
  31.         cls.running = True
  32.         while cls.running:
  33.             for event in pygame.event.get():
  34.                 cls.state.on_event(event)
  35.  
  36.             cls.state.on_update(cls.delta)
  37.             cls.state.on_draw(cls.surface)
  38.  
  39.             for extension in cls.extension.values():
  40.                 extension.update(cls)
  41.  
  42.             pygame.display.flip()
  43.             cls.delta = cls.clock.tick(cls.fps)
  44.  
  45. class OnKeys:
  46.     def __init__(self):
  47.         self.on_keys = []
  48.  
  49.     def add(self, method):
  50.         self.on_keys.append(method)
  51.  
  52.     def update(self, engine):
  53.         keys = pygame.key.get_pressed()
  54.         for method in self.on_keys:
  55.             method.on_keys(keys, engine.delta)
  56.  
  57. class SimpleSprite(Sprite):
  58.     @classmethod
  59.     def load_image(cls, w, h):
  60.         cls.image = pygame.Surface((w, h))
  61.         cls.image.fill(pygame.Color('dodgerblue'))
  62.  
  63.     def __init__(self, position, anchor="topleft"):
  64.         Sprite.__init__(self)
  65.         self.image = SimpleSprite.image
  66.         self.rect = self.image.get_rect()
  67.         setattr(self.rect, anchor, position)
  68.  
  69. class MoveSystem:
  70.     def __init__(self, sprite, speed=0.03):
  71.         self.sprite = sprite
  72.         self.speed = speed
  73.         self.direction = pygame.Vector2(0, 0)
  74.         self.position = pygame.Vector2(sprite.rect.topleft)
  75.         Engine.extension['onkeys'].add(self)
  76.         self.jump = JumpSystem(self, 30)
  77.  
  78.     def move(self, vector):
  79.         self.position += vector
  80.         self.sprite.rect.topleft = self.position
  81.  
  82.     def update_rect(self):
  83.         self.sprite.rect.topleft = self.position
  84.  
  85.     def on_keys(self, keys, delta):
  86.         if self.jump.active:
  87.             self.jump.move(delta)
  88.             self.clamp()
  89.         elif keys[pygame.K_SPACE]:
  90.             self.jump.move(delta)
  91.             self.clamp()
  92.         else:
  93.             x = 0
  94.             if keys[pygame.K_LEFT]:
  95.                 x -= 1
  96.  
  97.             if keys[pygame.K_RIGHT]:
  98.                 x += 1
  99.  
  100.             self.direction = pygame.Vector2(x, 0)
  101.             if x != 0:
  102.                 self.move(self.direction * self.speed * delta)
  103.                 self.clamp()
  104.  
  105.     def clamp(self):
  106.         rect = self.sprite.rect
  107.         clamp = self.sprite.rect.clamp(Engine.rect)
  108.         if rect.x != clamp.x:
  109.             rect.x = clamp.x
  110.             self.position.x = clamp.x
  111.  
  112.         if rect.y != clamp.y:
  113.             rect.y = clamp.y
  114.             self.position.y = clamp.y
  115.  
  116. class JumpSystem:
  117.     def __init__(self, move_system, distance, force=3):
  118.         self.move_system = move_system
  119.         self.active = False
  120.         self.action = None
  121.         self.floor = None
  122.         self.speed = 1 / 30
  123.  
  124.         # Variables for arc jump
  125.         self.force = force * 3
  126.         self.distance = distance / 2
  127.         self.normalize = (1 / distance) ** 2
  128.         self.base = None
  129.  
  130.     def move(self, delta):
  131.         if self.base is None:
  132.             self.active = True
  133.             self.base = -self.distance
  134.             self.floor = self.move_system.position.y
  135.  
  136.         direction = self.move_system.direction
  137.         speed = self.move_system.speed
  138.         self.base += self.speed * delta
  139.         self.base = min(self.base, self.distance)
  140.  
  141.         if self.base > 0:
  142.             direction.y = self.base ** 2 * self.normalize * self.force
  143.         else:
  144.             direction.y = -(self.base ** 2 * self.normalize * self.force)
  145.  
  146.         self.move_system.move(direction * speed * delta)
  147.         self.move_system.position.y = min(self.move_system.position.y, self.floor)
  148.         self.move_system.update_rect()
  149.         if self.base >= self.distance:
  150.             self.move_system.position.y = self.floor
  151.             self.move_system.update_rect()
  152.             self.active = False
  153.             self.base = None
  154.  
  155. class Example(State):
  156.     def __init__(self):
  157.         self.sprites = Group()
  158.  
  159.         sprite = SimpleSprite((50, 500))
  160.         sprite.add(self.sprites)
  161.         MoveSystem(sprite, 0.08)
  162.  
  163.     def on_draw(self, surface):
  164.         surface.fill(pygame.Color('black'))
  165.         self.sprites.draw(surface)
  166.  
  167.     def on_event(self, event):
  168.         if event.type == pygame.QUIT:
  169.             Engine.running = False
  170.  
  171. def main():
  172.     pygame.init()
  173.     Engine.setup("Example", 800, 600, True)
  174.     Engine.extension['onkeys'] = OnKeys()
  175.     SimpleSprite.load_image(20, 20)
  176.     Engine.state = Example()
  177.     Engine.mainloop()
  178.  
  179. if __name__ == "__main__":
  180.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement