相同代码不同结果
Identical codes with different results
在我的游戏中,我有两个玩家控制的坦克。两辆坦克都有相同的代码,但其中一辆改变了变量名。两个坦克控制代码如下。运动控制工作正常,但它是不起作用的力量。不知何故,无论哪一套坦克控制是第一位的,它都是工作的。用户应该使用"o"、"p"和"e"、"r"来改变功率,但是有了第二组控制代码,即使有keyup线,功率也会总是在变化而不是与用户保持一致放开钥匙。
我看过一些堆栈溢出和 youtube 问题,但它太高级了,我无法理解。
我也请朋友和我的老师看过。
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)
用户应该使用"e"、"r"和"o"、"p"来改变功率,松开钥匙,功率不会改变, 但保持功率水平。
问题是有原因的,因为您有 2 个事件循环。所有事件都在第一个循环中处理,但是键 pygame.K_w
、pygame.K_s
、pygame.K_e
、pygame.K_r
没有在第一个事件循环中处理。第二个事件循环根本不会获得任何事件(大部分)。
在 1 个游戏循环中实现 1 个事件循环!
pygame.key.get_pressed()
are evaluated, when the pygame.event
s are handled by either pygame.event.get()
or pygame.event.pump()
返回的状态。
在事件循环后调用pygame.key.get_pressed()
:
# 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)
在我的游戏中,我有两个玩家控制的坦克。两辆坦克都有相同的代码,但其中一辆改变了变量名。两个坦克控制代码如下。运动控制工作正常,但它是不起作用的力量。不知何故,无论哪一套坦克控制是第一位的,它都是工作的。用户应该使用"o"、"p"和"e"、"r"来改变功率,但是有了第二组控制代码,即使有keyup线,功率也会总是在变化而不是与用户保持一致放开钥匙。
我看过一些堆栈溢出和 youtube 问题,但它太高级了,我无法理解。 我也请朋友和我的老师看过。
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)
用户应该使用"e"、"r"和"o"、"p"来改变功率,松开钥匙,功率不会改变, 但保持功率水平。
问题是有原因的,因为您有 2 个事件循环。所有事件都在第一个循环中处理,但是键 pygame.K_w
、pygame.K_s
、pygame.K_e
、pygame.K_r
没有在第一个事件循环中处理。第二个事件循环根本不会获得任何事件(大部分)。
在 1 个游戏循环中实现 1 个事件循环!
pygame.key.get_pressed()
are evaluated, when the pygame.event
s are handled by either pygame.event.get()
or pygame.event.pump()
返回的状态。
在事件循环后调用pygame.key.get_pressed()
:
# 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)