Перемещение фигуры по экрану с помощью клавиш управления

Всем доброго времени суток.

  • Фигура должна двигаться вверх, вниз, влево, вправо и стрелять передом в направлении своего движения.
  • У меня при движении влево фигура стреляет боком вправо, а при движении вправо фигура стреляет задом.

Ниже представлен код на языке Python, подскажите пожалуйста как его исправить?

import pygame, sys
import math  # Для вычисления углов

# Инициализация Pygame
pygame.init()
win = pygame.display.set_mode((400, 400))  # Окно размером 400х400 пикселей
pygame.display.set_caption("Поворот к мишени и стрельба в нее")

clock = pygame.time.Clock()

# Начальные координаты игрока
x = 50
y = 50

# Размеры игрока
width = 35
height = 35

# Скорость перемещения
speed = 5

# Список всех активных пуль
bullets = []

# Константа скорости полёта пуль
bullet_speed = 8

# Текущее направление движения игрока (для анимации и перемещения)
player_move_direction = None  # 'right', 'left', 'up', 'down', None

# Направление взгляда игрока (куда смотрит персонаж, ориентируется на мишень)
player_look_direction = None  # 'right', 'left', 'up', 'down' (упрощенно)

# Координаты мишени
target_x = 350
target_y = 350
target_radius = 15

# --- Спрайты ---
# Для упрощения, будем использовать walkRight и walkLeft.
# В реальной игре, вам понадобятся спрайты для каждого направления взгляда
# или механизм вращения.
try:
    walkRight = [
        pygame.image.load("Dan_Right1.png"),
        pygame.image.load("Dan_Right2.png"),
        pygame.image.load("Dan_Right3.png"),
        pygame.image.load("Dan_Right4.png"),
        pygame.image.load("Dan_Right5.png"),
    ]
    walkLeft = [
        pygame.image.load("Dan_Left1.png"),
        pygame.image.load("Dan_Left2.png"),
        pygame.image.load("Dan_Left3.png"),
        pygame.image.load("Dan_Left4.png"),
        pygame.image.load("Dan_Left5.png"),
    ]
    bg = pygame.image.load("Picture.jpg")  # Фон игры
    playerStand = pygame.image.load("Dan_Another.png")  # Изображение стоящего персонажа

    # --- Опционально: спрайты для других направлений взгляда ---
    # player_up_sprite = pygame.image.load('Dan_Up.png')
    # player_down_sprite = pygame.image.load('Dan_Down.png')

except pygame.error as e:
    print(f"Ошибка загрузки изображения: {e}")
    print("Убедитесь, что файлы изображений присутствуют.")
    pygame.quit()
    sys.exit()

animCount = 0


# Функция для определения направления взгляда на мишень
def get_look_direction(player_x, player_y, target_x, target_y):
    dx = target_x - player_x
    dy = target_y - player_y

    # Проверяем, находится ли мишень на одном уровне или вертикально
    if abs(dx) < 10:  # Если игрок и мишень почти на одной вертикали
        if dy > 0:
            return "down"
        elif dy < 0:
            return "up"
        else:
            return (
                player_look_direction if player_look_direction else "right"
            )  # Если в одной точке, сохраняем направление
    elif abs(dy) < 10:  # Если игрок и мишень почти на одной горизонтали
        if dx > 0:
            return "right"
        elif dx < 0:
            return "left"
        else:
            return player_look_direction if player_look_direction else "right"

    # Упрощенное определение: если цель справа, смотри вправо. Если слева, смотри влево.
    # Для более точного поворота, нужно использовать углы и больше спрайтов.
    if dx > 0:
        return "right"
    elif dx < 0:
        return "left"
    else:  # Если мишень прямо, смотрим в текущем направлении взгляда
        return player_look_direction if player_look_direction else "right"


