Вы должны выполнить обновление позиции в главном цикле, а не в цикле событий.Обратите внимание, что цикл обработки событий выполняется только тогда, когда происходит событие.Это означает, что он выполняется один раз, когда кнопка нажата, и второй раз, когда кнопка отпущена.Движение мыши также является событием и вызывает выполнение цикла событий.
Может сработать следующее.Вместо цикла обработки событий внутренняя обработка событий выполняется с помощью pygame.event.pump()
:
def fire(gun,tankx,tanky,turretpos):
firebullet = True
startingshellx = gun[0][0]
startingshelly = gun[0][1]
while firebullet:
pygame.event.pump()
startingshellx -= (12-turretpos)*2
startingshelly += int((((startingshellx - (gun[0][0]))*0.015)**2) - (turretpos+turretpos/(12-turretpos)))
pygame.draw.circle(screen,red,(startingshellx, startingshelly-turretpos),5)
if startingshelly > height-100:
firebullet = False
pygame.display.update()
Но я рекомендую изменить дизайн.Избегайте функций и переменных с одинаковыми именами.Не используйте дополнительный цикл с обновлениями дисплея внутри основного цикла:
def fire(shellpos, tankx, tanky, turretpos):
shellpos[0] -= (12-turretpos)*2
shellpos[1] += (((shellpos[0] - (gun[0][0]))*0.015)**2) - (turretpos+turretpos/(12-turretpos))
pygame.draw.circle(screen,red,(round(shellpos[0]), round(shellpos[1]-turretpos)),5)
return (shellpos[1] <= height-100), shellpos
run = True
firebullet = False
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
firebullet, shellpos = True, gun[0]
# [...]
if firebullet:
firebullet, shellpos = fire(shellpos, tankx, tanky, turretpos)
# [...]
pygame.display.update()
Если вы хотите сгенерировать плавное движение, то вы должны выполнять вычисления со значениями точек flotiong:
startingshellx -= (12-turretpos)*2
startingshelly += (((startingshellx - (gun[0][0]))*0.015)**2) - (turretpos+turretpos/(12-turretpos))
Приведение (int()
) или round
координат к целым значениям при рисовании объекта (круга):
pygame.draw.circle(screen,red,(round(startingshellx), round(startingshelly-turretpos)),5)
Обратите внимание: если значение усекается до целого значения, перед его добавлением десятичные разряды теряются:
>>> int(0.3) + int(0.4) + int(0.5) + int(0.6)
0
Если операция приведения выполняется позже, то только десятичные разряды результатапотеряны:
>>> int(0.3 + 0.4 + 0.5 + 0.6)
1
round()
дает следующее целое значение следующей терки, если десятичные разряды> = 0,5:
>>> round(0.3 + 0.4 + 0.5 + 0.6)
2