Я делал игру в стиле покемонов в течение месяца или около того, и только недавно обновился до Мохаве, чтобы проверить новые функции.
После обновления я заметил несколько незначительных проблем с моей игрой, одной из которых была полоса HP, которая не рисуется так, как раньше в High Sierra. Раньше она постепенно уменьшалась в ширине, но теперь программа просто зависает на время воспроизведения анимации, а затем переходит к концу анимации. Почему это может произойти?
К настоящему времени я знаю, что у Pygame есть проблемы с отрисовкой в Mojave (предположительно из-за нового темного режима), но я еще не видел, чтобы кто-нибудь описал ситуацию, в которой был затронут только маленькая часть их программы - большинство отчетов относятся к 18 г. и пожаловаться на полное отсутствие рисунка.
Во всяком случае, вот мой код для анимации HP Bar:
def changeHP(barPos, maxHP, startHP, dif): #This function displays the animation for hp loss/gain
timer = pygame.time.Clock()
for i in range(int(dif*100/maxHP)):
difPer = (maxHP*i/100)
if startHP - difPer <= maxHP/5:
color = Color(255, 0, 0, 255)
elif startHP - difPer <= maxHP/2:
color = Color(255, 255, 0, 255)
else:
color = Color(0, 255, 0, 255)
pygame.draw.rect(screen, Color(255, 255, 255, 255), (barPos[0], barPos[1], 144, 9))
pygame.draw.rect(screen, color, (barPos[0], barPos[1], ((startHP - difPer)/maxHP) * 144, 9))
pygame.display.update()
timer.tick(60)
Извините, если некоторые значения кажутся запутанными, работа над ними продолжается.
Хм, я не думал, что это действительно сработает, но это сработало.
Я добавил в цикл проверку очереди событий, и все вернулось на круги своя.
Вот мой обновленный код:
def changeHP(barPos, maxHP, startHP, dif): #This function displays the animation for hp loss/gain
timer = pygame.time.Clock()
for i in range(int(dif*100/maxHP)):
difPer = (maxHP*i/100)
if startHP - difPer <= maxHP/5:
color = Color(255, 0, 0, 255)
elif startHP - difPer <= maxHP/2:
color = Color(255, 255, 0, 255)
else:
color = Color(0, 255, 0, 255)
pygame.draw.rect(screen, Color(255, 255, 255, 255), (barPos[0], barPos[1], 144, 9))
pygame.draw.rect(screen, color, (barPos[0], barPos[1], ((startHP - difPer)/maxHP) * 144, 9))
pygame.display.update()
timer.tick(60)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
Вы звоните
pygame.display.update()
и/илиtimer.tick()
из разных мест? Может быть, происходит какая-то синхронизация отображения-обновления - обновление происходит, но "сбросы" выполняются слишком близко друг к другу, чтобы увидеть его на экране ??