Аватар для Raxxla
0 / 0 / 0
Регистрация: 09.12.2017
Сообщений: 28

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

17.12.2018, 21:28. Показов 2509. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
По идее должна фигурка Трампа бегать по экрану с помощью клавиш управления. Но почему-то основной цикл приводит к ошибке.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/python
# -*- coding: utf8 -*-
 
import pygame, sys
 
pygame.init()
win = pygame.display.set_mode((400, 400))
 
clock = pygame.time.Clock()
 
x = 50
y = 50
 
width = 35
height = 35
speed = 5
isJump = False
jumpCount = 10
animCount=0
left = False
right = False
 
walkRight = [pygame.image.load('Trump_Right1.png'),
pygame.image.load('Trump_Right2.png'),
pygame.image.load('Trump_Right3.png'),
pygame.image.load('Trump_Right4.png'),
pygame.image.load('Trump_Right5.png')]
 
walkLeft = [pygame.image.load('Dan_Left1.png'),
pygame.image.load('Trump_Left2.png'),
pygame.image.load('Trump_Left3.png'),
pygame.image.load('Trump_Left4.png'),
pygame.image.load('Trump_Left5.png')]
 
bg = pygame.image.load('Picture.jpg')
playerStand = pygame.image.load('Trump_Another.png')
 
