处理pygame键盘输入和碰撞检查结果是否可以简洁地完成?

2024-10-03 13:16:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我该如何改进? 循环?拉链?列举?好像可以缩短,但我不知道怎么缩短。你知道吗

if checkcollide(plrx,plry) == True:
            if keys[pygame.K_w]:
                plry += 2
            if keys[pygame.K_a]:
                plrx += 2
            if keys[pygame.K_s]:
                plry -= 2
            if keys[pygame.K_d]:
                plrx -= 2
        if checkcollide(plrx,plry) == 'left':
            if keys[pygame.K_w]:
                plry += 2
            if keys[pygame.K_s]:
                plry -= 2
            if keys[pygame.K_d]:
                plrx -= 2
        if checkcollide(plrx,plry) == 'right':
            if keys[pygame.K_w]:
                plry += 2
            if keys[pygame.K_a]:
                plrx += 2
            if keys[pygame.K_s]:
                plry -= 2
        if checkcollide(plrx,plry) == 'up':
            if keys[pygame.K_a]:
                plrx += 2
            if keys[pygame.K_s]:
                plry -= 2
            if keys[pygame.K_d]:
                plrx -= 2
        if checkcollide(plrx,plry) == 'down':
            if keys[pygame.K_w]:
                plry += 2
            if keys[pygame.K_a]:
                plrx += 2
            if keys[pygame.K_d]:
                plrx -= 2

如果有人能帮忙,我们将不胜感激。谢谢。你知道吗


Tags: righttrueifkeysleftpygamedown拉链
2条回答

切换if的顺序:

collided = checkcollide(plrx,plry)
if keys[pygame.K_w]:
    if collided != 'up':
        plry += 2
if keys[pygame.K_a]:
    if collided != 'left':
        plrx += 2
if keys[pygame.K_s]:
    if collided != 'down':
        plry -= 2
if keys[pygame.K_d]:
    if collided != 'right':
        plrx -= 2

我假设你的代码中有一个错误,而你真正想要的是不要让玩家朝着冲突的方向移动,而不是让你的代码出现多个问题(如缩进,你做checkcollision(plrx, plry) == true块以及其他块,而不是代替,并且你不允许多个冲突)。在这种情况下,您的代码可以替换为:

check = checkcollision(plrx, plry)
if keys[pygame.K_w] and check != 'up':
  plry += 2
if keys[pygame.K_a] and check != 'left':
  plrx += 2
if keys[pygame.K_s] and check != 'down':
  plry -= 2
if keys[pygame.K_d] and check != 'right':
  plrx -= 2

这避免了重复调用碰撞检查代码,还允许排除多个方向。你知道吗

顺便说一句,大多数游戏代码的工作方式是移动玩家,然后重置他们的位置,或者限制他们的移动,如果在新位置发生碰撞,而不是你采用的检查和预防策略。你知道吗

相关问题 更多 >