Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Rough example. How to move and jump.
- import pygame
- import os
- from pygame.sprite import Sprite, Group
- class State:
- def on_draw(self, surface): pass
- def on_event(self, event): pass
- def on_update(self, delta): pass
- class Engine:
- @classmethod
- def setup(cls, caption, width, height, center=False):
- pygame.display.set_caption(caption)
- cls.surface = pygame.display.set_mode((width, height))
- cls.rect = cls.surface.get_rect()
- cls.clock = pygame.time.Clock()
- cls.running = False
- cls.delta = 0
- cls.fps = 30
- if center:
- os.environ['SDL_VIDEO_CENTERED'] = '1'
- cls.state = State()
- cls.extension = {}
- @classmethod
- def mainloop(cls):
- cls.running = True
- while cls.running:
- for event in pygame.event.get():
- cls.state.on_event(event)
- cls.state.on_update(cls.delta)
- cls.state.on_draw(cls.surface)
- for extension in cls.extension.values():
- extension.update(cls)
- pygame.display.flip()
- cls.delta = cls.clock.tick(cls.fps)
- class OnKeys:
- def __init__(self):
- self.on_keys = []
- def add(self, method):
- self.on_keys.append(method)
- def update(self, engine):
- keys = pygame.key.get_pressed()
- for method in self.on_keys:
- method.on_keys(keys, engine.delta)
- class SimpleSprite(Sprite):
- @classmethod
- def load_image(cls, w, h):
- cls.image = pygame.Surface((w, h))
- cls.image.fill(pygame.Color('dodgerblue'))
- def __init__(self, position, anchor="topleft"):
- Sprite.__init__(self)
- self.image = SimpleSprite.image
- self.rect = self.image.get_rect()
- setattr(self.rect, anchor, position)
- class MoveSystem:
- def __init__(self, sprite, speed=0.03):
- self.sprite = sprite
- self.speed = speed
- self.direction = pygame.Vector2(0, 0)
- self.position = pygame.Vector2(sprite.rect.topleft)
- Engine.extension['onkeys'].add(self)
- self.jump = JumpSystem(self, 30)
- def move(self, vector):
- self.position += vector
- self.sprite.rect.topleft = self.position
- def on_keys(self, keys, delta):
- if self.jump.active:
- self.jump.move(delta)
- elif keys[pygame.K_SPACE]:
- self.jump.move(delta)
- else:
- x = 0
- if keys[pygame.K_LEFT]:
- x -= 1
- if keys[pygame.K_RIGHT]:
- x += 1
- self.direction = pygame.Vector2(x, 0)
- if x != 0:
- self.move(self.direction * self.speed * delta)
- class JumpSystem:
- def __init__(self, move_system, jump_height):
- self.move_system = move_system
- self.jump_height = jump_height
- self.max_height = 0
- self.height = 0
- self.active = False
- self.action = None
- def move(self, delta):
- if self.action is None:
- self.action = self.jump_up
- self.active = True
- self.move_system.direction.y = -1
- self.height = self.move_system.position.y
- self.max_height = self.height - self.jump_height
- self.action(delta)
- def jump_up(self, delta):
- direction = self.move_system.direction
- speed = self.move_system.speed
- self.move_system.move(direction * speed * delta)
- if self.move_system.position.y <= self.max_height:
- self.move_system.direction.y = 1
- self.action = self.jump_down
- def jump_down(self, delta):
- direction = self.move_system.direction
- speed = self.move_system.speed
- self.move_system.move(direction * speed * delta)
- if self.move_system.position.y >= self.height:
- self.active = False
- self.action = None
- self.move_system.position.y = self.height
- class Example(State):
- def __init__(self):
- self.sprites = Group()
- sprite = SimpleSprite((50, 500))
- sprite.add(self.sprites)
- MoveSystem(sprite, 0.08)
- def on_draw(self, surface):
- surface.fill(pygame.Color('black'))
- self.sprites.draw(surface)
- def on_event(self, event):
- if event.type == pygame.QUIT:
- Engine.running = False
- def main():
- pygame.init()
- Engine.setup("Example", 800, 600, True)
- Engine.extension['onkeys'] = OnKeys()
- SimpleSprite.load_image(20, 20)
- Engine.state = Example()
- Engine.mainloop()
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement