Solving problem is about exposing yourself to as many situations as possible like How can I make a sprite move when key is held down [duplicate] and practice these strategies over and over. With time, it becomes second nature and a natural way you approach any problems in general. Big or small, always start with a plan, use other strategies mentioned here till you are confident and ready to code the solution.
In this post, my aim is to share an overview the topic about How can I make a sprite move when key is held down [duplicate], which can be followed any time. Take easy to follow this discuss.
Currently the sprite only moves 1 pixel every time a key is pressed. How could I cause the plumber sprite to move constantly when left or right key is being held down?
while running: setup_background() spriteimg = plumberright screen.blit(spriteimg,(x1, y1)) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: x1 = x1 + 0 y1 = y1 - 1 elif event.key == pygame.K_DOWN: x1 = x1 + 0 y1 = y1 + 1 elif event.key == pygame.K_LEFT: x1 = x1 -1 y1 = y1 + 0 elif event.key == pygame.K_RIGHT: x1 = x1 + 1 y1 = y1 + 0 pygame.display.flip() clock.tick(120)
You can use pygame.key.get_pressed to do that.
while running: keys = pygame.key.get_pressed() #checking pressed keys if keys[pygame.K_UP]: y1 -= 1 if keys[pygame.K_DOWN]: y1 += 1
Use this mate, it’ll work well, put it in your for loop.
if event.type == pygame.KEYDOWN: if event.key == pygame.K_a: playerX_change = -0.1 if event.key == pygame.K_d: playerX_change = 0.1 if event.type == pygame.KEYUP: if event.key == pygame.K_a or event.key == pygame.K_d: playerX_change = 0 playerX += playerX_change player(playerX, playerY) pygame.display.update()
The keyboard events (see pygame.event module) occur only once when the state of a key changes. The
KEYDOWN event occurs once every time a key is pressed.
KEYUP occurs once every time a key is released. Use the keyboard events for a single action or a step-by-step movement.
If you want to achieve a continuously movement, you have to use
pygame.key.get_pressed() returns a list with the state of each key. If a key is held down, the state for the key is
pygame.key.get_pressed() to evaluate the current state of a button and get continuous movement:
while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False keys = pygame.key.get_pressed() x1 += keys[pygame.K_RIGHT] - keys[pygame.K_LEFT] y1 += keys[pygame.K_DOWN] - keys[pygame.K_UP] x1 = x1 % window.get_width() y1 = y1 % window.get_height() setup_background() spriteimg = plumberright screen.blit(spriteimg, (x1, y1)) pygame.display.flip() clock.tick(120)
See also Key and Keyboard event
Minimal example: repl.it/@Rabbid76/PyGame-ContinuousMovement
import pygame pygame.init() window = pygame.display.set_mode((300, 300)) clock = pygame.time.Clock() rect = pygame.Rect(0, 0, 20, 20) rect.center = window.get_rect().center vel = 5 run = True while run: clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False if event.type == pygame.KEYDOWN: print(pygame.key.name(event.key)) keys = pygame.key.get_pressed() rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * vel rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * vel rect.centerx = rect.centerx % window.get_width() rect.centery = rect.centery % window.get_height() window.fill(0) pygame.draw.rect(window, (255, 0, 0), rect) pygame.display.flip() pygame.quit() exit()