Как сделать движение объекта по направлению курсора?
У меня есть игрок который выпускает пули, и я пытался сделать так, чтоб он стрелял по направлению курсора, чтоб лучше попадать во врагов, но столкнулся с проблемой, что чем дальше я отходил от начала карты (~644, 720), тем выше начинали лететь пули, и они уже не летят по направлению мышки, а лишь вверх в какую-то точку.
if mkeys[0] and not self.attack_pressed:
self.last_shoot = coltdown
mouse_pos = pygame.mouse.get_pos()
# Находим точки начала и конца атаки
x_start, y_start = self.rect.centerx, self.rect.centery
x_end, y_end = mouse_pos[0], mouse_pos[1]
# Добавляем смещение между игроком и точкой начала атаки
x_offset, y_offset = self.rect.centerx - (map_width / 2), self.rect.centery - (map_height / 2)
x_start -= x_offset
y_start -= y_offset
x_end -= x_offset
y_end -= y_offset
# Нормализуем вектор направления атаки
dx, dy = x_end - x_start, y_end - y_start
length = math.sqrt(dx ** 2 + dy ** 2)
dx, dy = dx / length, dy / length
# Учесть размеры карты
dx *= map_width / max(map_width, map_height)
dy *= map_height / max(map_width, map_height)
atack = Atack(self.rect.centerx, self.rect.centery, (dx, dy))
sprites.add(atack)
self.attack_pressed = True
Код выпуска пуль, так сказать.
# атака
class Atack(Item):
def __init__(self, x, y, direction):
super().__init__(ATACK_HITBOX, WHITE)
self.image = pygame.Surface(ATACK_HITBOX)
self.image.fill(RED)
self.rect = self.image.get_rect(center=(x, y))
self.direction = direction
self.speed = 15
self.lifetime = 100 # время жизни атаки в кадрах
self.attack_pressed = False
self.coltdown = pygame.time.get_ticks()
# движение атаки
def move(self):
# перемещаем атаку вдоль вектора направления с определенной скоростью
dx = self.direction[0] * self.speed
dy = self.direction[1] * self.speed
self.rect.x += dx
self.rect.y += dy
#другой код.
Код некой пули.
Пытался попросить помощи у нейросети, но ничего не помогло, честно говоря понятия не имею что мне нужно сделать.
Я использую библиотеку PyTMX для импрорта карты! Может это имеет значение?
Ответы (1 шт):
Если вдруг кому помогу: Всё это время я допускал огромную ошибку - я вычислял координаты мыши используя координаты игрока, а так как карта большая, то и координаты были больше координат расположения мыши, из-за этого пули стреляли высоко вверх а не по направлению мыши. Решение оказалось проще, чем я думал. Нужно было считывать координаты мыши и использовать при этом координаты монитора, а не карты, тогда всё заработало.
# выглядит это так:
screen_size = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)
# Получаем координаты мыши относительно экрана
mouse_pos = pygame.mouse.get_pos()
# Вычисляем координаты мыши относительно центра экрана
mouse_x = mouse_pos[0] - screen_size[0] // 2 + self.rect.centerx
mouse_y = mouse_pos[1] - screen_size[1] // 2 + self.rect.centery
# Вычисляем направление
angle = np.arctan2(mouse_y - self.rect.centery, mouse_x - self.rect.centerx)
dx = np.cos(angle)
dy = np.sin(angle)
self.direction = (dx, dy)
# движение атаки
def move(self):
# перемещаем атаку
self.rect.x += self.speed * self.direction[0]
elf.rect.y += self.speed * self.direction[1]
Вот так, решение оказалось довольно проще, чем я думал! :)