def drawWindow():
    global animCount
    win.blit((bg, 0, 0))
    if animCount + 1 >=30:
        animCount = 0
    if left:
        win.blit(walkLeft[animCount // 5], (x, y))
        animCount += 1
    elif right:
        win.blit(walkRight[animCount // 5], (x, y))
        animCount +=1
    else:
        win.blit(playerStand, (x, y))
    pygame.display.update()
 
 
while True:
    clock.tick(30)
    for e in pygame.event.get():
 
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and x > 5:
        x -= speed
        left = True
        right = False
 
    elif keys[pygame.K_RIGHT] and x < 500 - width - 5:
        x += speed
        left = False
        right = True
 
    else:
        left = False
        right = False
        animCount = 0
 
    if keys[pygame.K_ESCAPE]:
        pygame.quit()
        sys.exit()
 
    drawWindow()
Добавлено через 47 секунд
Жалуется на строку 56.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2018, 21:28
Ответы с готовыми решениями:

Как отключить стандартные функции кнопок мыши и клавиш клавиатуры с помощью питона?
Когда я создаю горячие клавиши (н-р, keyboard.add_hotkey('q+r', window)) или программирую нажатие...

Перемещение фигур матрицей преобразования
Здравствуйте, стоит такая задача: 1. Постройте декартову систему координат. 2. Постройте точку,...

По координатам точек определить в какой плоскости лежит фигура и что это за фигура
Вводятся координаты 4 точек надо определить в какой плоскости лежит фигура и что это за фигура

11
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
17.12.2018, 21:51
строки с 58 по 76 должны быть сдвинуты вправо
0
 Аватар для Raxxla
0 / 0 / 0
Регистрация: 09.12.2017
Сообщений: 28
17.12.2018, 22:01  [ТС]
Я так понял, что на 1-ну табуляцию ?

Добавлено через 3 минуты
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/python
# -*- coding: utf8 -*-
 
import pygame, sys
 
pygame.init()
win = pygame.display.set_mode((400, 400))
 
clock = pygame.time.Clock()
 
x = 50
y = 50
 
width = 35
height = 35
speed = 5
isJump = False
jumpCount = 10
animCount=0
left = False
right = False
 
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')
 
def drawWindow():
    global animCount
    win.blit((bg, 0, 0))
    if animCount + 1 >=30:
        animCount = 0
    if left:
        win.blit(walkLeft[animCount // 5], (x, y))
        animCount += 1
    elif right:
        win.blit(walkRight[animCount // 5], (x, y))
        animCount +=1
    else:
        win.blit(playerStand, (x, y))
    pygame.display.update()
 
 
while True:
    clock.tick(30)
        for e in pygame.event.get():
            keys = pygame.key.get_pressed()
            if keys[pygame.K_LEFT] and x > 5:
                x -= speed
                left = True
                right = False
 
            elif keys[pygame.K_RIGHT] and x < 500 - width - 5:
                x += speed
                left = False
                right = True
 
            else:
                left = False
                right = False
                animCount = 0
 
            if keys[pygame.K_ESCAPE]:
                pygame.quit()
                sys.exit()
 
    drawWindow()
Пока ничего не помогло, пытаюсь разобраться ...
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
17.12.2018, 22:03
Выложи весь проект с картинками
0
 Аватар для Raxxla
0 / 0 / 0
Регистрация: 09.12.2017
Сообщений: 28
17.12.2018, 22:29  [ТС]
Вот:
Вложения
Тип файла: zip Test2.zip (1.02 Мб, 18 просмотров)
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
18.12.2018, 10:56
Подправил немного чтобы запускалось

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import pygame, sys
 
pygame.init()
win = pygame.display.set_mode((400, 400))
 
clock = pygame.time.Clock()
 
x = 50
y = 50
 
width = 35
height = 35
speed = 5
isJump = False
jumpCount = 10
animCount=0
left = False
right = False
 
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')
 
def drawWindow():
    global animCount
    win.blit(bg,( 0, 0))
    if animCount + 1 >=30:
        animCount = 0
    if left:
        win.blit(walkLeft[animCount % 5], (x, y))
        animCount += 1
    elif right:
        win.blit(walkRight[animCount % 5], (x, y))
        animCount +=1
    else:
        win.blit(playerStand, (x, y))
    pygame.display.update()
 
 
while True:
    clock.tick(30)
    for e in pygame.event.get():
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            left = True
            right = False
 
        elif keys[pygame.K_RIGHT]:
            left = False
            right = True
 
        else:
            left = False
            right = False
            animCount = 0
 
        if keys[pygame.K_ESCAPE]:
            pygame.quit()
            sys.exit()
 
    if left  and x > 5:
        x -= speed
 
    if right  and x < 420 - width - 5:
         x += speed
 
    drawWindow()
0
 Аватар для Raxxla
0 / 0 / 0
Регистрация: 09.12.2017
Сообщений: 28
18.12.2018, 13:56  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/python
# -*- coding: utf8 -*-
 
import pygame, sys
 
pygame.init()
win = pygame.display.set_mode((400, 400))
 
clock = pygame.time.Clock()
 
x = 50
y = 50
 
width = 35
height = 35
speed = 5
isJump = False
jumpCount = 10
animCount = 0
left = False
right = False
 
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')
 
 
def drawWindow():
    global animCount
    win.blit(bg, (0, 0))
    if animCount + 1 >= 30:
        animCount = 0
    if left:
        win.blit(walkLeft[animCount % 5], (x, y))
        animCount += 1
    elif right:
        win.blit(walkRight[animCount % 5], (x, y))
        animCount += 1
    else:
        win.blit(playerStand, (x, y))
    pygame.display.update()
 
 
while True:
    clock.tick(30)
    for e in pygame.event.get():
        keys = pygame.key.get_pressed()
        if keys[pygame.K_RIGHT]:
            left = True
            right = False
 
        elif keys[pygame.K_LEFT]:
            left = False
            right = True
 
        else:
            left = False
            right = False
            animCount = 0
 
        if keys[pygame.K_ESCAPE]:
            pygame.quit()
            sys.exit()
 
    if left and x > 5:
        x += speed
 
    if right and x < 420 - width - 5:
        x -= speed
 
    drawWindow()
Исправил окончательно. Было перепутано управление.

Добавлено через 8 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/python
# -*- coding: utf8 -*-
 
import pygame, sys
 
pygame.init()
win = pygame.display.set_mode((400, 400))
 
clock = pygame.time.Clock()
 
x = 50
y = 50
 
width = 35
height = 35
speed = 5
isJump = False
jumpCount = 10
animCount = 0
left = False
right = False
 
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')
 
 
def drawWindow():
    global animCount
    win.blit(bg, (0, 0))
    if animCount + 1 >= 30:
        animCount = 0
    if left:
        win.blit(walkLeft[animCount % 5], (x, y))
        animCount += 1
    elif right:
        win.blit(walkRight[animCount % 5], (x, y))
        animCount += 1
    else:
        win.blit(playerStand, (x, y))
    pygame.display.update()
 
 
while True:
    clock.tick(30)
    for e in pygame.event.get():
        keys = pygame.key.get_pressed()
        if keys[pygame.K_RIGHT]:
            left = True
            right = False
 
        elif keys[pygame.K_LEFT]:
            left = False
            right = True
 
        else:
            left = False
            right = False
            animCount = 0
 
        if keys[pygame.K_ESCAPE]:
            pygame.quit()
            sys.exit()
 
    if left and x < 420 - width - 5:
        x += speed
 
    if right and x >5:
        x -= speed
 
    drawWindow()
Ещё сделал так, чтобы выполнялись условия ограничения, чтобы спрайт не убегал за пределы окна.
0
 Аватар для Raxxla
0 / 0 / 0
Регистрация: 09.12.2017
Сообщений: 28
05.05.2025, 20:33  [ТС]
Думаю, что буду делать на Embarcadero. Игра будет называться "Дональд Трамп и его Друзья". 2D-Platformer.
0
 Аватар для Raxxla
0 / 0 / 0
Регистрация: 09.12.2017
Сообщений: 28
04.11.2025, 06:48  [ТС]
Думаю, что пейзаж можно сделать Статический, а Динамически выводить только те объекты, которые участвуют в Игре, если их анимировать, т.е, допустим, Дональд на них как-то может влиять и прочее. Можно сделать вместе с Трампом ещё некоторых Персонажей.
0
Заблокирован
09.11.2025, 02:05
Цитата Сообщение от Raxxla Посмотреть сообщение
Думаю, что буду делать на Embarcadero.
Зайду через 7 лет.
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
09.11.2025, 13:52
Теперь фигурка бегать влево, вправо, вверх и вниз:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import pygame, sys
 
# Инициализация Pygame
pygame.init()
win = pygame.display.set_mode((400, 400))  # Окно размером 400х400 пикселей
 
clock = pygame.time.Clock()
 
# Начальные координаты игрока
x = 50
y = 50
 
# Размеры игрока
width = 35
height = 35
 
# Скорость перемещения
speed = 5
 
# Флаги направлений движения
up = False
down = False
left = False
right = False
 
# Загрузка изображений персонажей
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')  # Изображение стоящего персонажа
 
# Переменная анимации шагов
animCount = 0
 
 
def drawWindow():
    """Отрисовка окна"""
    global animCount
 
    # Обновляем фон экрана
    win.blit(bg, (0, 0))
 
    # Если персонаж движется направо
    if right:
        win.blit(walkRight[animCount // 6], (x, y))  # Используем анимацию шага
        animCount += 1
 
    # Если персонаж движется налево
    elif left:
        win.blit(walkLeft[animCount // 6], (x, y))   # Используем анимацию шага
        animCount += 1
 
    # Если персонаж неподвижен
    else:
        win.blit(playerStand, (x, y))               # Показываем статичное изображение
        animCount = 0
 
    # Ограничение числа кадров анимации
    if animCount >= len(walkRight)*6:
        animCount = 0
 
    # Обновление экрана
    pygame.display.update()
 
 
run = True
while run:
    clock.tick(30)  # Частота обновления экрана
 
    # Проверяем события клавиатуры
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
 
    # Получаем состояние нажатых клавиш
    keys = pygame.key.get_pressed()
 
    # Движение вправо
    if keys[pygame.K_RIGHT]:
        right = True
        left = False
        up = False
        down = False
        x += speed
 
    # Движение влево
    elif keys[pygame.K_LEFT]:
        right = False
        left = True
        up = False
        down = False
        x -= speed
 
    # Движение вверх
    elif keys[pygame.K_UP]:
        right = False
        left = False
        up = True
        down = False
        y -= speed
 
    # Движение вниз
    elif keys[pygame.K_DOWN]:
        right = False
        left = False
        up = False
        down = True
        y += speed
 
    # Остановка движений, если ни одна клавиша не нажата
    else:
        right = False
        left = False
        up = False
        down = False
 
    if keys[pygame.K_ESCAPE]:
            pygame.quit()
            sys.exit()
 
    # Проверка границ экрана, чтобы игрок не выходил за пределы окна
    if x < 5:
        x = 5
    elif x > 400 - width - 5:
        x = 400 - width - 5
    if y < 5:
        y = 5
    elif y > 400 - height - 5:
        y = 400 - height - 5
 
    # Отрисовываем окно
    drawWindow()
 
pygame.quit()
sys.exit()
Добавлено через 40 минут
Подскажите пожалуйста как исправить ошибку, чтобы он стрел спереди в направлении своего движения. А то у меня он стреляет спиной. Заранее благодарю:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import pygame, sys
 
# Инициализация Pygame
pygame.init()
win = pygame.display.set_mode((400, 400))  # Окно размером 400х400 пикселей
 
clock = pygame.time.Clock()
 
# Начальные координаты игрока
x = 50
y = 50
 
# Размеры игрока
width = 35
height = 35
 
# Скорость перемещения
speed = 5
 
# Список всех активных пуль
bullets = []
 
# Константа скорости полёта пуль
bullet_speed = 8
 
# Текущее направление движения
current_direction = None
 
# Загрузка изображений персонажей
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')  # Изображение стоящего персонажа
 
# Переменная анимации шагов
animCount = 0
 
# Функция рисования окна
def drawWindow():
    global animCount
 
    # Рисование фона
    win.blit(bg, (0, 0))
 
    # Анимация хода
    if current_direction == 'right':
        win.blit(walkRight[animCount // 6], (x, y))
        animCount += 1
    elif current_direction == 'left':
        win.blit(walkLeft[animCount // 6], (x, y))
        animCount += 1
    else:
        win.blit(playerStand, (x, y))
        animCount = 0
 
    # Управление анимацией
    if animCount >= len(walkRight)*6:
        animCount = 0
 
    # Рисование всех существующих пуль
    for bullet in bullets[:]:  # [:] создаёт копию списка, чтобы избежать ошибок удаления элементов внутри цикла
        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)  # Частота обновления экрана
 
    # Обрабатываем события клавиатуры
    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 current_direction == 'right':
                    bullets.append({'x': x+width, 'y': y+(height//2)-2, 'direction': 'right'})
                elif current_direction == 'left':
                    bullets.append({'x': x-width, 'y': y+(height//2)-2, 'direction': 'left'})
                elif current_direction == 'up':
                    bullets.append({'x': x+(width//2)-2, 'y': y-height, 'direction': 'up'})
                elif current_direction == 'down':
                    bullets.append({'x': x+(width//2)-2, 'y': y+height, 'direction': 'down'})
 
    # Получаем состояние нажатых клавиш
    keys = pygame.key.get_pressed()
 
    # Движение игрока
    if keys[pygame.K_RIGHT]:
        current_direction = 'right'
        x += speed
    elif keys[pygame.K_LEFT]:
        current_direction = 'left'
        x -= speed
    elif keys[pygame.K_UP]:
        current_direction = 'up'
        y -= speed
    elif keys[pygame.K_DOWN]:
        current_direction = 'down'
        y += speed
 
    # Проверка границ экрана, чтобы игрок не выходил за пределы окна
    if x < 5:
        x = 5
    elif x > 400 - width - 5:
        x = 400 - width - 5
    if y < 5:
        y = 5
    elif y > 400 - height - 5:
        y = 400 - height - 5
 
    # Обновляем окно
    drawWindow()
 
pygame.quit()
sys.exit()
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
10.11.2025, 16:13
При движении вправо фигура стреляет спиной. Подскажите пожалуйста как исправить????
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.11.2025, 16:13
Помогаю со студенческими работами здесь

Точка попадает в фигуру, но пишет, что "точка не попала в фигуру"
import matplotlib.pyplot as plt import numpy as np def task4(): x = float(input('Введите...

Вычислите площадь фигуры, ограниченную заданными линиями, с помощью двойного интеграла
Здравствуйте, помогите пожалуйста Вычислите площадь фигуры, ограниченную заданными линиями, с...

Управление ИБП через порт с помощью модуля serial
Здравствуйте! У меня есть бесперебойник я нашёл команды через которые можно с ним общаться,...

Управление генератором SI5153 c помощью платы Raspberry Pi Pico
Есть такой код на Python, который должен задавать частоту генератора, но всё работает абсолютно...

Постоянное перемещение персонажа из одного угла экрана в другой (pygame)
import pygame window=pygame.display.set_mode((400,400)) pygame.display.set_caption('hello py...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru