【问题标题】:Unpack Coordinates of Variable解包变量的坐标
【发布时间】:2014-12-04 05:53:59
【问题描述】:

所以在之前询问过碰撞检测之后,Collision Detection in a List, 我在

 find_overlapping 

功能。碰撞检测工作正常,但由于我正在创建一个破砖器风格的游戏,我必须根据球击中砖块的哪一侧来更改方向变量。被击中的砖块保存在变量“砖块”中,但是当我尝试运行程序时出现错误,“ValueError:需要多于 0 个值才能解包”。我猜这意味着它正在尝试查找“砖”的坐标,但由于没有砖变量但它无法运行?谁能帮忙解释一下。

overlap = drawpad.find_overlapping(x1,y1,x2,y2)
length = len(overlap)
if length > 1: 
     listPlace = overlap[1] - 3
     brick = bricklist[listPlace]
     drawpad.delete(brick)
     bx1,by1,bx2,by2 = drawpad.coords(brick)
     if x1 <= bx1 or x2 >= bx2:
            angle = -angle
     if y1 <= by1 or by2 >= y2:
            direction = -direction

我也将代码重写到下面,但是我认为我只是因为出现了相同的错误消息而将其复杂化。

overlap = drawpad.find_overlapping(x1,y1,x2,y2)
length = len(overlap)
if length > 1: 
      listPlace = overlap[1] - 3
      brick = bricklist[listPlace]
      drawpad.delete(brick)
      for x in bricklist:
            if x == brick: 
                bx1,by1,bx2,by2 = drawpad.coords(x)
                if x1 <= bx1 or x2 >= bx2:
                    angle = -angle
                if y1 <= by1 or by2 >= y2:
                    direction = -direction

【问题讨论】:

    标签: python tkinter coordinates collision-detection


    【解决方案1】:

    获取坐标之前你移除对象:

    if length > 1: 
        listPlace = overlap[1] - 3
        brick = bricklist[listPlace]
        # Get the coordinates
        bx1,by1,bx2,by2 = drawpad.coords(brick)
        # Now delete it
        drawpad.delete(brick)
        if x1 <= bx1 or x2 >= bx2:
            angle = -angle
        if y1 <= by1 or by2 >= y2:
            direction = -direction
    

    【讨论】:

    • 谢谢你,这绝对是有道理的!改了还是不能运行,还是出现同样的错误?我还缺少什么吗?
    • 您确定brick 包含一个实际存在于dropped 中的标签吗?
    【解决方案2】:

    "ValueError: need more than 0 values to unpack" 表示您正在执行以下操作,但该函数未返回任何结果:

    a,b,c,d = function(...)
    

    您要求python“解包”函数的结果并将结果分散到四个变量中。这要求函数实际返回四个值。错误消息告诉您它返回零项。所以错误的根本原因是你错误地假设函数总是返回四个值。

    在你的情况下,你打电话给drawpad.coords(...)。如果它返回零结果,则意味着您尝试获取坐标的对象不存在。这意味着(a)您对某个对象有很好的引用,但该对象已被删除,或者(b)您的引用不正确。

    您需要添加一些调试语句以确保brick(或x)是您认为的那样。您还需要确保在删除对象之前获得坐标,因为您无法获得已删除对象的坐标。

    【讨论】:

    • 好的,我更改了代码,以便在删除砖块之前获取坐标,但是我仍然有同样的错误。积木列表在函数中是全局的,但我是否需要让所有积木本身也成为全局的,即使它们在列表中或者是不必要的/不相关的。而且我不知道如何输入调试语句,所以你能指导我使用它们吗?或者有一个简单的解释可以链接到我吗?谢谢!
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2022-01-02
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多