Mokoisa
Mokoisa

Reputation: 75

How to make game character (user) move smooth?

in my game i have set my character to move. How it is set is:

if game_over_state == False:
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_ESCAPE:
            pause = True
            game_paused()
        if event.key == pygame.K_LEFT:
            player_x_change = -2
        if event.key == pygame.K_RIGHT:
            player_x_change = 2
        if event.key == pygame.K_UP:
            player_y_change = -2
        if event.key == pygame.K_DOWN:
            player_y_change = 2

    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT
            player_x_change = 0
        if event.type == pygame.KEYUP:
            player_y_change = 0

Is it a way to change this to a while function or something so the character doesn't stop moving when release a arrow-key (even though another arrow-key is held down)?

Upvotes: 1

Views: 63

Answers (1)

Rabbid76
Rabbid76

Reputation: 210909

the issue is the condition in event.type == pygame.KEYUP.

if event.type == pygame.KEYUP:
   # [...]    

   if event.type == pygame.KEYUP:
        player_y_change = 0

Just reset either player_x_change or player_y_change, dependent on the key that is released:

if game_over_state == False:
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_ESCAPE:
            pause = True
            game_paused()
        if event.key == pygame.K_LEFT:
            player_x_change = -2
        if event.key == pygame.K_RIGHT:
            player_x_change = 2
        if event.key == pygame.K_UP:
            player_y_change = -2
        if event.key == pygame.K_DOWN:
            player_y_change = 2

    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT
            player_x_change = 0
        if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
            player_y_change = 0

If you want to handle the keys simultaneously, that means you want to move the player diagonal when 2 keys are pressed and you don't want to that the player stops, when 1 key is released, then I recommend to use pygame.key.get_pressed() rather than the KEYDOWN event:

for event in  in pygame.event.get():
    if game_over_state == False:
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                pause = True
                game_paused()

if game_over_state == False:

    keys = pygame.key.get_pressed()

    player_x_change, player_y_change = 0, 0
    if keys[pygame.K_LEFT]:
        player_x_change -= 2
    if keys[pygame.K_RIGHT]:
        player_x_change += 2
    if keys[pygame.K_UP]:
        player_y_change -= 2
    if keys[pygame.K_DOWN]:
        player_y_change += 2

Upvotes: 1

Related Questions