Nano Hash - криптовалюты, майнинг, программирование

непоследовательное движение с pygame

У меня проблема, когда я пытаюсь заставить круг идти в одно и то же место каждый раз, когда я запускаю программу. Но каждый раз, когда я запускаю код, точка не всегда совпадает. У меня там же тестовый кружок для сравнения пробега с пробегом. Красный круг должен идеально закрывать белый круг, но он меняется каждый раз, когда я запускаю программу. Я сбрасываю ядро, так как использую pygame.time.get_ticks() для определения времени всего.

import sys, pygame, math
from pygame.locals import *

# set up a bunch of constants
BLUE       = (  0,   0, 255)
WHITE      = (255, 255, 255)
ORANGE     = (255, 165,   0)
PINK       = (255,  20, 147)
RED        = (255,   0,   0)
GREEN      = (  0, 255,   0)
LIMEGREEN  = ( 50, 205,  50)
YELLOW     = (255, 255,   0)
PURPLE     = (160,  32, 240)
BLACK      = (  0,   0,   0)

#Background Colour
BGCOLOR = BLACK

#Setting Window Size and finding window x and y centre 
WINDOWWIDTH = 1918# width of the program's window, in pixels 960x540
WINDOWHEIGHT =  1078# height in pixels
WIN_CENTERX = int(WINDOWWIDTH / 2) # the midpoint for the width of the window
WIN_CENTERY = int(WINDOWHEIGHT / 2) # the midpoint for the height of the window

# frames per second to run at
FPS = 60

#intializing Variables
AMPLITUDE = 450 

colourArray=[BLUE,WHITE,YELLOW,GREEN,RED,PINK,PURPLE,LIMEGREEN,ORANGE]
i=0
xPos = 0
step = 0 
small_step =0
stop_step=step=0
xPos=0  
yPos=0 
c=RED
timestep=0

# standard pygame setup code
pygame.init()
FPSCLOCK = pygame.time.Clock()
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT),pygame.FULLSCREEN)
pygame.display.set_caption('Task1')
fontObj = pygame.font.Font('freesansbold.ttf', 16)

# main application loop
while True:
    # event handling loop for quit events
    for event in pygame.event.get():
        if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
            pygame.quit()
            sys.exit()       

    #setup for label and time   
    tempTime=pygame.time.get_ticks()/1000         
    time_string=str(tempTime)
    instructionsSurf = fontObj.render(time_string, True, WHITE, BGCOLOR)
    instructionsRect = instructionsSurf.get_rect()
    instructionsRect.left = 10
    instructionsRect.bottom = WINDOWHEIGHT - 10

    # fill the screen to draw from a blank state
    DISPLAYSURF.fill(BGCOLOR)
    DISPLAYSURF.blit(instructionsSurf, instructionsRect)

    tempTime=pygame.time.get_ticks()/1000
    #Color change loop
    c=RED  
    if (0<=(tempTime)<3):
        c=RED
    if (3<=(tempTime)<5):
        c=BLUE
    if (5<=(tempTime)<7):
        c=GREEN
    if (7<=(tempTime)<9):
        c=YELLOW
    if (9<=(tempTime)<11):
        c=WHITE 
    if (11<=(tempTime)<17):
        c=RED
    if (17<=(tempTime)<42):
        c=RED
    if (42<=(tempTime)<46):
        c=RED
    if (46<=(tempTime)<120):
        c=colourArray[i]



    #Setting position of x and y coordinates 
    if (0<=(tempTime)<14):
        xPos = 0
        yPos = 0 
    if (14<(tempTime)<17): 
        small_step += 5.111
        xPos = small_step 
        yPos = 0
    if (17<(tempTime)<43):
        step += 0.05001 
        step %= 2 * math.pi
        xPos = math.cos(step) * AMPLITUDE
        yPos = math.sin(step) * AMPLITUDE
    if (43<(tempTime)<46):
        stop_step=step
        xPos = math.cos(stop_step) * AMPLITUDE
        yPos = math.sin(stop_step) * AMPLITUDE
    if (46<(tempTime)<120):
        step += 0.05001
        step %= 2 * math.pi
        xPos = math.cos(step) * AMPLITUDE
        yPos = math.sin(step) * AMPLITUDE  



    #test dot
    pygame.draw.circle(DISPLAYSURF, WHITE, (WIN_CENTERX+AMPLITUDE, 0+WIN_CENTERY),12,0)
    # draw dot1 
    dot1=pygame.draw.circle(DISPLAYSURF, c, (int(xPos)+ WIN_CENTERX, int(yPos) + WIN_CENTERY), 12,0)
    # draw dot2
    dot2=pygame.draw.circle(DISPLAYSURF, BLACK, (int(xPos) + WIN_CENTERX, int(yPos) + WIN_CENTERY), 6,0)



    #refresh
    pygame.draw.rect(DISPLAYSURF, BLACK, (0, 0, WINDOWWIDTH, WINDOWHEIGHT), 1)
    pygame.display.update()
    FPSCLOCK.tick(FPS)

  • Нет гарантии, что pygame всегда выполняет одинаковое количество тиков в секунду. Это означает, что время выполнения ваших условий в секунду может варьироваться от секунды к секунде. Вам придется найти более стабильный критерий, который не так сильно зависит от tempTime, или время от времени перенормировать позицию. Вы также можете изучить pygame.time.Clock.tick_busy_loop(), который предлагает более точное время за счет циклов ЦП. 18.04.2016
  • Спасибо! Я попробую 18.04.2016

Ответы:


1

Я только отсканировал ваш код, но я предполагаю, что ваше несоответствие связано с высокой частотой кадров (60). FPSCLOCK.tick(FPS) гарантирует, что вы достигнете 60 кадров в секунду, но не означает, что вы достигнете 60 кадров в секунду. Поэтому, если ваш компьютер не может обрабатывать 60 кадров в секунду, он будет ниже 60 кадров.

Рекомендация Cristph Terasa по использованию busy_loop должна помочь вам, но у меня лично нет опыта в этом, и я хочу поделиться методом нормализации скорости игры для разных FPS.

Вместо того, чтобы изобретать колесо, вот ссылка на вопрос, который это объясняет. Я рекомендую второй ответ, написанный pmoleri. В Pygame нормализация скорости игры при разных значениях fps

Это решение должно помочь вашей игре работать с одинаковой скоростью независимо от частоты кадров.

18.04.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..