Skip to content

Instantly share code, notes, and snippets.

@f0ursqu4r3
Last active November 22, 2021 12:10
Show Gist options
  • Save f0ursqu4r3/9c6ed6f4f3f4d0af48d3e07ba69c4596 to your computer and use it in GitHub Desktop.
Save f0ursqu4r3/9c6ed6f4f3f4d0af48d3e07ba69c4596 to your computer and use it in GitHub Desktop.
Angle from vector proof example
import math
import pygame
import random
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 = 3
self.screen = pygame.Surface(self.window_size/self.screen_scale)
self.screen_size = Vector2(self.screen.get_size())
self.clock = pygame.time.Clock()
self.mpos = Vector2(pygame.mouse.get_pos()) / self.screen_scale
self.bullet = Bullet(
self.screen_size/2,
Vector2(
random.random() * 2 - 1,
random.random() * 2 - 1
).normalize() * 100
)
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()
elif (event.type == pygame.KEYDOWN and
event.key == pygame.K_SPACE):
self.bullet.vel = Vector2(
random.random() * 2 - 1,
random.random() * 2 - 1
).normalize() * 100
def update(self):
dt = self.clock.tick(60)*.001
self.bullet.pos += self.bullet.vel * dt
if not (0 < self.bullet.pos.x < self.screen_size.x):
if self.bullet.pos.x < 0:
self.bullet.pos.x = 0
else:
self.bullet.pos.x = self.screen_size.x
self.bullet.vel.x *= -1
if not (0 < self.bullet.pos.y < self.screen_size.y):
if self.bullet.pos.y < 0:
self.bullet.pos.y = 0
else:
self.bullet.pos.y = self.screen_size.y
self.bullet.vel.y *= -1
def draw(self):
self.screen.fill((60,50,60))
layer = pygame.Surface(self.screen.get_size(), pygame.SRCALPHA)
layer.blit(self.bullet.surf, self.bullet.pos - Vector2(self.bullet.surf.get_size())/2)
mpos = Vector2(pygame.mouse.get_pos()) / self.screen_scale
center = self.screen_size / 2
vec = (mpos - center).normalize()
degrees = math.degrees(math.atan2(vec.y, vec.x))
angle = (360 + degrees) % 360
pygame.draw.line(layer, (0,200,0), center, center + vec * 10, 1)
pygame.draw.circle(layer, (0,200,0), center, 2)
if mpos != self.mpos:
print(angle)
self.mpos = mpos
self.screen.blit(layer, Vector2())
pygame.transform.scale(self.screen, self.window_size, self.window)
pygame.display.flip()
class Bullet:
def __init__(self, pos, vel):
self.pos = Vector2(pos)
self.vel = Vector2(vel)
surf = pygame.Surface(Vector2(8, 4))
pygame.draw.rect(surf, (200, 200, 0), (0,0,8,4))
pygame.draw.rect(surf, (200, 0, 0), (4,0,4,4))
self._surf = surf
@property
def surf(self):
if not self.vel:
return self._surf
vel = self.vel.normalize()
degrees = math.degrees(math.atan2(vel.y, vel.x))
angle = (360 + degrees) % 360
return pygame.transform.rotate(self._surf, -angle)
Game().run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment