Advertisement
Windspar

Pygame Move And Jump Example

Aug 13th, 2019
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.63 KB | None | 0 0
  1. # Rough example. How to move and jump.
  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 on_keys(self, keys, delta):
  83.         if self.jump.active:
  84.             self.jump.move(delta)
  85.         elif keys[pygame.K_SPACE]:
  86.             self.jump.move(delta)
  87.         else:
  88.             x = 0
  89.             if keys[pygame.K_LEFT]:
  90.                 x -= 1
  91.  
  92.             if keys[pygame.K_RIGHT]:
  93.                 x += 1
  94.  
  95.             self.direction = pygame.Vector2(x, 0)
  96.             if x != 0:
  97.                 self.move(self.direction * self.speed * delta)
  98.  
  99. class JumpSystem:
  100.     def __init__(self, move_system, jump_height):
  101.         self.move_system = move_system
  102.         self.jump_height = jump_height
  103.         self.max_height = 0
  104.         self.height = 0
  105.         self.active = False
  106.         self.action = None
  107.  
  108.     def move(self, delta):
  109.         if self.action is None:
  110.             self.action = self.jump_up
  111.             self.active = True
  112.             self.move_system.direction.y = -1
  113.             self.height = self.move_system.position.y
  114.             self.max_height = self.height - self.jump_height
  115.  
  116.         self.action(delta)
  117.  
  118.     def jump_up(self, delta):
  119.         direction = self.move_system.direction
  120.         speed = self.move_system.speed
  121.         self.move_system.move(direction * speed * delta)
  122.         if self.move_system.position.y <= self.max_height:
  123.             self.move_system.direction.y = 1
  124.             self.action = self.jump_down
  125.  
  126.     def jump_down(self, delta):
  127.         direction = self.move_system.direction
  128.         speed = self.move_system.speed
  129.         self.move_system.move(direction * speed * delta)
  130.         if self.move_system.position.y >= self.height:
  131.             self.active = False
  132.             self.action = None
  133.             self.move_system.position.y = self.height
  134.  
  135. class Example(State):
  136.     def __init__(self):
  137.         self.sprites = Group()
  138.  
  139.         sprite = SimpleSprite((50, 500))
  140.         sprite.add(self.sprites)
  141.         MoveSystem(sprite, 0.08)
  142.  
  143.     def on_draw(self, surface):
  144.         surface.fill(pygame.Color('black'))
  145.         self.sprites.draw(surface)
  146.  
  147.     def on_event(self, event):
  148.         if event.type == pygame.QUIT:
  149.             Engine.running = False
  150.  
  151. def main():
  152.     pygame.init()
  153.     Engine.setup("Example", 800, 600, True)
  154.     Engine.extension['onkeys'] = OnKeys()
  155.     SimpleSprite.load_image(20, 20)
  156.     Engine.state = Example()
  157.     Engine.mainloop()
  158.  
  159. if __name__ == "__main__":
  160.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement