Почему атрибут «тип» не работает с объектом события в Python [дубликат]

avatar
Dev
8 августа 2021 в 07:11
59
1
0

Я новичок в pygame, поэтому, когда я набираю приведенный ниже код, он показывает, что для объекта события нет такой вещи, как атрибут 'type'. Подскажите, пожалуйста, в чем ошибка?

# 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
Источник

Ответы (1)

avatar
Rabbid76
8 августа 2021 в 07:16
0

Если вы хотите знать, когда была нажата клавиша, вам необходимо убедиться, что тип события (event.type) равен KEYDOWN, а ключевой атрибут объекта события (event.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

См. также модуль pygame.event и модуль pygame.key.

.

События клавиатуры (см. модуль pygame.event) происходят только один раз при изменении состояния клавиши. Событие KEYDOWN происходит один раз при каждом нажатии клавиши. KEYUP возникает один раз при каждом отпускании клавиши. Используйте события клавиатуры для одного действия или пошагового движения.

Если вы хотите добиться непрерывного движения, вы должны использовать pygame.key.get_pressed(). pygame.key.get_pressed() возвращает список с состоянием каждой клавиши. Если клавиша удерживается нажатой, ее состояние равно True, в противном случае False. Используйте pygame.key.get_pressed(), чтобы оценить текущее состояние кнопки и получить непрерывное движение:

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

Более того, вам нужно перерисовывать сцену в каждом кадре:

# 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()

Типичный цикл приложения PyGame должен:

  • обработать события, вызвав либо pygame.event.pump(), либо pygame.event.get().
  • обновлять игровые состояния и позиции объектов в зависимости от входных событий и времени (соответственно кадров)
  • очистить весь дисплей или нарисовать фон
  • отрисовать всю сцену (blit все объекты)
  • обновите отображение, вызвав либо pygame.display.update(), либо pygame.display.flip()
  • ограничить количество кадров в секунду, чтобы ограничить использование ЦП с помощью pygame.time.Clock.tick