Is there a keymap in Pygame?

Question:

I’m trying to make a game and I have a lot of if statements that use keys, and if I want to add or change a key I have to find all of the if statements and change the key variable there, so does Pygame have a keymap/input map like Godot or unity where I can add name and then add keys to that name?

Asked By: Kaifun Gaming

||

Answers:

No there is no built-in keymap like Godot/unity. however you can make one, this is how I did it

class KeyMap():
    def __init__(self):
        self.keys = pygame.key.get_pressed()
    def Left(self):
        return self.keys[pygame.K_LEFT] or self.keys[pygame.K_a]
    def Right(self):
        return self.keys[pygame.K_RIGHT] or self.keys[pygame.K_d]
    def Down(self):
        return self.keys[pygame.K_DOWN] or self.keys[pygame.K_s]
    def Up(self):
        return self.keys[pygame.K_UP] or self.keys[pygame.K_d]

this code snippet was from Rabbid76
example code

Answered By: Kaifun Gaming

For performance reasons make sure that pygame.key.get_pressed() is called only one per frame. e.g.: get the list of keys in the constructor of the class:

class KeyMap():
    def __init__(self):
        self.keys = pygame.key.get_pressed()
    def left(self):
        return self.keys[pygame.K_LEFT] or self.keys[pygame.K_a]
    def right(self):
        return self.keys[pygame.K_RIGHT] or self.keys[pygame.K_d]
    def down(self):
        return self.keys[pygame.K_DOWN] or self.keys[pygame.K_s]
    def up(self):
        return self.keys[pygame.K_UP] or self.keys[pygame.K_w]

Instantiate the object in the application loop. See How can I make a sprite move when key is held down how to effectivel move the object:

while run:
    # [...]

    key_map = KeyMap()
    rect.x += (key_map.right() - key_map.left()) * vel
    rect.y += (key_map.down() - key_map.up()) * vel

    # [...]

Minimal example:

import pygame

pygame.init()
win = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
rect = pygame.Rect(0, 0, 40, 60)
rect.center = win.get_rect().center
vel = 5

class KeyMap():
    def __init__(self):
        self.keys = pygame.key.get_pressed()
    def left(self):
        return self.keys[pygame.K_LEFT] or self.keys[pygame.K_a]
    def right(self):
        return self.keys[pygame.K_RIGHT] or self.keys[pygame.K_d]
    def down(self):
        return self.keys[pygame.K_DOWN] or self.keys[pygame.K_s]
    def up(self):
        return self.keys[pygame.K_UP] or self.keys[pygame.K_w]

run = True
while run:
    clock.tick(20)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    key_map = KeyMap()
    rect.x += (key_map.right() - key_map.left()) * vel
    rect.y += (key_map.down() - key_map.up()) * vel

    win.fill((0, 0, 0)) 
    pygame.draw.rect(win, (255, 0, 0), rect)
    pygame.display.update()

pygame.quit()
Answered By: Rabbid76
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.