Движение игрока Pygame - PullRequest
       28

Движение игрока Pygame

0 голосов
/ 02 августа 2020

У меня есть быстрый вопрос - почему так получается, что прямоугольник все еще движется, даже если клавиша больше не нажимается? (Я новичок в pygame, наберитесь терпения: D) Спасибо

import pygame as pg

pg.init()
clock = pg.time.Clock()
clock.tick(30)
HEIGHT, WIDTH = 400, 400


class Clovik(pg.sprite.Sprite):
    def __init__(self):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((20, 20))
        self.image.fill((162, 38, 0))
        self.rect = self.image.get_rect()
        self.rect.center = ((HEIGHT / 2, WIDTH / 2))

    def update(self):
        keys = pg.key.get_pressed()
        if keys[pg.K_DOWN]:
            self.rect.y += 2




screen = pg.display.set_mode((HEIGHT, WIDTH))
running = True
all_sprites = pg.sprite.Group()
p = Clovik()
all_sprites.add(p)

while running:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            running = False

    all_sprites.update()
    screen.fill((100, 250, 0))
    all_sprites.draw(screen)
    pg.display.flip()

Ответы [ 2 ]

1 голос
/ 02 августа 2020

На самом деле прямоугольник останавливается при отпускании клавиши, но ваша игра работает слишком быстро. Вы должны вызвать clock.tick(30) в основном приложении l oop:

while running:
    clock.tick(30)

    # [...]

См. pygame.time.Clock / tick():

Этот метод следует вызывать один раз за кадр . Он вычислит, сколько миллисекунд прошло с момента предыдущего вызова. [...]

0 голосов
/ 02 августа 2020

Хороший вопрос. Когда вы нажимаете клавишу, она становится «Вниз» на несколько циклов. Вам нужен обработчик событий. Проведите эксперимент. Замените: if keys [pg.K_DOWN]: self.rect.y + = 2 на: if keys [pg.K_DOWN]: print ("Down")

Вы будете видеть, что каждый раз, когда вы нажимаете Key, происходит несколько отпечатков, но прекращается, когда вы перестаете нажимать.

Вы можете либо использовать переменную, чтобы отслеживать состояние вашего ключа (когда оно изменяется), либо использовать обработчик событий.

    for event in pygame.event.get():
        # handle key press
        if event.type == pygame.KEYDOWN:
...