Я пытаюсь сделать игру в тетрис, и ниже приведен мой код для перемещения блоков. Я хочу, чтобы блок продолжал двигаться, когда нажата клавиша со стрелкой, и остановился, когда он отпущен. Но когда я запускаю код, он останавливает блок, даже если ключ не отпущен.
def set_keyboard_dirs(cur_block, width, height, events): # events stores pygame.event.get() as I use it multiple times in my code
global move_timer # only moves block one time per set number of frames
cur_block.reset_collisions(height)
for event in events:
if event.type == pygame.KEYDOWN: # sets magnitude and direction of movement
if event.key == pygame.K_RIGHT:
cur_block.dir = (cur_block.length, 0)
elif event.key == pygame.K_LEFT:
cur_block.dir = (-cur_block.length, 0)
elif event.key == pygame.K_DOWN:
cur_block.dir = (0, cur_block.length)
elif event.key == pygame.K_UP:
cur_block.rotate(height, width)
elif event.key == pygame.K_SPACE: # just moves the block instantly to the bottom of the screen by equating it to a 'projection' already there.
cur_block.shape = deepcopy(cur_block.projection)
elif event.type == pygame.KEYUP: # stops block from moving
print(event.key) # I called this to see what's happening, and event.key is printed event when I didn't release the key.
cur_block.dir = (0, 0)
cur_block.move()
Из-за вышеизложенного блок перемещается по одному шагу за раз, а не непрерывно (до тех пор, пока они его удерживают), как я хочу. Как я могу это исправить, пожалуйста? Остальная часть игры работает, поэтому я очень хочу, чтобы это тоже сработало. Заранее большое спасибо.
РЕДАКТИРОВАТЬ: Я также пытался установить элементы управления с помощью pygame.key.get_pressed () следующим образом:
def set_keyboard_dirs(cur_block, width, height):
global move_timer, keys
cur_block.reset_collisions(height)
cur_block.dir = (0, 0)
if keys[pygame.K_UP] or keys[pygame.K_w]:
cur_block.rotate(height, width)
elif keys[pygame.K_SPACE]:
cur_block.shape = deepcopy(cur_block.projection)
elif (keys[pygame.K_DOWN] or keys[pygame.K_s]) and 2 not in cur_block.collisions: # 1, 2, 3 are collisions in left, down and right directions
cur_block.dir = (0, cur_block.length)
elif (keys[pygame.K_RIGHT] or keys[pygame.K_d]) and 1 not in cur_block.collisions:
cur_block.dir = (cur_block.length, 0)
elif (keys[pygame.K_LEFT] or keys[pygame.K_a]) and 3 not in cur_block.collisions:
cur_block.dir = (-cur_block.length, 0)
else:
print('ran reset') # this statement print even as i'm holding down a key for some reason
cur_block.dir = (0, 0)
if cur_block.dir != (0, 0) and move_timer == 0:
cur_block.move()
move_timer = 7
в первом случае, если я удаляю KEYUP событие и в последнем случае, если я удаляю оператор else, блок перемещается непрерывно (но не может остановиться), что также показывает, что именно эти операторы являются причиной проблемы, я думаю. И это единственное место, где находится мой код, где я также определяю свой cur_block.dir.