# Функция отрисовки персонажа с учетом направления взгляда
def draw_player(player_x, player_y, look_direction):
    global animCount

    # Определяем, какой спрайт использовать для отрисовки
    if look_direction == "right":
        # Если смотрим вправо, используем спрайты walkRight
        # Если персонаж двигается вправо, а смотрит вправо - анимация ходьбы
        # Если персонаж стоит, а смотрит вправо - игнорируем animCount и используем playerStand
        if player_move_direction == "right":
            win.blit(walkRight[animCount // 6], (player_x, player_y))
            animCount += 1
            if animCount >= len(walkRight) * 6:
                animCount = 0
        else:
            win.blit(playerStand, (player_x, player_y))  # Стоит, но смотрит вправо
            animCount = 0  # Сбрасываем анимацию

    elif look_direction == "left":
        # Если смотрим влево, используем спрайты walkLeft
        if player_move_direction == "left":
            win.blit(walkLeft[animCount // 6], (player_x, player_y))
            animCount += 1
            if animCount >= len(walkLeft) * 6:
                animCount = 0
        else:
            win.blit(playerStand, (player_x, player_y))  # Стоит, но смотрит влево
            animCount = 0  # Сбрасываем анимацию

    # --- Добавьте здесь elif для 'up' и 'down', если у вас есть соответствующие спрайты ---
    elif look_direction == "up":
        #     # Рисуем спрайт, смотрящий вверх
        #     # Если игрок двигается вверх, используем анимацию
        if player_move_direction == "up":
            win.blit(player_up_walk[animCount // 6], (player_x, player_y))
            animCount += 1
            if animCount >= len(player_up_walk) * 6:
                animCount = 0
        else:
            win.blit(player_up_sprite, (player_x, player_y))
            animCount = 0
    elif look_direction == "down":
        #     # Рисуем спрайт, смотрящий вниз
        if player_move_direction == "down":
            win.blit(player_down_walk[animCount // 6], (player_x, player_y))
            animCount += 1
            if animCount >= len(player_down_walk) * 6:
                animCount = 0
        else:
            win.blit(player_down_sprite, (player_x, player_y))
            animCount = 0

    else:  # Если игрок стоит и направление взгляда не определено (или равно None)
        win.blit(playerStand, (player_x, player_y))
        animCount = 0  # Сбрасываем анимацию


# Функция рисования окна
def drawWindow():
    win.blit(bg, (0, 0))  # Рисуем фон

    # Рисуем мишень
    pygame.draw.circle(win, (255, 0, 0), (target_x, target_y), target_radius)

    # Рисуем персонажа, ориентируясь на направление взгляда
    draw_player(x, y, player_look_direction)

    # Рисование всех существующих пуль
    for bullet in bullets[:]:
        # Пуля стреляет В НАПРАВЛЕНИИ ВЗГЛЯДА (player_look_direction)
        if bullet["direction"] == "right":
            pygame.draw.rect(win, (255, 255, 255), (bullet["x"], bullet["y"], 10, 5))
            bullet["x"] += bullet_speed
        elif bullet["direction"] == "left":
            pygame.draw.rect(win, (255, 255, 255), (bullet["x"], bullet["y"], 10, 5))
            bullet["x"] -= bullet_speed
        elif bullet["direction"] == "up":
            pygame.draw.rect(win, (255, 255, 255), (bullet["x"], bullet["y"], 5, 10))
            bullet["y"] -= bullet_speed
        elif bullet["direction"] == "down":
            pygame.draw.rect(win, (255, 255, 255), (bullet["x"], bullet["y"], 5, 10))
            bullet["y"] += bullet_speed

        # Удаляем пули, вышедшие за пределы экрана
        if bullet["x"] < 0 or bullet["x"] > 400 or bullet["y"] < 0 or bullet["y"] > 400:
            bullets.remove(bullet)

    pygame.display.update()  # Обновляем экран


run = True
while run:
    clock.tick(30)

    moved_this_frame = False  # Флаг, был ли игрок в движении в этом кадре

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                # --- СТРЕЛЬБА В НАПРАВЛЕНИИ ВЗГЛЯДА ---
                # Пуля вылетает из передней части персонажа, смотрящего на мишень
                if player_look_direction == "right":
                    # Начинаем пулю справа от персонажа
                    bullets.append(
                        {
                            "x": x + width,
                            "y": y + (height // 2) - 2,
                            "direction": "right",
                        }
                    )
                elif player_look_direction == "left":
                    # Начинаем пулю слева от персонажа
                    bullets.append(
                        {"x": x - 10, "y": y + (height // 2) - 2, "direction": "left"}
                    )
                elif player_look_direction == "up":
                    # Начинаем пулю сверху от персонажа
                    bullets.append(
                        {"x": x + (width // 2) - 2, "y": y - 10, "direction": "up"}
                    )
                elif player_look_direction == "down":
                    # Начинаем пулю снизу от персонажа
                    bullets.append(
                        {
                            "x": x + (width // 2) - 2,
                            "y": y + height,
                            "direction": "down",
                        }
                    )
                else:  # Если игрок стоит и направление взгляда не определено
                    # Стреляем по умолчанию вправо
                    bullets.append(
                        {
                            "x": x + width,
                            "y": y + (height // 2) - 2,
                            "direction": "right",
                        }
                    )

    keys = pygame.key.get_pressed()

    # --- Обновление направления ДВИЖЕНИЯ игрока ---
    # Это влияет только на то, куда перемещается спрайт и какую анимацию ходьбы показывать
    if keys[pygame.K_RIGHT]:
        player_move_direction = "right"
        x += speed
        moved_this_frame = True
    elif keys[pygame.K_LEFT]:
        player_move_direction = "left"
        x -= speed
        moved_this_frame = True
    elif keys[pygame.K_UP]:
        player_move_direction = "up"
        y -= speed
        moved_this_frame = True
    elif keys[pygame.K_DOWN]:
        player_move_direction = "down"
        y += speed
        moved_this_frame = True

    # Если игрок не двигался, сбрасываем направление движения
    if not moved_this_frame:
        player_move_direction = None

    # --- Обновление направления ВЗГЛЯДА на мишень ---
    # Это всегда происходит, независимо от движения.
    player_look_direction = get_look_direction(x, y, target_x, target_y)

    drawWindow()  # Рисуем все объекты

pygame.quit()
sys.exit()

Ответы (0 шт):