@Yatagarashy

Кто может помочь с векторами?

Есть у меня класс 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()
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 1
LoliDeveloper
@LoliDeveloper
Линейная алгебра как смысл жизни
Можете эту функцию переделать в функцию def vision(self, degrees)(ну чтоб самому указывать любой угол), а def vision(self) определить как vision(self, self.degrees)
Не уверен как это всё в питоне, ну в общем надо перегрузкой функций воспользоваться.

Да и чего вы стесняетесь ставить тэг Python на свои вопросы? Тут очень много людей на нём пишет и вам бы уже полюбому помогли
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы