0

最もわかりやすいチュートリアルやドキュメントなどが提供されているので、最近Kivyをダウンロードしました.pygameとcocosを試しましたが、基礎を得ることができませんでした.

ここに私の問題があります。ポンゲームを作成しました。ポンボールを停止してゲームを一時停止し、一時停止が解除されたら(速度を変更して)ゲームを再開しようとしています。

これが私のコードです:

class PongGame(Widget):
   ...

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'escape':
        #Why doesnt it work without global?
        #If I don't use a global i get "tempBallVelocity referenced before assignment
            global tempBallVelocity
            tempBallVelocity = self.ball.velocity
            self.ball.velocity = 0,0


        if keycode[1] == '`':
            #Make the ball go again, thus exiting pause
            #This is where the error occurs if I don't use global
            self.ball.velocity = tempBallVelocity   

コメントでわかるように、グローバルを使用しないと、割り当てエラーの前に参照されます。しかし、これはローカル変数です。なぜこれが起こっているのかわかりません。

誰にもアイデアはありますか?ありがとう?

編集:誰もが私の意図を明確にするために、グローバルを使用したくありませんが、それが機能する唯一の方法です。グローバルを使用しないことをお勧めします。

4

3 に答える 3

1

関数内のコードがインデントされていません。これは単なるコピーミスですか? そうでない場合、なぜエラーが発生しないのだろうか。

編集:わかりtempBallVelocityました、関数を呼び出すときに変数を設定するのは簡単です'escape'が、関数が終了して変数が失われます。次に、変数をまだ設定していない「バックティック」で呼び出す場合、tempBallVelocityおそらく最良の解決策は次のようになります self.tempBallVelocity = self.ball.velocity

于 2012-07-28T11:45:29.793 に答える
1

インデント エラーを再度修正すると、次の ことがわかります。

  1. エスケープescapeはグローバルなしで機能するはずtempBallVelocityですが、ローカル変数と見なされます。グローバル変数を変更する場合は、グローバル宣言を追加して、tempBallVelocityローカルではなくグローバルであることを Python に伝える必要があります。

  2. 2 番目のケースでtempBallVelocityは、エスケープ ブロックに入らないとローカルで初期化されないため、ローカルのRValueとして使用できません。この場合、python はクラスの外で変数を探す必要があります。本当にtempBallVelocityグローバル変数ですか?

注意: ケースが排他的である場合は、2 番目のケースのelif代わりに使用する必要がありますif

于 2012-07-28T12:03:03.493 に答える
0

識別されたコード ブロック内で変数を設定するたびに、変数はそのブロックから出て前の識別に戻ると破棄されます。

あなたが書くなら

if True:
    foo = 'foo value, which is a string (?)'
    print foo

巨大なスクリプト内では、python は if ステートメントの「内部」にある間のみ foo 変数を処理し、それが終了して外に出ると、物事を高速化するために foo は完全に忘れられます。ステートメント内でのみ使用します。

このようなことをしたいと思ったら

if True:
    foo = 'foo value'

# Right now foo has been trashed

if True:
    print foo
    # Raises an error

「if」ステートメントの外で foo 変数を設定する必要があります

foo = ''

if True:
    foo = 'foo value'

# Right now foo still exists and keeps it's recently changed value

if True:
    print foo
    # prints 'foo value'

または、foo をグローバル変数として設定して、「if」ステートメントの外に出ても破棄されないようにすることもできます。

if True:
    global foo
    foo = 'foo value'

# foo still exists as it's a global variable

if True:
    print foo
    # There's no reason so it wouldn't work

しかし、それはほとんどの状況で不必要で混乱を招く可能性があります。また、すべてをグローバルにし始めて、一度しか使用しない変数がプログラム中にデバイスのメモリに無用に蓄積されると、問題になることさえあります。

今、あなたはクラスを書いているので、あなたがしていることをする正しい方法は(私の観点から)、このようにクラスに「tempBallVelocity」変数を保存することです

class PongGame(Widget):
   ...

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'escape':
            self.tempBallVelocity = self.ball.velocity
            self.ball.velocity = 0,0


        if keycode[1] == '`':
            self.ball.velocity = self.tempBallVelocity   

今言ったルールを尊重していないように見えますが、「self.tempBallVelocity = ...」と書くと、 PongGame オブジェクトへのショートカットである self に情報を保存していることになります。そのメソッドを実行するゲームを実行するためにインスタンス化するので、メソッドを取得すると変数がそこに格納されます。

この回答がお役に立てば幸いです。Python についてより確かな知識を得る必要があります。Learn Python The Hard Wayは、私にとって便利な無料の html バージョンを含む本のサイトです。

またね!:D

于 2014-03-23T03:01:27.350 に答える