Как снова переместить круг после простоя в течение 3 секунд? - PullRequest
1 голос
/ 09 апреля 2019

В настоящее время я создаю программу, в которой круг переместится влево, останется на 3 секунды, а затем переместится вправо на экран.Однако при попытке реализовать это решение: В PyGame, как перемещать изображение каждые 3 секунды без использования функции сна? , это не работает.Буду признателен, если кто-нибудь скажет мне, что я делаю.

Вот мой код:

import pygame, sys, time, random
from pygame.locals import *

currentPosition = [300, 368]

def moveLeft():
    currentPosition[0] -= 1

def moveRight():
    currentPosition[0] += 1


pygame.init()

windowCalibration = pygame.display.set_mode((0,0))

WHITE = (255, 255, 255)



windowCalibration.fill(WHITE)

pygame.display.set_caption("Eye calibration")
pygame.draw.circle(windowCalibration, (0,0,0), currentPosition, 10)
done = False

circleIsIdle = True

clock = pygame.time.Clock()

time_counter = 0

def stopCircle():
    circleIsIdle = True
    while circleIsIdle:
        time_counter = clock.tick()
        if time_counter > 3000:
            time_counter = 0
            circleIsIdle = False

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                done = True
    while currentPosition[0] >= 10:
        moveLeft()
        windowCalibration.fill(WHITE)
        pygame.draw.circle(windowCalibration, (0,0,0), currentPosition, 10)
        pygame.display.update()
    stopCircle()

    while currentPosition[0] <= 1350:
        moveRight()
        windowCalibration.fill(WHITE)
        pygame.draw.circle(windowCalibration, (0,0,0), currentPosition, 10)
        pygame.display.update()
    stopCircle()
    done = True        

1 Ответ

1 голос
/ 09 апреля 2019

Внутри while not done вы не должны использовать другие while, что занимает больше времени. Он останавливается while not done и не может проверить, нажали ли вы ESC и т. Д.

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

Я также использую state, чтобы увидеть, двигаюсь ли я влево или вправо или жду, прежде чем двинуться влево или вправо. Таким образом, я могу делать разные вещи - я могу двигаться или нет, я могу рисовать или нет (то есть, если у меня есть кнопка «Пауза», я мог бы использовать state_pause, чтобы рисовать или нет эту кнопку).

Этот код запускается while not done все время, поэтому вы всегда можете выйти, используя ESC. Вы также можете перемещать второй круг, даже когда первый круг ждет.

import pygame

# --- constants ---

WHITE = (255, 255, 255)
BLACK = (  0,   0,   0)

# --- classes ---

# empty

# --- functions ---

def moveLeft():
    currentPosition[0] -= 1

def moveRight():
    currentPosition[0] += 1
# --- main ---

pygame.init()

windowCalibration = pygame.display.set_mode((0,0))
pygame.display.set_caption("Eye calibration")

currentPosition = [300, 368]
state = 'move_left'
wait_to = 0

done = False
while not done:

    # --- events ---
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                done = True

    # --- moves ---

    if state == 'move_left':
        if currentPosition[0] >= 10:
            moveLeft()
        else:
            state = 'wait_before_move_right'
            wait_to = pygame.time.get_ticks() + 3000

    elif state == 'move_right':
        if currentPosition[0] <= 1350:
            moveRight()
        else:
            state = 'wait_before_move_left'
            wait_to = pygame.time.get_ticks() + 3000

    elif state == 'wait_before_move_right':
        current_time = pygame.time.get_ticks()
        if current_time > wait_to:
            state = 'move_right'

    elif state == 'wait_before_move_left':
        current_time = pygame.time.get_ticks()
        if current_time > wait_to:
            state = 'move_left'

    # --- draws ----

    windowCalibration.fill(WHITE)
    pygame.draw.circle(windowCalibration, BLACK, currentPosition, 10)
    pygame.display.update()

# --- end ---
pygame.quit()

РЕДАКТИРОВАТЬ: этот код перемещается 3 круга одновременно, они ждут, прежде чем они изменят направление, и это не останавливает другие круги, и вы можете использовать ESC в любой момент.

import pygame

# --- constants ---

WHITE = (255, 255, 255)
BLACK = (  0,   0,   0)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)
BLUE  = (  0,   0, 255)

# --- classes ---

# empty

# --- functions ---

# empty

# --- main ---

pygame.init()

windowCalibration = pygame.display.set_mode((0,0))
pygame.display.set_caption("Eye calibration")

circles = [
    {'pos': [300, 368], 'speed': 1, 'state': 'move_left', 'wait_to': 0, 'color': RED},
    {'pos': [300, 268], 'speed': 10, 'state': 'move_right', 'wait_to': 0, 'color': GREEN},
    {'pos': [300, 168], 'speed': 30, 'state': 'move_right', 'wait_to': 0, 'color': BLUE},
]

done = False
while not done:

    # --- events ---
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                done = True

    # --- moves ---

    current_time = pygame.time.get_ticks()

    for circle in circles:
        if circle['state'] == 'move_left':
            if circle['pos'][0] >= 10:
                circle['pos'][0] -= circle['speed']
            else:
                circle['pos'][0] = 10
                circle['state'] = 'wait_before_move_right'
                circle['wait_to'] = pygame.time.get_ticks() + 3000

        elif circle['state'] == 'move_right':
            if circle['pos'][0] <= 1350:
                circle['pos'][0] += circle['speed']
            else:
                circle['pos'][0] = 1350
                circle['state'] = 'wait_before_move_left'
                circle['wait_to'] = pygame.time.get_ticks() + 3000

        elif circle['state'] == 'wait_before_move_right':
            if current_time > circle['wait_to']:
                circle['state'] = 'move_right'

        elif circle['state'] == 'wait_before_move_left':
            if current_time > circle['wait_to']:
                circle['state'] = 'move_left'

    # --- draws ----

    windowCalibration.fill(WHITE)

    for circle in circles:
        pygame.draw.circle(windowCalibration, circle['color'], circle['pos'], 10)

    pygame.display.update()

# --- end ---

pygame.quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...