Перемещение фигуры по экрану с помощью клавиш управления
Всем доброго времени суток.
- Фигура должна двигаться вверх, вниз, влево, вправо и стрелять передом в направлении своего движения.
- У меня при движении влево фигура стреляет боком вправо, а при движении вправо фигура стреляет задом.
Ниже представлен код на языке 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()