1. You can use pygame.Vector2 over pygame.math.Vector2.
Example how I do it. Using pure Vector2 math.
import os
import pygame
from pygame.sprite import Group, Sprite
class Engine:
@staticmethod
def center_screen():
os.environ['SDL_VIDEO_CENTERED'] = '1'
def __init__(self, caption, width, height, flags=0):
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
def idle(self):
self.delta = self.clock.tick(self.fps)
def quit(self):
self.running = False
class SimpleSprite(Sprite):
def __init__(self, image, position, anchor="topleft"):
Sprite.__init__(self)
self.image = image
self.rect = self.image.get_rect(**{anchor: position})
class Movement:
def __init__(self, sprite, speed, angle=180):
self.sprite = sprite
self.speed = speed * 0.01
self.original_image = sprite.image
self.velocity = pygame.Vector2(0, 0)
self.center = pygame.Vector2(sprite.rect.center)
self.rotation_speed = 8 * 0.01
self.angle = angle
self.vector = self.get_vector()
self._move = None
self._rotate = None
def get_vector(self):
vector = pygame.Vector2(0, 0)
vector.from_polar((1, self.angle))
vector.x, vector.y = vector.y, vector.x
return vector
def up_action(self):
self._move = self.move_up
def down_action(self):
self._move = self.move_down
def left_action(self):
self._rotate = self.rotate_left
def right_action(self):
self._rotate = self.rotate_right
def move_up(self, delta):
self.center += self.vector * self.speed * delta
self.sprite.rect.center = self.center
def move_down(self, delta):
self.center += -self.vector * self.speed * delta
self.sprite.rect.center = self.center
def rotate_left(self, delta):
self.angle = (self.angle + self.rotation_speed * delta) % 360
self.update_rotation()
def rotate_right(self, delta):
self.angle = (self.angle - self.rotation_speed * delta) % 360
self.update_rotation()
def update_rotation(self):
self.sprite.image = pygame.transform.rotate(self.original_image, self.angle)
self.sprite.rect = self.sprite.image.get_rect(center=self.center)
self.vector = self.get_vector()
def move(self, delta):
if self._rotate:
self._rotate(delta)
if self._move:
self._move(delta)
self._move = None
self._rotate = None
class MovementKeys:
def __init__(self, movement, up, down, left, right):
self.movement = movement
self.up = self.wrap(up)
self.down = self.wrap(down)
self.left = self.wrap(left)
self.right = self.wrap(right)
def update(self, delta, keys_pressed):
keys = lambda pressed, key: any(pressed[k] for k in key)
if keys(keys_pressed, self.up):
self.movement.up_action()
if keys(keys_pressed, self.down):
self.movement.down_action()
if keys(keys_pressed, self.right):
self.movement.right_action()
if keys(keys_pressed, self.left):
self.movement.left_action()
self.movement.move(delta)
def wrap(self, item):
if isinstance(item, list):
return item
elif isinstance(item, tuple):
return list(item)
else:
return [item]
class Player:
def __init__(self, rect):
image = pygame.Surface((20, 20), pygame.SRCALPHA)
image.fill(pygame.Color('dodgerblue'))
self.sprite = SimpleSprite(image, rect.center, "center")
self.movement = Movement(self.sprite, 8)
self.movement_keys = MovementKeys(self.movement,
(pygame.K_UP, pygame.K_w),
(pygame.K_DOWN, pygame.K_s),
(pygame.K_LEFT, pygame.K_a),
(pygame.K_RIGHT, pygame.K_d))
def update(self, delta, keys_pressed):
self.movement_keys.update(delta, keys_pressed)
class Scene:
def __init__(self, engine):
self.engine = engine
self.background = pygame.Color("black")
self.player = Player(engine.rect)
self.sprites = Group(self.player.sprite)
def on_draw(self, surface):
surface.fill(self.background)
self.sprites.draw(surface)
def on_event(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.engine.quit()
def mainloop(self):
self.engine.running = True
while self.engine.running:
self.on_event()
self.on_update(self.engine.delta)
self.on_draw(self.engine.surface)
pygame.display.flip()
self.engine.idle()
def on_update(self, delta):
keys_pressed = pygame.key.get_pressed()
self.player.update(delta, keys_pressed)
def main():
pygame.init()
Engine.center_screen()
engine = Engine("Movement Example", 600, 600)
scene = Scene(engine)
scene.mainloop()
main()
99 percent of computer problems exists between chair and keyboard.