0

I am a newbie to pygame so when I type the below code in, it shows that there is no such thing as a 'type' attribute for the event object. Can you please tell me what's the error.

# Importing libraries and other stuff
import pygame
from pygame.locals import *

# defining the funtion for drawing the block
def draw_block():
   surface.fill((232,127,7))
   surface.blit(block,(block_x,block_y))
   pygame.display.flip()

if __name__ == "__main__":
   pygame.init()
   surface = pygame.display.set_mode((500,500))
   surface.fill((232,127,7))

   block = pygame.image.load("block_better_3.jpg").convert()
   block_x = 100
   block_y = 100
   surface.blit(block,(block_x,block_y))

   pygame.display.flip()

# Making the window run until user input
running = True
while running:
   for event in pygame.event.get():
        if event.type == K_ESCAPE:
            running = False
        elif event.type == QUIT:
            running = False

        elif event.key == K_UP:
            block_y -= 10
        elif event.key == K_DOWN:
            block_y += 10
        elif event.key == K_LEFT:
            block_x -= 10
        elif event.key == K_RIGHT:
            block_x +=10
Dev
  • 43
  • 6

1 Answers1

0

If you want to know when a key is pressed, you need to verify that the event type (event.type) is KEYDOWN and the key attribute of the event object (event.key) is the specific key (K_ESCAPE, K_UP, ...):

running = True
while running:
   for event in pygame.event.get():
        
        if event.type == QUIT:
            running = False
        
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                running = False
            elif event.key == K_UP:
                block_y -= 10
            elif event.key == K_DOWN:
                block_y += 10
            elif event.key == K_LEFT:
                block_x -= 10
            elif event.key == K_RIGHT:
                block_x += 10

See also pygame.event module and pygame.key module.


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(). 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 True, otherwise False. Use pygame.key.get_pressed() to evaluate the current state of a button and get continuous movement:

running = True
while running:
   for event in pygame.event.get():
        
        if event.type == QUIT:
            running = False
        
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                running = False

    keys = pygame.key.get_pressed()
    if keys[K_UP]:
        block_y -= 1
    if keys[K_DOWN]:
        block_y += 1
    if keys[K_LEFT]:
        block_x -= 1
    if keys[K_RIGHT]:
        block_x += 1

Further more you need to redraw the scene in every frame:

# Importing libraries and other stuff
import pygame
from pygame.locals import *

# defining the funtion for drawing the block
def draw_block():
    surface.fill((232, 127, 7))
    surface.blit(block,(block_x, block_y))
    pygame.display.flip()

if __name__ == "__main__":
    pygame.init()
    surface = pygame.display.set_mode((500,500))
    clock = pygame.time.Clock()
    block = pygame.image.load("block_better_3.jpg").convert()
    block_x = 100
    block_y = 100
   
    # application loop
    running = True
    while running:

        # limit the frames per second
        clock.tick(100)
        
        # handle the events
        for event in pygame.event.get():
            if event.type == QUIT:
                running = False
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    running = False

        # update the game states and positions of objects
        keys = pygame.key.get_pressed()
        block_x += (keys[K_RIGHT] - keys[K_LEFT]) * 2
        block_y += (keys[K_DOWN] - keys[K_UP]) * 2

        # clear the display; draw the scene; update the display 
        draw_block()

    pygame.quit()

The typical PyGame application loop has to:

Rabbid76
  • 202,892
  • 27
  • 131
  • 174