1

私のプレーヤーは、スペースバーが押されたときにジャンプし、スペースバーが
離されたときに Y 速度 (yVel) を 0 に設定するように設定されています。

これにより、私が探していたスムーズなジャンプと落下が得られるはずです
が、ジャンプの全期間を通じてスペースバーを押したままにしないと、何らかの奇妙な理由があります (つまり、yPos = 469 で地面にぶつかるとき)。 、
彼を再びジャンプさせるには、スペースバーを2回押す必要があります。
誰かが私になぜこれが起こっているのか説明してもらえますか?

私のコード:

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
4

2 に答える 2

1

それはあなたのplayerGravity関数だと思います。特に、それが何をしているのかを考える必要があります。

  • このマジックナンバー469は何ですか?なぜxPosとyPosの両方と比較するのですか?
  • これは何を達成することになっていますか?self.yPos < 469: self.yVel += 1

一般に、意味のある関数名と変数名を書く必要があります。これは、これらすべての割り当て呼び出しを、その目的を説明する関数でラップすることを意味します。が何をするかは知ってxPos += 1 ますが、意図はわかりません。タイプミスである可能性があります。適切な関数名 ( MoveRight(amount)) はこれを回避します。

また、コードが「間違っている」場所を特定することを学ぶ必要があります-self.yPos行の下の値を確認しましたelif event.key == K_SPACE:か? デバッグは、すべてのプログラマーが習得しなければならないスキルです。

これはあなたの質問に対する直接的な答えではないかもしれませんが、私は人に魚を 1 匹与えるよりも釣り方を教える方が好きです...

于 2013-01-30T16:29:05.690 に答える
0

ボールが床にあるかどうかを確認した場所:

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

私は言うべきだった

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

後者のスクリプトは、ボールの位置を 469 に保持する代わりに、単純に速度がない、つまり動きがないことを示していますが、ボールはまだ自由です。ふぅ、あれはヤバかった <_>

于 2013-01-30T17:05:15.270 に答える