Skip to content

Instantly share code, notes, and snippets.

@f0ursqu4r3
Created November 18, 2021 11:41
Show Gist options
  • Save f0ursqu4r3/809e81a1cd6316f96943331d23d2a663 to your computer and use it in GitHub Desktop.
Save f0ursqu4r3/809e81a1cd6316f96943331d23d2a663 to your computer and use it in GitHub Desktop.
vector movement
import pygame
from pygame import Vector2
pygame.init()
class Game:
def __init__(self):
self.window_size = Vector2(512)
self.window = pygame.display.set_mode(
self.window_size, pygame.DOUBLEBUF)
pygame.display.set_caption('playground')
self.screen_scale = 4
self.screen = pygame.Surface(self.window_size / self.screen_scale)
self.screen_size = Vector2(self.screen.get_size())
self.fps = 60
self.center = self.screen_size / 2
self.player_pos = self.center
self.bullets = []
self.clock = pygame.time.Clock()
def run(self):
while 1:
self.process_events()
self.update()
self.draw()
def process_events(self):
for event in pygame.event.get():
if (event.type == pygame.QUIT or
(event.type == pygame.KEYDOWN and
event.key == pygame.K_ESCAPE)):
pygame.quit()
quit()
pressed = pygame.key.get_pressed()
if pressed[pygame.K_w]:
self.player_pos.y -= 1
print(f'pos={self.player_pos}')
if pressed[pygame.K_s]:
self.player_pos.y += 1
print(f'pos={self.player_pos}')
if pressed[pygame.K_a]:
self.player_pos.x -= 1
print(f'pos={self.player_pos}')
if pressed[pygame.K_d]:
self.player_pos.x += 1
print(f'pos={self.player_pos}')
if pygame.mouse.get_pressed()[0]:
mpos = Vector2(pygame.mouse.get_pos()) / self.screen_scale
vec = (mpos - self.player_pos).normalize()
self.bullets.append(
Bullet(self.player_pos + (vec * 12), vec * 64)
)
def update(self):
dt = self.clock.tick(self.fps) * 0.001
for bullet in self.bullets:
bullet.update(dt)
self.bullets = [b for b in self.bullets if self.in_bounds(b.pos)]
def draw(self):
self.screen.fill((60, 50, 60))
layer = pygame.Surface(self.screen_size, pygame.SRCALPHA)
mpos = Vector2(pygame.mouse.get_pos()) / self.screen_scale
vec = (mpos - self.player_pos).normalize()
pygame.draw.circle(layer, (0, 200, 0), self.player_pos, 4, 1)
pygame.draw.line(layer, (200, 200, 0),
self.player_pos + (vec * 6),
self.player_pos + (vec * 10)
)
for bullet in self.bullets:
bullet.draw(layer)
self.screen.blit(layer, Vector2())
pygame.transform.scale(self.screen, self.window_size, self.window)
pygame.display.flip()
def in_bounds(self, pos):
return (0 <= pos.x < self.screen_size.x and
0 <= pos.y < self.screen_size.y)
class Bullet:
def __init__(self, pos, vel):
self.pos = Vector2(pos)
self.vel = Vector2(vel)
def update(self, dt):
self.pos += self.vel * dt
def draw(self, screen):
pygame.draw.circle(screen, (200, 0, 0), self.pos, 1)
if __name__ == '__main__':
Game().run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment