Pygame - 玩家在跳跃时必须持续按住跳跃键

1 投票
2 回答
704 浏览
提问于 2025-04-17 14:12

我的角色设置为在按下空格键时跳跃,
并在松开空格键时将Y方向的速度(yVel)设为0。

这样应该能实现我想要的平滑跳跃和下落效果,
但奇怪的是,如果我没有一直按着空格键,
也就是当角色落地时(yPos = 469),
我需要按两次空格键才能让他再次跳跃。
有人能告诉我为什么会这样吗?

我的代码:

class Player:
    def __init__(self,screen,image,xPos,yPos,xVel,yVel):
        self.xPos = xPos
        self.yPos = yPos
        self.xVel = xVel
        self.yVel = yVel
        self.image = image
        self.screen = screen

    def draw(self):
        screen.blit(self.image,(self.xPos,self.yPos))

    def update(self):   

        self.xPos += self.xVel
        self.yPos += self.yVel


        for event in pygame.event.get():
                if event.type == QUIT:
                        pygame.quit()
                        sys.exit()
                if event.type == KEYDOWN:
                        if event.key == K_LEFT:
                            self.xVel = -2
                        elif event.key == K_RIGHT:
                            self.xVel = 2
                        elif event.key == K_SPACE:
                            if self.yPos == 469:
                                self.Jump()         
                        elif event.key == K_DOWN:
                             pass


                if event.type == KEYUP:
                        if event.key == K_LEFT:
                            self.xVel = 0
                        elif event.key == K_RIGHT:
                            self.xVel = 0
                        elif event.key == K_SPACE:
                            self.yVel = 0
                        elif event.key == K_DOWN:  
                            pass


                self.playerGravity()



    def playerGravity(self):
        if self.xPos > 469:
                    self.xPos = 469
                if self.xPos < 0:
                    self.xPos = 0
                if self.yPos > 469:
                    self.yPos = 469
                if self.yPos < 0:
                    self.yPos = 0
                if self.yPos < 469:
                    self.yVel += 1

                print(self.xPos)
                print(self.yPos)

    def Jump(self):
                ##for i in range(10):
                    self.yVel = -20
                    ##break

2 个回答

0

我检查球是否在地上的地方:

if self.yPos > 469:
    self.yPos = 469

我应该这么说:

if self.yPos > 469:
    self.**yVel** = 0 

因为后面的代码并没有把球的位置固定在469,而是直接说没有速度,也就是说球没有移动,但它还是可以自由的。哎,这个问题真是让人头疼 <_>

1

我想这可能跟你的playerGravity函数有关。你需要想想这个函数在做什么,特别是:

  • 这个神秘的数字469是什么?你为什么要把它和xPos和yPos进行比较?
  • 这个代码想要达到什么效果? self.yPos < 469: self.yVel += 1

一般来说,你应该给函数和变量起一些有意义的名字。这意味着你需要把所有这些赋值操作用描述它们目的的函数包裹起来。我知道 xPos += 1 是做什么的,但我不知道它的意图——这可能只是个打错了的字。合适的函数名(比如 MoveRight(amount))可以避免这种情况。

你还需要学会找出你的代码哪里出错了——你有没有检查过在 elif event.key == K_SPACE: 这一行下面的 self.yPos 的值?调试是每个程序员都必须掌握的技能。

这可能不是直接回答你的问题,但我更喜欢教人钓鱼,而不是给他一条鱼……

撰写回答