Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import pygame
- from types import SimpleNamespace
- from pygame.sprite import Sprite, Group, spritecollide
- # Wrap pygame builtin colors into namespace.
- color = SimpleNamespace(**pygame.color.THECOLORS)
- # Interface
- class Scene:
- def __init__(self, manager):
- self.manager = manager
- def on_draw(self, surface): pass
- def on_event(self, event): pass
- def on_update(self, delta): pass
- def on_quit(self):
- self.manager.quit()
- # Handles what scene is active
- class Manager:
- def __init__(self, caption, width, height, center=True, flags=0):
- if center:
- os.environ['SDL_VIDEO_CENTERED'] = '1'
- # Basic pygame setup
- pygame.display.set_caption(caption)
- self.surface = pygame.display.set_mode((width, height), flags)
- self.rect = self.surface.get_rect()
- self.clock = pygame.time.Clock()
- self.running = False
- self.delta = 0
- self.fps = 60
- self.scene = Scene(self)
- def mainloop(self):
- self.running = True
- while self.running:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- self.scene.on_quit()
- else:
- self.scene.on_event(event)
- self.scene.on_update(self.delta)
- self.scene.on_draw(self.surface)
- pygame.display.flip()
- self.delta = self.clock.tick(self.fps)
- def quit(self):
- self.running = False
- class Label(Sprite):
- def __init__(self, text, font, color, position, anchor="topleft"):
- Sprite.__init__(self)
- self._text = text
- self._font = font
- self._color = color
- self._anchor = anchor
- self._position = position
- self.render()
- def render(self):
- self.image = self._font.render(self._text, 1, self._color)
- self.rect = self.image.get_rect(**{self._anchor: self._position})
- def set_text(self, text):
- self._text = text
- self.render()
- class Images:
- @classmethod
- def init(cls):
- cls.character = pygame.Surface((30, 30))
- cls.character.fill(color.firebrick)
- cls.player = pygame.Surface((30, 30))
- cls.player.fill(color.dodgerblue)
- class Character(Sprite):
- def __init__(self, name, image, position, anchor="topleft"):
- Sprite.__init__(self)
- self.name = name
- self.image = image
- self.rect = image.get_rect(**{anchor: position})
- self.center = pygame.Vector2(self.rect.center)
- class Player(Sprite):
- def __init__(self, image, position, anchor="topleft"):
- Sprite.__init__(self)
- self.image = image
- self.rect = image.get_rect(**{anchor: position})
- self.center = pygame.Vector2(self.rect.center)
- self.speed = 80 * 0.001
- def move(self, pressed, delta, group):
- if any([pressed[k] for k in (pygame.K_UP, pygame.K_w)]):
- self.center.y -= self.speed * delta
- if any([pressed[k] for k in (pygame.K_DOWN, pygame.K_s)]):
- self.center.y += self.speed * delta
- if any([pressed[k] for k in (pygame.K_LEFT, pygame.K_a)]):
- self.center.x -= self.speed * delta
- if any([pressed[k] for k in (pygame.K_RIGHT, pygame.K_d)]):
- self.center.x += self.speed * delta
- # Move sprite
- self.rect.center = self.center
- # Collision
- names = []
- sprites = spritecollide(self, group, False)
- for sprite in sprites:
- clip = sprite.rect.clip(self.rect)
- if clip.h < clip.w:
- if sprite.rect.centery > self.rect.centery:
- self.center.y -= clip.h
- else:
- self.center.y += clip.h
- else:
- if sprite.rect.centerx > self.rect.centerx:
- self.center.x -= clip.w
- else:
- self.center.x += clip.w
- self.rect.center = self.center
- names.append(sprite.name)
- return names
- class GameScene(Scene):
- def __init__(self, manager):
- Scene.__init__(self, manager)
- self.sprites = Group()
- self.characters = Group()
- self.player = Player(Images.player, manager.rect.center, "center")
- for name, pos in [("Amy", (40, 40)), ("Steve", (320, 120)), ("Mike", (80, 280))]:
- self.characters.add(Character(name, Images.character, pos))
- position = manager.rect.centerx, 20
- self.label = Label("No Collision", pygame.font.Font(None, 28), color.lawngreen, position, "midtop")
- self.sprites.add(self.player, self.label)
- self.sprites.add(self.characters)
- def on_draw(self, surface):
- surface.fill(color.black)
- self.sprites.draw(surface)
- def on_update(self, delta):
- pressed = pygame.key.get_pressed()
- names = self.player.move(pressed, delta, self.characters)
- if len(names) == 1:
- self.label.set_text("Collide with " + names[0])
- elif len(names) > 1:
- string = "{}, " * len(names)
- self.label.set_text("Collide with " + string.format(*names))
- def main():
- pygame.init()
- manager = Manager("Collision Example", 600, 600)
- Images.init()
- manager.scene = GameScene(manager)
- manager.mainloop()
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement