1

In my game, I have two player controlled tanks. Both tanks have the same code, but one has altered variable names. The two tank control codes are below. The movement controls work fine, but it is the power that isn't working. Somehow whichever set of tank controls is first, it is the working one. The user should use "o", "p" and "e","r" to change the power, but with the second set of control code, even with the keyup lines, the power will always be changing rather than stay still with the user lets go of the key.

I've looked at some stack overflow and youtube questions, but it was too advanced for me to understand. I've also asked friends and my teacher to look at it.

keys= pygame.key.get_pressed()

if keys[pygame.K_j]:
    tank1x -= tankmove
elif keys[pygame.K_l]:
    tank1x += tankmove
elif keys[pygame.K_i]:
    changeturret1 = 1
elif keys[pygame.K_k]:
    changeturret1 = -1
elif keys[pygame.K_u]:
    fire1(gun1,tank1x,tank1y,currentturretpos1,fire_power1)
elif keys[pygame.K_o]:
    power_change1 = -1
elif keys[pygame.K_p]:
    power_change1 = 1

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()
    elif event.type == pygame.KEYUP:
        if event.key == pygame.K_i or event.key == pygame.K_k:
            changeturret1 = 0
        if event.key == pygame.K_o or event.key == pygame.K_p:
            power_change1 = 0

currentturretpos1 += changeturret1
if currentturretpos1 > 9:
    currentturretpos1 = 9
elif currentturretpos1 < 0:
    currentturretpos1 = 0

fire_power1 += power_change1
if fire_power1 > 100:
    fire_power1 = 100
elif fire_power1 < 1:
    fire_power1 = 1

message("Power: "+str(fire_power1)+"%",black,850,100)


if keys[pygame.K_a]:
    tankx -= tankmove
elif keys[pygame.K_d]:
    tankx += tankmove
elif keys[pygame.K_w]:
    changeturret = 1
elif keys[pygame.K_s]:
    changeturret = -1
elif keys[pygame.K_q]:
    fire(gun,tankx,tanky,currentturretpos,fire_power)
elif keys[pygame.K_e]:
    power_change = -1
elif keys[pygame.K_r]:
    power_change = 1

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()
    elif event.type == pygame.KEYUP:
        if event.key == pygame.K_w or event.key == pygame.K_s:
            changeturret = 0
        if event.key == pygame.K_e or event.key == pygame.K_r:
            power_change = 0

currentturretpos += changeturret
if currentturretpos > 9:
    currentturretpos = 9
elif currentturretpos < 0:
    currentturretpos = 0

fire_power += power_change 
if fire_power > 100:
    fire_power = 100
elif fire_power < 1:
    fire_power = 1

message("Power: "+str(fire_power)+"%",black,0,100)

The user should use "e", "r" and "o","p" to change the power and when they let go of the key, the power will not change, but stay at the power level.

HK boy
  • 1,398
  • 11
  • 17
  • 25
AT42
  • 45
  • 3

1 Answers1

0

The issue is cause, because you've 2 event loops. All the events are handled in the first loop, but the keys pygame.K_w, pygame.K_s, pygame.K_e, pygame.K_r are not handled in the 1st event loop. The 2nd event loop won't get any events at all (mostly).
Implement 1 event loop in 1 game loop!

The states which are returned by pygame.key.get_pressed() are evaluated, when the pygame.events are handled by either pygame.event.get() or pygame.event.pump().
Call pygame.key.get_pressed() after the event loop:

# the one and only event loop
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()
    elif event.type == pygame.KEYUP:
        if event.key == pygame.K_i or event.key == pygame.K_k:
            changeturret1 = 0
        if event.key == pygame.K_o or event.key == pygame.K_p:
            power_change1 = 0
        if event.key == pygame.K_w or event.key == pygame.K_s:
            changeturret = 0
        if event.key == pygame.K_e or event.key == pygame.K_r:
            power_change = 0

# get the key states after 'pygame.event.get()'
keys = pygame.key.get_pressed()

if keys[pygame.K_j]:
    tank1x -= tankmove
elif keys[pygame.K_l]:
    tank1x += tankmove
elif keys[pygame.K_i]:
    changeturret1 = 1
elif keys[pygame.K_k]:
    changeturret1 = -1
elif keys[pygame.K_u]:
    fire1(gun1,tank1x,tank1y,currentturretpos1,fire_power1)
elif keys[pygame.K_o]:
    power_change1 = -1
elif keys[pygame.K_p]:
    power_change1 = 1

currentturretpos1 += changeturret1
if currentturretpos1 > 9:
    currentturretpos1 = 9
elif currentturretpos1 < 0:
    currentturretpos1 = 0

fire_power1 += power_change1
if fire_power1 > 100:
    fire_power1 = 100
elif fire_power1 < 1:
    fire_power1 = 1

message("Power: "+str(fire_power1)+"%",black,850,100)

if keys[pygame.K_a]:
    tankx -= tankmove
elif keys[pygame.K_d]:
    tankx += tankmove
elif keys[pygame.K_w]:
    changeturret = 1
elif keys[pygame.K_s]:
    changeturret = -1
elif keys[pygame.K_q]:
    fire(gun,tankx,tanky,currentturretpos,fire_power)
elif keys[pygame.K_e]:
    power_change = -1
elif keys[pygame.K_r]:
    power_change = 1

currentturretpos += changeturret
if currentturretpos > 9:
    currentturretpos = 9
elif currentturretpos < 0:
    currentturretpos = 0

fire_power += power_change 
if fire_power > 100:
    fire_power = 100
elif fire_power < 1:
    fire_power = 1

message("Power: "+str(fire_power)+"%",black,0,100)
Rabbid76
  • 202,892
  • 27
  • 131
  • 174