Как вы вычисляете прошедшее время для KEYDOWN. (Питон)

Мне интересно, как увеличить переменную, если клавиша удерживается дольше. Я использую Python и PyGame. Это пример моего кода (скорость, круг и расстояние определены в предыдущих строках):

distance_control = 1
for i in range(amount):
    x[i] += speedx[i]
    if x[i] >= 800:
        x[i] -= 800
        lap[i] += 1
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE:
            x[2] += 1
    distance[i] = (lap[i] - 1)*800 + x[i]

Мне было интересно, как сделать так, чтобы чем дольше вы удерживали клавишу пробела, тем выше поднимался speed_control, а max speed_control равнялся 5, желательно с использованием какой-то вещи с прошедшим временем.


person Jerry Xu    schedule 12.12.2017    source источник


Ответы (1)


Вы можете использовать функцию pygame.time.get_ticks(), которая возвращает время так как программа начала вычислять прошедшее время. Установите start_time на текущее время в цикле событий, когда пользователь нажимает клавишу, а в цикле while вы можете проверить, удерживается ли он все еще нажатым с помощью pygame.key.get_pressed() и рассчитайте прошедшее время.

import pygame as pg


def main():
    screen = pg.display.set_mode((320, 240))
    clock = pg.time.Clock()
    start_time = 0

    done = False
    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_SPACE:
                    start_time = pg.time.get_ticks()

        keys = pg.key.get_pressed()
        if keys[pg.K_SPACE]:  # The spacebar is held.
            current_time = pg.time.get_ticks()
            elapsed_time = current_time-start_time  # milliseconds
            print(elapsed_time)

        screen.fill((30, 30, 30))
        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()

Если вы просто хотите подсчитать кадры:

import pygame as pg


def main():
    screen = pg.display.set_mode((320, 240))
    clock = pg.time.Clock()
    counter = 0

    done = False
    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_SPACE:
                    counter = 0 # Set it back to 0.

        keys = pg.key.get_pressed()
        if keys[pg.K_SPACE]:  # The spacebar is held.
            # Increment the counter every frame.
            counter += 1
            print(counter)

        screen.fill((30, 30, 30))
        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()
person skrx    schedule 12.12.2017
comment
Спасибо тебе за это. Как можно было бы добавлять единицу к переменной каждую тысячу миллисекунд, когда я тестирую программу, удерживая пробел, я замечаю, что числа пропускают некоторые - person Jerry Xu; 12.12.2017
comment
Зачем вам это нужно? - person skrx; 12.12.2017
comment
пытаясь добавить ускорение для автомобиля, чем дольше вы удерживаете клавишу пробела - person Jerry Xu; 13.12.2017
comment
Я думаю, вам следует опубликовать еще один вопрос, что-то вроде «Как я могу ускорить объект?». И добавьте краткое описание ваших целей и пример кода, чтобы показать нам, что вы пробовали. - person skrx; 13.12.2017
comment
У меня уже есть ответ, вам просто нужно опубликовать вопрос. ;) Вы знаете, как работают векторы и спрайты pygame? Напишите комментарий с @skrx, чтобы отправить мне уведомление. - person skrx; 13.12.2017