Здравствуйте, мне бы хотелось сказать несколько слов о вашем курсе по "Pygame" 1) Искренне вас благодарю за его создание. Этот курс мне помог подтянуть мои знания в языке программирования "Python", а также облегчил изучение модуля. 2) 2-ой способ обработки событий, который вы показали, кроме того, что легче, так ещё не забагованый (В 1-ом случае имеются проблемы с управлением. Они заметнее всего в Bullethell'ax)
0:18 модуль отвечающий за обработку событий 0:25 метод get() 0:32 событие, объект Event 0:40 свойство type 1:00 клавиша нажата, клавиша отпущена, KEYDOWN, KEYUP 1:28 пример 2:32 KEYDOWN в коде, событие клавиша нажата 2:48 определяем какая клавиша нажата 3:49 как работает пример 4:02 не реагирует на длительное зажатие клавиши 4:33 причина 5:08 делаем перемещение прямоугольника при зажатой клавиши, вариант 1 6:43 как работает вариант 1 7:07 вариант 2, теория 8:15 удаляем старый код 8:25 варианта 2, код 8:58 как работает вариант 2 9:12 что делает get_pressed() 9:31 ctrl + стрелка не работает в get_pressed 9:46 причина 9:54 отслеживаем нажатие клавиш модификаторов (shift, ctrl, alt) 11:34 как работает перемещение с ctrl
как всегда лучшая обучалка,(я делаю коменты чтобы дополнить автора потому что мне его обучалки очень нравятся) есть небольшая разница первого и второго варианта в 1 варианте проверяется отпускание любой из клавиш, то есть если держим лево и нажали в право и за 1/60 секунды не успели отпустить лево то квадратик встанет хотя кнопка в право нажата, условия ступора отпускание любой из клавиш, исправление бага это прописать отпускания отдельно, во 2 варианте проверка нажатой клавиши через elif а значит 1 условие не даст второму никогда свершиться, то есть если нажали лево то пойдем в лево даже если нажали еще и в право, а если отпустили влево и при этом нажата вправо то пойдем в право, то есть при одновременно нажатых клавишах приоритет будет первое условие, исправление бага elif заменить на if тогда при обеих нажатых клавишах кубик встанет так как x прибавит и вычтет до отрисовки, сответственно при быстром нажатии лево право движение будет корректным.
Если ктото захочет сделать зажатие клавиши более большим способом (я думаю такие люди есть) то у этого кода что в видео есть маленький недочет. когда ты нажмешь одну клавишу (К_a), а затем не отпуская нажмешь другую (К_d) и отпустишь первую (К_a) твой персонаж никуда не пойдет. это повлияет на ощущение и управление будет непривычным. чтобы это изменить достаточно эту команду: elif event.type == pg.KEYUP: if event.key in [pg.K_a, pg.K_d]: fleft = fright = False поменять на эту: elif event.type == pg.KEYUP: if event.key == pg.K_a: fleft = False if event.key == pg. K_d: fright = False
Привет. Спасибо большое за урок, все круто, но только с левым контрол не работает, как по видео Я прописал вот так: if event.key == pygame.K_LEFT and event.mod == 4160: но не пойму в чем разница, и почему нужно писать именно 4160?
@@selfedu_rus , у меня win 11 стоит, наверно поэтому. Только я не совсем понимаю, откуда взялись именно такие цифры, обозначающие клавишу ctrl, саму цифру увидел в комментариях
Попробовал написать пример программы, которая использует ctrl, но она не работала. Оказалось, если отнять от event.mod число 4096 и получившееся выражение сравнить с KMOD_LCTRL, то всё работает. Тоже самое и с Shift. В чём дело?
О, круто! Спасибо за найденное решение. По всей видимости код из библиотеки KMOD_LCTRL не всегда совпадает со значением event.mod. Ещё можно event.mod делить с получением остатка на 4096: event.mod % 4096 Зависит наверное от операционной системы. Хотя может быть тут дело в версии pygame или python.
возможно (весьма возможно), что дело в том, как пайтон обращается к памяти компьютера и какие значения используются для обработки клавиш. Но я это так - просто пукнул невежеством.
Что если никакой вариант кода не работает? Это может быть связано с тем что выше кода движения у меня прописано добавление как спрайта картинку .png? У меня Linux Mint 19.4, IDEL , Python 3.6. Спрайт отрисованнный просто стоит, а ошибок не выдает.
было очень неудобно в такой системе координат решил переопределить)) def rect(color, coords_xy, size_xy, width = 0): pygame.draw.rect(SURFACE, color, ((coords_xy[0], height - coords_xy[1]- size_xy[1]), (size_xy)), width)
import pygame import sys #все нужные переменные x = 200 y = 200 speed = 5 WIDTH = 500 HEIGHT = 500 FPS = 30 stena = True right = False left = False up = False down = False WHITE = (255,255,255) YELLOW = (255,255,0) BLACK = (0,0,0) RED = (255,0,0) GREEN = (0,255,0) BLUE = (0,0,255) BERUZA = (0,255,255) PURPUR = (255,0,255) nada = YELLOW #все нужные переменные pygame.mixer.init() pygame.init() screen = pygame.display.set_mode((WIDTH,HEIGHT)) def xz(): global x global y global nada t = pygame.Rect(x,y,20,20) pygame.draw.rect(screen,(nada),t,0) if x > WIDTH: x = WIDTH - WIDTH nada = WHITE if x < WIDTH - WIDTH: x = WIDTH nada = GREEN if y > HEIGHT: y = HEIGHT - HEIGHT nada = BLUE if y < HEIGHT - HEIGHT: y = HEIGHT nada = PURPUR pygame.display.set_caption("пишите что угодно") clock = pygame.time.Clock() run = True while run: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() run = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_w: up = True if event.key == pygame.K_s: down = True if event.key == pygame.K_a: left = True if event.key == pygame.K_d: right = True if event.type == pygame.KEYUP: if event.key == pygame.K_w: up = False if event.key == pygame.K_s: down = False if event.key == pygame.K_a: left = False if event.key == pygame.K_d: right = False if stena == True: if up == True: y = y - speed if down == True: y = y + speed if left == True: x = x - speed if right == True: x = x + speed screen.fill(BERUZA) xz()
pygame.display.flip() pygame.quit() Это чисто мой код, если хотите то пользуйтесь.
спасибо, у меня не работала часть с движением и я использовала сначало 3 кода из видео - ничего а потом твой код, но сработала только часть с закрытием окна. У меня там спрайт в виде png но он просто не двигаеться даже ошибок не выдает. Может поможете? Если что у меня Linux Mint 19.4 пишу в IDEL на Python 3.6
ты еще не видел настоящий код игры, где нужно entity manager, abstract game object, rooms system, animation manager... particle system да че уж там, пацан не может присвоить координат y
Подскажите пожалуйста, с чем может быть связано: константа pygame.KMOD_LCTRL равна 128, но у меня на компе левый контрол определяется как 4160, и конечно код не срабатывает, если не написать: event.mod == 4160
можно не использовать флаги и pygame.KYEUP если if запихнуть не в цикл for, а за него, тогда кубик будет идти вправо или влево де тех пор пока ты не отпустишь
но в цикле for проверяется очередь всех событий в pg.event.get(), и мы отслеживаем изменение событий. Судя по всему, ваш вариант предлагает бесконечное движение без возможности остановиться
вместо elif поставь if import pygame #импортируем библиотеку flLeft = flRight = flUp = flDown = False pi = 3,14 RED = (255, 0, 0) #обьявим цвет BLUE = (0, 0, 255) GREEN = (0, 255, 0) WHITE = (255, 255, 255) W = 500 H = 500 x = W // 2 y = H // 2 speed = 5 pygame.init() #область = pygame.Дисплей.размер ((ширина, высота), pygame.Тип окна) sc = pygame.display.set_mode((W, H), pygame.RESIZABLE) pygame.display.set_caption("Жабы вперёд!") # ставим название clock = pygame.time.Clock() FPS = 60 while 1: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: flLeft = True if event.key == pygame.K_RIGHT: flRight = True if event.key == pygame.K_UP: flUp = True if event.key == pygame.K_DOWN: flDown = True if event.type == pygame.KEYUP: if event.key in [pygame.K_LEFT, pygame.K_RIGHT, pygame.K_UP, pygame.K_DOWN]: flLeft = flRight = flUp = flDown = False if flLeft: x -= speed if flRight: x += speed if flUp: y -= speed if flDown: y += speed sc.fill(WHITE) # цвет области на белый pygame.draw.rect(sc, 'black', (x, y, 10, 20)) pygame.display.update() clock.tick(FPS)
спасибо за курс, но у меня квадрат оставляет следы(( что делать? вот код: import pygame pygame.init() W = 640 H = 400 screen = pygame.display.set_mode((W, H)) clock = pygame.time.Clock() x = W // 2 y = H // 2 l = r = False speed = 1 while True: for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: l = True if event.key == pygame.K_RIGHT: r = True elif event.type == pygame.KEYUP: if event.key in [pygame.K_LEFT, pygame.K_RIGHT]: l = r = False if l: x -= speed elif r: x += speed pygame.draw.rect(screen, (255, 255, 0), (x, y, 10, 20)) pygame.display.update() clock.tick(60)
Спасибо за такой замечательный курс! Даже знаний этих трех уроков мне хватило для создания простой 3D игры на технологии ray casting!
Автору респект и восхищение. Великолепная подача материала.
Здравствуйте, мне бы хотелось сказать несколько слов о вашем курсе по "Pygame"
1) Искренне вас благодарю за его создание. Этот курс мне помог подтянуть мои знания в языке программирования "Python", а также облегчил изучение модуля.
2) 2-ой способ обработки событий, который вы показали, кроме того, что легче, так ещё не забагованый (В 1-ом случае имеются проблемы с управлением. Они заметнее всего в Bullethell'ax)
ну и как успехи?
0:18 модуль отвечающий за обработку событий
0:25 метод get()
0:32 событие, объект Event
0:40 свойство type
1:00 клавиша нажата, клавиша отпущена, KEYDOWN, KEYUP
1:28 пример
2:32 KEYDOWN в коде, событие клавиша нажата
2:48 определяем какая клавиша нажата
3:49 как работает пример
4:02 не реагирует на длительное зажатие клавиши
4:33 причина
5:08 делаем перемещение прямоугольника при зажатой клавиши, вариант 1
6:43 как работает вариант 1
7:07 вариант 2, теория
8:15 удаляем старый код
8:25 варианта 2, код
8:58 как работает вариант 2
9:12 что делает get_pressed()
9:31 ctrl + стрелка не работает в get_pressed
9:46 причина
9:54 отслеживаем нажатие клавиш модификаторов (shift, ctrl, alt)
11:34 как работает перемещение с ctrl
в видео есть тайм-коды, нахера сюда добавлять?
@@grovestreet2126на момент написания комента тайм кода не было
Это действительно лучший канал с видеоуроками из всех, которые я видел. Спасибо большое за то, что делаете!
Лучший гайдлайн библиотеки на русском. Красавчик :D
как всегда лучшая обучалка,(я делаю коменты чтобы дополнить автора потому что мне его обучалки очень нравятся)
есть небольшая разница первого и второго варианта
в 1 варианте проверяется отпускание любой из клавиш, то есть если держим лево и нажали в право и за 1/60 секунды не успели отпустить лево то квадратик встанет хотя кнопка в право нажата, условия ступора отпускание любой из клавиш, исправление бага это прописать отпускания отдельно,
во 2 варианте проверка нажатой клавиши через elif а значит 1 условие не даст второму никогда свершиться, то есть если нажали лево то пойдем в лево даже если нажали еще и в право, а если отпустили влево и при этом нажата вправо то пойдем в право,
то есть при одновременно нажатых клавишах приоритет будет первое условие,
исправление бага elif заменить на if тогда при обеих нажатых клавишах кубик встанет так как x прибавит и вычтет до отрисовки,
сответственно при быстром нажатии лево право движение будет корректным.
Если ктото захочет сделать зажатие клавиши более большим способом (я думаю такие люди есть) то у этого кода что в видео есть маленький недочет. когда ты нажмешь одну клавишу (К_a), а затем не отпуская нажмешь другую (К_d) и отпустишь первую (К_a) твой персонаж никуда не пойдет. это повлияет на ощущение и управление будет непривычным. чтобы это изменить достаточно эту команду:
elif event.type == pg.KEYUP:
if event.key in [pg.K_a, pg.K_d]:
fleft = fright = False
поменять на эту:
elif event.type == pg.KEYUP:
if event.key == pg.K_a:
fleft = False
if event.key == pg. K_d:
fright = False
Чел, спасибо.
Довольно доступно и понятно. Очень жду следующие видео!
3:52 Не работает. Прямоугольник не двигается.Зделал все как надо. Но нет.
Подтверждаю что это лучший урок на русском о pygame😌👍 огромное спасибо
Круто объясняешь
Спасибо за урок!
У меня игровой персонаж вообще не перемещается, не реагирует на нажатие клавиш.
Проблему свою, кстати, я решил.
@@АлексейИркутский-к8инапиши подробнее пожалуйста.
Спасибо, очень помогло
Супер! Спасибо!
спасибо за занятие)
Привет. Спасибо большое за урок, все круто, но только с левым контрол не работает, как по видео
Я прописал вот так: if event.key == pygame.K_LEFT and event.mod == 4160:
но не пойму в чем разница, и почему нужно писать именно 4160?
да, не только у вас так, может или особенности ОС (у меня Windows 10) или версия поменялась
@@selfedu_rus , у меня win 11 стоит, наверно поэтому. Только я не совсем понимаю, откуда взялись именно такие цифры, обозначающие клавишу ctrl, саму цифру увидел в комментариях
Извините, вы так и не разобрались откуда взять данные цифры? я ничего нагуглить не могу по кодам клавиш в виндовс
@@IPyatnickiy , только так, как прописал в комменте, больше ничего не гуглил
крутой гайд
У меня произошло что то странное почему то при перемещении прямоугольника он оставляет за собой "след" превращаясь в полосу на экране
Попробовал написать пример программы, которая использует ctrl, но она не работала. Оказалось, если отнять от event.mod число 4096 и получившееся выражение сравнить с KMOD_LCTRL, то всё работает. Тоже самое и с Shift. В чём дело?
О, круто! Спасибо за найденное решение. По всей видимости код из библиотеки KMOD_LCTRL не всегда совпадает со значением event.mod.
Ещё можно event.mod делить с получением остатка на 4096: event.mod % 4096
Зависит наверное от операционной системы. Хотя может быть тут дело в версии pygame или python.
лучший спасибо
Странно, что управляющие кнопки не включают в кортеж. Почему так, интересно... Насколько проще было бы все.
возможно (весьма возможно), что дело в том, как пайтон обращается к памяти компьютера и какие значения используются для обработки клавиш. Но я это так - просто пукнул невежеством.
Спасибо большое
Что если никакой вариант кода не работает? Это может быть связано с тем что выше кода движения у меня прописано добавление как спрайта картинку .png? У меня Linux Mint 19.4, IDEL , Python 3.6. Спрайт отрисованнный просто стоит, а ошибок не выдает.
было очень неудобно в такой системе координат решил переопределить))
def rect(color, coords_xy, size_xy, width = 0):
pygame.draw.rect(SURFACE, color, ((coords_xy[0], height - coords_xy[1]- size_xy[1]), (size_xy)), width)
спасибо помог.
Здравствуйте! Я ввел всё как показано на видео, но на деле просто черный экран... Что делать?
установил модуль pygame?
import pygame
import sys
#все нужные переменные
x = 200
y = 200
speed = 5
WIDTH = 500
HEIGHT = 500
FPS = 30
stena = True
right = False
left = False
up = False
down = False
WHITE = (255,255,255)
YELLOW = (255,255,0)
BLACK = (0,0,0)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
BERUZA = (0,255,255)
PURPUR = (255,0,255)
nada = YELLOW
#все нужные переменные
pygame.mixer.init()
pygame.init()
screen = pygame.display.set_mode((WIDTH,HEIGHT))
def xz():
global x
global y
global nada
t = pygame.Rect(x,y,20,20)
pygame.draw.rect(screen,(nada),t,0)
if x > WIDTH:
x = WIDTH - WIDTH
nada = WHITE
if x < WIDTH - WIDTH:
x = WIDTH
nada = GREEN
if y > HEIGHT:
y = HEIGHT - HEIGHT
nada = BLUE
if y < HEIGHT - HEIGHT:
y = HEIGHT
nada = PURPUR
pygame.display.set_caption("пишите что угодно")
clock = pygame.time.Clock()
run = True
while run:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
run = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_w:
up = True
if event.key == pygame.K_s:
down = True
if event.key == pygame.K_a:
left = True
if event.key == pygame.K_d:
right = True
if event.type == pygame.KEYUP:
if event.key == pygame.K_w:
up = False
if event.key == pygame.K_s:
down = False
if event.key == pygame.K_a:
left = False
if event.key == pygame.K_d:
right = False
if stena == True:
if up == True:
y = y - speed
if down == True:
y = y + speed
if left == True:
x = x - speed
if right == True:
x = x + speed
screen.fill(BERUZA)
xz()
pygame.display.flip()
pygame.quit()
Это чисто мой код, если хотите то пользуйтесь.
спасибо, у меня не работала часть с движением и я использовала сначало 3 кода из видео - ничего а потом твой код, но сработала только часть с закрытием окна. У меня там спрайт в виде png но он просто не двигаеться даже ошибок не выдает. Может поможете? Если что у меня Linux Mint 19.4 пишу в IDEL на Python 3.6
Передвижение работает квадрат ннарисован но заним идет след что делать
Странно, у меня не работает с клавишей LCtrl
мне сложно сказать почему, попробуйте продебажить этот момент, посмотрите из-за чего именно не срабатывает
У меня тоже не работает.
@@ОлегТруе , if event.key == pygame.K_LEFT and event.mod == 4160:
if event.key == pygame.K_LEFT and event.mod == 4160:
@@buga-buga2141 спасибо, попробую
Спасибо за уроки. Кто ни-будь, скажите(дайте ссылку), как нормализовать движение по диагонали?
А
x = W // 2
y = H // 2
...
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and keys[pygame.K_DOWN]:
x -= speed
y += speed
...
Не получается?
ты серьезно не можешь это ебучий квадратик поднять вверхъ?
ты еще не видел настоящий код игры, где нужно entity manager, abstract game object, rooms system, animation manager... particle system да че уж там, пацан не может присвоить координат y
Сделал через LCtrl именно так(Знак амперсанта важен! - &(шифт + 7)):
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
if pygame.key.get_mods() & pygame.KMOD_LCTRL:
move -= speed
elif event.key == pygame.K_RIGHT:
if pygame.key.get_mods() & pygame.KMOD_LCTRL:
move += speed
Кто знает, почему у меня прямоугольник не двигается, а дублируется на новые координаты
нужно прошлый прямоугольник стирать
@@magnum_fennec я уже разобрался, но всё равно спасибо)
@@kerill7108 :)
Подскажите пожалуйста, с чем может быть связано: константа pygame.KMOD_LCTRL равна 128, но у меня на компе левый контрол определяется как 4160, и конечно код не срабатывает, если не написать: event.mod == 4160
По названию - это левый Ctrl
@@selfedu_rus По названию, да. Но коды клавишь не совпадают почему-то. Другие клавиши-модификаторы не смотрел.
@@freeengineering4120 да, это вопрос...
можно не использовать флаги и pygame.KYEUP если if запихнуть не в цикл for, а за него, тогда кубик будет идти вправо или влево де тех пор пока ты не отпустишь
но в цикле for проверяется очередь всех событий в pg.event.get(), и мы отслеживаем изменение событий. Судя по всему, ваш вариант предлагает бесконечное движение без возможности остановиться
Ну не знаю, для меня все эти проверки контр интуитивные.
Я ввёл как показано, никакого синего квадрата, и модуль пайгейм у меня есть.
удались, лолка, все работает
ты флипнул или апдейтнул экран? display.update()
Что делать если всегда экран черный помогите пожалуйста
ты флипнул или апдейтнул экран? display.update()
сделал все как в видео но не работает
возможно, из-за изменений версий
вместо elif поставь if
import pygame #импортируем библиотеку
flLeft = flRight = flUp = flDown = False
pi = 3,14
RED = (255, 0, 0) #обьявим цвет
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
WHITE = (255, 255, 255)
W = 500
H = 500
x = W // 2
y = H // 2
speed = 5
pygame.init()
#область = pygame.Дисплей.размер ((ширина, высота), pygame.Тип окна)
sc = pygame.display.set_mode((W, H), pygame.RESIZABLE)
pygame.display.set_caption("Жабы вперёд!") # ставим название
clock = pygame.time.Clock()
FPS = 60
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
flLeft = True
if event.key == pygame.K_RIGHT:
flRight = True
if event.key == pygame.K_UP:
flUp = True
if event.key == pygame.K_DOWN:
flDown = True
if event.type == pygame.KEYUP:
if event.key in [pygame.K_LEFT, pygame.K_RIGHT, pygame.K_UP, pygame.K_DOWN]:
flLeft = flRight = flUp = flDown = False
if flLeft:
x -= speed
if flRight:
x += speed
if flUp:
y -= speed
if flDown:
y += speed
sc.fill(WHITE) # цвет области на белый
pygame.draw.rect(sc, 'black', (x, y, 10, 20))
pygame.display.update()
clock.tick(FPS)
Найс. Го некст.
очень бесит, что ты просто вставляешь код из-за чего я не могу правильно написать его
лее че за курсор такой
Я странно воспринимаю твой голос
скреч на максимум
у меня почему то при использовании pygame.key.get_pressed() прямоугольник двигается только при нажатии на клавишу, но не при удерживании
спасибо за курс, но у меня квадрат оставляет следы(( что делать?
вот код:
import pygame
pygame.init()
W = 640
H = 400
screen = pygame.display.set_mode((W, H))
clock = pygame.time.Clock()
x = W // 2
y = H // 2
l = r = False
speed = 1
while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
l = True
if event.key == pygame.K_RIGHT:
r = True
elif event.type == pygame.KEYUP:
if event.key in [pygame.K_LEFT, pygame.K_RIGHT]:
l = r = False
if l:
x -= speed
elif r:
x += speed
pygame.draw.rect(screen, (255, 255, 0), (x, y, 10, 20))
pygame.display.update()
clock.tick(60)
тут надо удалить предыдущий квадрат, тут это делается заливкой экрана sc.fill(ргб или переменная ргб)
а не проще было использовать pygame.quit()
можно )
спасибо большое