Есть у меня класс Player, и в методе vision у меня строится вектор который при соприкосновении с обьектом класса Block останавливается и получается что-то вроде рэйкастинга(может это вообще не то но ладно)
Ну и я бы хотел сделать этот метод как-то проще и чтобы можно было добавлять в него количество этих самых векторов просто указывая сколько градусов прибавить, я бы и сам сделал но у меня получился бы какой нибудь вырвиглазный код как этот, я был бы рад если бы меня кто-нибудь направил к правильному решению либо дал готовый код:)
import pygame, math
pygame.init()
class Block:
def __init__(self, pos):
self.position = pos
self.image = pygame.image.load("sprites/builds/worckbench.png").convert_alpha()
self.rect = self.image.get_rect(center=self.position)
def draw(self):
sc.blit(self.image, self.rect)
class Player:
def __init__(self, pos):
self.degress = 0
self.speed = 1
self.position = pos
self.current_image = pygame.image.load("sprites/entities/bunny.png").convert_alpha()
self.rect = self.current_image.get_rect(center=self.position)
def draw(self):
self.image = pygame.transform.rotate(self.current_image, self.degress)
sc.blit(self.image, self.image.get_rect(center=self.position))
def run(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
x = math.cos(math.radians(self.degress))
y = math.sin(math.radians(self.degress)) * -1
x = x * self.speed
y = y * self.speed
self.position = (self.position[0] + x, self.position[1] + y)
def rotate(self):
rel_x = pygame.mouse.get_pos()[0] - self.position[0]
rel_y = pygame.mouse.get_pos()[1] - self.position[1]
self.degress = math.degrees(math.atan2(rel_y, rel_x)) * -1
def vision(self):
degress = self.degress
self.vector_x = math.cos(math.radians(degress))
self.vector_y = math.sin(math.radians(degress)) * -1
self.vector = (self.vector_x, self.vector_y)
vector_scale = 0
vector_position_x = self.position[0]
vector_position_y = self.position[1]
cyde = True
while vector_scale <= 1000 and cyde:
vector_position_x += self.vector_x
vector_position_y += self.vector_y
line_y = vector_position_y - self.rect.y
line_x = vector_position_x - self.rect.x
vector_scale = math.sqrt(line_x ** 2 + line_y ** 2)
if vector_scale >= 1000:
cyde = False
for block in blocks:
if block.rect.collidepoint((vector_position_x, vector_position_y)):
cyde = False
break
pygame.draw.line(sc, (255, 255, 255), self.position, (vector_position_x, vector_position_y))
W = 600
H = 400
FPS = 60
clock = pygame.time.Clock()
sc = pygame.display.set_mode((W,H))
blocks = []
player = Player((W//2, H//2))
run = True
while run:
sc.fill((128,128,128))
player.draw()
player.rotate()
player.vision()
player.run()
for block in blocks:
block.draw()
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.MOUSEBUTTONDOWN:
blocks.append(Block(pygame.mouse.get_pos()))
pygame.display.update()
clock.tick(FPS)
pygame.quit()