Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame
- class KeyState:
- def __init__(self):
- self.update()
- def __call__(self, *keys):
- count = len(keys)
- if count == 1:
- return self.pressed[keys[0]]
- elif count > 1:
- return any([self.pressed[k] for k in keys])
- def update(self):
- self.pressed = pygame.key.get_pressed()
- class Display:
- def __init__(self, caption, width, height, flags=0, fps=60):
- pygame.display.set_caption(caption)
- self.surface = pygame.display.set_mode((width, height), flags)
- self.rect = self.surface.get_rect()
- self.clock = pygame.Clock()
- self.running = True
- self.delta = 0
- self.fps = fps
- def flip(self):
- if self.running:
- pygame.display.flip()
- # For Smooth Movement
- self.delta = self.clock.tick(self.fps) / 1000
- class Square(pygame.sprite.Sprite):
- def __init__(self, image, center, speed):
- super().__init__()
- self.image = image
- self.rect = image.get_rect(center=center)
- self.center = pygame.Vector2(center)
- self.speed = speed
- def move(self, movement, delta):
- self.center += movement * delta * self.speed
- self.rect.center = self.center
- class ImageHandler:
- def __init__(self):
- self.square = pygame.Surface((50, 50))
- self.square.fill('dodgerblue')
- class Target:
- def __init__(self, sprite):
- self.vector = pygame.Vector2()
- # Center is a weak reference.
- self.center = sprite.center
- self.sprite = sprite
- self.target = None
- def is_done(self):
- return self.vector.length() == 0
- def set(self, position):
- self.target = position
- self.vector = (position - self.center).normalize()
- def update(self, delta):
- if self.target:
- self.sprite.move(self.vector, delta)
- if self.vector.x < 0:
- if self.sprite.center.x <= self.target[0]:
- self.vector.x = 0
- self.center.x = self.target[0]
- elif self.vector.x > 0:
- if self.center.x >= self.target[0]:
- self.vector.x = 0
- self.center.x = self.target[0]
- if self.vector.y < 0:
- if self.sprite.center.y <= self.target[1]:
- self.vector.y = 0
- self.center.y = self.target[1]
- elif self.vector.y > 0:
- if self.center.y >= self.target[1]:
- self.vector.y = 0
- self.center.y = self.target[1]
- if self.is_done():
- self.target = None
- class Game:
- def __init__(self):
- self.display = Display("Example", 600, 600)
- self.image = ImageHandler()
- self.key = KeyState()
- self.square = Square(self.image.square, self.display.rect.center, 80)
- self.sprites = pygame.sprite.Group(self.square)
- self.target = Target(self.square)
- def movement(self):
- self.key.update()
- direction = pygame.Vector2()
- if self.key(pygame.K_UP, pygame.K_w):
- direction.y -= 1
- if self.key(pygame.K_DOWN, pygame.K_s):
- direction.y += 1
- if self.key(pygame.K_LEFT, pygame.K_a):
- direction.x -= 1
- if self.key(pygame.K_RIGHT, pygame.K_d):
- direction.x += 1
- if direction.length() > 0:
- # Real World Movement
- direction.normalize_ip()
- self.square.move(direction, self.display.delta)
- def loop(self):
- while self.display.running:
- for event in pygame.event.get():
- if event.type == pygame.MOUSEBUTTONDOWN:
- if event.button == 1:
- self.target.set(event.pos)
- elif event.type == pygame.QUIT:
- self.display.running = False
- self.target.update(self.display.delta)
- if self.target.is_done():
- self.movement()
- self.display.surface.fill('black')
- self.sprites.draw(self.display.surface)
- self.display.flip()
- pygame.init()
- game = Game()
- game.loop()
- pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment