Pygame keyup не регистрируется правильно - PullRequest
0 голосов
/ 25 мая 2020

Я сделал игру, которая просто определяет движения двух игроков, но иногда, когда несколько клавиш нажимаются одновременно, а затем отпускаются, она не определяет, что все клавиши были отпущены (одна из клавиш все еще считается нажатым). Я пытался вызвать функцию "keyup" несколько раз в программе, но это, похоже, не помогло. Это также происходит только с одним игроком, но реже, поскольку в один момент нажимается меньше клавиш. Вот код:

</p>

<code>import pygame,sys

pygame.init()

DPROZOR=(1200,800)
DIGRAC=(100,100)
KORAK=0.5

ziv=True
x1,y1=(float(DPROZOR[0]/2-DIGRAC[0]/2),float(DPROZOR[1]-DIGRAC[1]))
x2,y2=(float(DPROZOR[0]/2-DIGRAC[0]/2),0)
pozicija1=[x1,y1]
pozicija2=[x2,y2]
desno1,levo1,gore1,dole1=(False,False,False,False)
desno2,levo2,gore2,dole2=(False,False,False,False)

prozor=pygame.display.set_mode(DPROZOR)

def crtaj():
    prozor.fill(pygame.Color("skyblue"))
    pygame.draw.rect(prozor,pygame.Color("gold"),(pozicija1,DIGRAC))
    pygame.draw.rect(prozor, pygame.Color("red"), (pozicija2, DIGRAC))

def keyDown1():
    global desno1,levo1,gore1,dole1

    if(event.type == pygame.KEYDOWN):
        if(event.key == pygame.K_RIGHT): desno1=True
        if(event.key == pygame.K_LEFT): levo1=True
        if(event.key == pygame.K_UP): gore1=True
        if(event.key == pygame.K_DOWN): dole1=True

def keyDown2():
    global desno2,levo2,gore2,dole2

    if(event.type == pygame.KEYDOWN):
        if(event.key == pygame.K_d): desno2=True
        if(event.key == pygame.K_a): levo2=True
        if(event.key == pygame.K_w): gore2=True
        if(event.key == pygame.K_s): dole2=True

def keyUp1():
    global desno1,levo1,gore1,dole1

    if(event.type == pygame.KEYUP):
        if(event.key == pygame.K_RIGHT): desno1=False
        if(event.key == pygame.K_LEFT): levo1=False
        if(event.key == pygame.K_UP): gore1=False
        if(event.key == pygame.K_DOWN): dole1=False

def keyUp2():
    global desno2,levo2,gore2,dole2

    if(event.type == pygame.KEYUP):
        if(event.key == pygame.K_d): desno2=False
        if(event.key == pygame.K_a): levo2=False
        if(event.key == pygame.K_w): gore2=False
        if(event.key == pygame.K_s): dole2=False

def kretanje1():
    global x1,y1,pozicija1

    if(desno1): x1+=KORAK
    if(levo1): x1-=KORAK
    if(x1 < 0): x1+=KORAK
    if(x1 > DPROZOR[0] - DIGRAC[0]): x1-=KORAK

    if(gore1): y1-=KORAK
    if(dole1): y1+=KORAK
    if(y1 < 0): y1+=KORAK
    if(y1 > DPROZOR[1] - DIGRAC[1]): y1-=KORAK

    pozicija1=[x1,y1]

def kretanje2():
    global x2,y2,pozicija2

    if(desno2): x2+=KORAK
    if(levo2): x2-=KORAK
    if(x2 < 0): x2+=KORAK
    if(x2 > DPROZOR[0] - DIGRAC[0]): x2-=KORAK

    if(gore2): y2-=KORAK
    if(dole2): y2+=KORAK
    if(y2 < 0): y2+=KORAK
    if(y2 > DPROZOR[1] - DIGRAC[1]): y2-=KORAK

    pozicija2=[x2,y2]

while ziv:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    crtaj()

    keyDown1()
    kretanje1()
    keyUp1()
    kretanje1()

    keyDown2()
    kretanje2()
    keyUp2()
    kretanje2()

    print()
    print(desno1,levo1,gore1,dole1)
    print()
    print(desno2,levo2,gore2,dole2)
    print()

    pygame.display.update()
</code>

levo = left

desno = right

gore = up

dole = вниз

ziv = live

DPROZOR = размеры окна

DIGRAC = размеры плеера

KORAK = шаг

pozicija = position

kretanje = движение

crtaj = рисование

1 Ответ

1 голос
/ 25 мая 2020

Это вопрос отступа . Вы должны оценивать события в событии l oop, а не в приложении l oop:

while ziv:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

        keyDown1()
        kretanje1()
        keyUp1()
        kretanje1()

        keyDown2()
        kretanje2()
        keyUp2()
        kretanje2() 

    crtaj()

    # [...]
...