Пользователь должен переместить мышь, чтобы выстрелить - PullRequest
1 голос
/ 04 июня 2019

Когда пользователь нажимает q , чтобы выстрелить, плавного движения не происходит. Им нужно перемещать мышь по экрану, чтобы пуля двигалась.

Я попытался просмотреть StackOverflow, YouTube, реорганизовав код.

def tank(x,y,turretpos):
        x = int(x)
        y = int(y)
        possibleturrets = [(x-25, y-2), (x-25, y-4), (x-25, y-6), (x-25, y-8), (x-24, y-10),
                  (x-24, y-12), (x-23, y-14), (x-20, y-16), (x-18, y-18), (x-16, y-20)]

        pygame.draw.circle(screen,black,(x,y),10)
        pygame.draw.rect(screen,black,(x-tankheight,y,tankwidth,tankheight))
        pygame.draw.line(screen,black,(x,y),possibleturrets[turretpos], turretwidth)
        pygame.draw.line(screen,black,(x,y),possibleturrets[turretpos], turretwidth)

        startx = 15
        for i in range(7):
            pygame.draw.circle(screen,black,(x-startx,y+20),wheelwidth)
            startx -= 5

        return possibleturrets

def fire(gun,tankx,tanky,turretpos):
    fire = True
    startingshellx = gun[0][0]
    startingshelly = gun[0][1]
    while fire: 
        for event in pygame.event.get():
            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:
                fire = False
            pygame.display.update()

Я хочу, чтобы пользователь нажал q , и пуля должна плавно стрелять в форме параболы.

1 Ответ

0 голосов
/ 04 июня 2019

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

Может сработать следующее.Вместо цикла обработки событий внутренняя обработка событий выполняется с помощью 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
...