Форум программистов, компьютерный форум, киберфорум
Python: PyGame
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
1 / 0 / 1
Регистрация: 23.11.2019
Сообщений: 31

Реагирование спрайта на клавиши движения

26.12.2019, 21:23. Показов 6530. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Когда я нажимаю влево, включается спрайт танка смотрящего влево.
Когда я нажимаю вправо, включается спрайт танка смотрящего вправо, и т.д. соответственно, пока нажимается одновременно только одна клавиша движения, но если я зажму например вперёд+вправо, то спрайт танка смотрящего вперёд поедет вверх вправо по диагонали, но мне это не нужно.
Как сделать, чтобы спрайт отзывался только на одну клавишу движения одновременно? Или как сделать так, чтобы спрайт мог двигаться только по горизонтали и по вертикали?
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
import pygame as py
import random
import os
 
game_folder = os.path.dirname(__file__)
pictures_folder = os.path.join(game_folder, 'pictures')
player_up = py.image.load(os.path.join(pictures_folder, 'tank1_up.png'))
player_down = py.image.load(os.path.join(pictures_folder, 'tank1_down.png'))
player_left = py.image.load(os.path.join(pictures_folder, 'tank1_left.png'))
player_right = py.image.load(os.path.join(pictures_folder, 'tank1_right.png'))
 
WIDTH = 800
HEIGHT = 650
FPS = 60
 
WHITE = (255, 255, 255)
BLACK = (0,0,0)
RED = (255,0,0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
GREY = (33, 33, 33)
YELLOW = (255, 255, 0)
 
class Player(py.sprite.Sprite):
    def __init__(self):
        py.sprite.Sprite.__init__(self)
        self.image = player_up
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 10
        self.speedx = 0
        self.speedy = 0
 
    def update(self):
        self.speedx = 0
        self.speedy = 0
        keystate = py.key.get_pressed()
        if keystate[py.K_a]:
            self.speedx = -3
            self.image = player_left
        if keystate[py.K_d]:
            self.speedx = 3
            self.image = player_right
        self.rect.x += self.speedx
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0
        if keystate[py.K_w]:
            self.speedy = -2
            self.image = player_up
        if keystate[py.K_s]:
            self.speedy = 2
            self.image = player_down
        self.rect.y += self.speedy
        if self.rect.y > HEIGHT-50:
            self.rect.y = HEIGHT-50
        if self.rect.y < 0:
            self.rect.y = 0
 
 
py.init()
py.mixer.init()
screen = py.display.set_mode((WIDTH,HEIGHT))
py.display.set_caption("My First Game")
clock = py.time.Clock()
 
all_sprites = py.sprite.Group()
player = Player()
all_sprites.add(player)
 
running = True
while running:
    clock.tick(FPS)
    for event in py.event.get():
        if event.type == py.QUIT:
            running = False
 
    #Обновление спрайтов
    all_sprites.update()
 
    #Рендеринг
    screen.fill(GREY)
    # Рисуем спрайты
    all_sprites.draw(screen)
    #ПОВОРОТ ЭКРАНА
    py.display.flip()
py.quit()
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.12.2019, 21:23
Ответы с готовыми решениями:

Убрать реагирование кнопки по нажатию клавиши Enter
почему это не работает? private void button1_KeyPress(object sender, KeyPressEventArgs e) { e.Handled =...

Код движения спрайта
напижите код на C# каторыи позваляет 2D спраиту двигатся права и в лева

Поворот спрайта в сторону движения
В общем нужно чтоб спрайт поворачивался в сторону движения, по сути легко, но я новичок и не понимаю как это сделать... Помогите...

2
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
26.12.2019, 23:20
Цитата Сообщение от Tsunami_921 Посмотреть сообщение
чтобы спрайт отзывался только на одну клавишу движения одновременно?
Попробуйте вместо if elif
0
1 / 0 / 1
Регистрация: 23.11.2019
Сообщений: 31
27.12.2019, 11:20  [ТС]
Цитата Сообщение от tooru Посмотреть сообщение
Попробуйте вместо if elif
Так?
Нет, не получается...
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
def update(self):
        self.speedx = 0
        self.speedy = 0
        keystate = py.key.get_pressed()
        if keystate[py.K_a]:
            self.speedx = -3
            self.image = player_left
        elif keystate[py.K_d]:
            self.speedx = 3
            self.image = player_right
        self.rect.x += self.speedx
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0
        elif keystate[py.K_w]:
            self.speedy = -3
            self.image = player_up
        elif keystate[py.K_s]:
            self.speedy = 3
            self.image = player_down
        self.rect.y += self.speedy
        if self.rect.y > HEIGHT-50:
            self.rect.y = HEIGHT-50
        if self.rect.y < 0:
            self.rect.y = 0
Добавлено через 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
            def update(self):
        self.speedx = 0
        self.speedy = 0
        keystate = py.key.get_pressed()
        if __name__ == "__main__":
            if keystate[py.K_a]:
                self.speedx = -3
                self.image = player_left
            elif keystate[py.K_d]:
                self.speedx = 3
                self.image = player_right
            elif keystate[py.K_w]:
                self.speedy = -3
                self.image = player_up
            elif keystate[py.K_s]:
                self.speedy = 3
                self.image = player_down
        if self.rect.y > HEIGHT-50:
            self.rect.y = HEIGHT-50
        if self.rect.y < 0:
            self.rect.y = 0
        self.rect.y += self.speedy
        self.rect.x += self.speedx
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.12.2019, 11:20
Помогаю со студенческими работами здесь

Задать условие для движения спрайта
Здраствуйте, помогите пожалуйста, как сделать так что бы спрайты 1 и 2 не могли пересекать и находится на черных клетках. #include...

Python, Pygame, артефакты при движения спрайта по экрану
Здравствуйте, не так давно начал изучать питон, вместе с ним и pygame. Несколько дней назад получилось хоть что то дельное, научился...

Расчет вектора движения и вращения спрайта в зависимости от контроллера
Создал контроллер (рис1) Это отдельный класс. вот он using System; using System.Collections.Generic; using System.Linq; using...

Реализовать поворот спрайта по направлению нажатия клавиши
Здравствуйте. Как реализовать поворот спрайта по направлению нажатия клавиши?

реализация движения фигуры (Shape) по нажатию клавиши
Подскажите пожалуйста, как в PascalABC реализовать движение фигуры (Shape) на форме (Form1) по нажатию управляющих клавиш. Реализовал это...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru