0

我最近下载了 Kivy,因为它为我提供了最易理解的教程和文档等。我尝试过 pygame 和 cocos,但从来没有打过基础,而使用 Kivy 很容易。

所以这是我的问题,我做了一个乒乓球游戏,我试图通过停止乒乓球来暂停游戏,然后在它未暂停时重新开始(通过改变它的速度)。

这是我的代码:

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'但是函数退出并且你丢失了变量。如果你然后用'backtick'调用它,你还没有设置变量tempBallVelocity,最好的解决方案可能是: self.tempBallVelocity = self.ball.velocity.

于 2012-07-28T11:45:29.793 回答
1

如果您再次修复缩进错误,您将看到: 您可以看到:

  1. 转义escape应该在没有全局变量的情况下工作,但是tempBallVelocity将被视为局部变量。如果要修改全局变量,则需要添加全局声明以告诉 pythontempBallVelocity不是本地的而是全局的。

  2. 在第二种情况下,tempBallVelocity如果您不输入转义块,则不会在本地初始化,因此不能用作本地RValue。在这种情况下,python 应该在类之外寻找变量。真的tempBallVelocity是全局变量吗?

备注:如果情况是排他的,你应该使用elif而不是if第二种情况。

于 2012-07-28T12:03:03.493 回答
0

每次你在一个标识的代码块中设置一个变量,一旦你离开那个代码块,变量就会被销毁,回到之前的标识;

如果你写

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

在一个巨大的脚本中,python 只在 if 语句“内部”处理 foo 变量,一旦它结束并退出,为了使事情更快, foo 会被完全忘记,据了解,如果你将变量设置在 a语句,您只能在该语句中使用它。

如果你想做这样的事情

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 = ...' 时,你将信息存储在 self 中,这是 PongGame 对象的快捷方式您将实例化以运行将运行该方法的游戏,因此当您退出该方法时变量就存储在那里。

我希望这个答案对你有帮助,你应该对 python 有更扎实的了解,Learn Python The Hard Way是一个免费的 html 版本的书的网站,对我很有用。

再见!:D

于 2014-03-23T03:01:27.350 回答