PyBox2D-在碰撞过滤过程中,NoneType无法下标

问题描述 投票:1回答:1

我有一个Box2D世界,需要过滤碰撞,我在那里有三个实体,汽车,行人和建筑物。可以在found here处告诉我一个新问题。我终于设法过滤掉了碰撞,当汽车撞到行人时它会起作用,但是当汽车撞到建筑物时,我得到一个错误,即“ NoneType不可下标”我该如何解决?谢谢

CAR_CATEGORY = 0x0002
PEDESTRIAN_CATEGORY = 0x0004
BUILDING_CATEGORY = 0x0008

CAR_GROUP = 2
PEDESTRIAN_GROUP = -4 
BUILDING_GROUP = 8

class myContactListener(b2ContactListener):
    def handle_contact(self, contact, began):
        # A contact happened -- see if a wheel hit a
        # ground area
        fixture_a = contact.fixtureA
        fixture_b = contact.fixtureB

        body_a, body_b = fixture_a.body, fixture_b.body
        ud_a, ud_b = body_a.userData, body_b.userData


        pedestrian_contact = None
        car_contact = None
        building_contact = None
        for ud in (ud_a, ud_b):
            obj = ud['obj']          
            if isinstance(obj, Car):
                car_contact = obj
            elif isinstance(obj, Pedestrian):
                pedestrian_contact = obj
            elif isinstance(obj, Building):
                building_contact = obj

        if car_contact is not None and pedestrian_contact is not None:
            if began:
                print("Shame on you, you killed an innocent pedestrian!!!")

        elif car_contact is not None and building_contact is not None:
            if began:
                print("BOOMMM")
    def __init__(self):
        b2ContactListener.__init__(self)
    def BeginContact(self, contact):
        self.handle_contact(contact, True)
    def EndContact(self, contact):
        pass
    def PreSolve(self, contact, oldManifold):
        pass
    def PostSolve(self, contact, impulse):
        pass

box2world = world(contactListener=myContactListener(),gravity =(0.0, 0.0), doSleep =True)

如何解决该错误?任何帮助表示赞赏

python box2d collision nonetype
1个回答
0
投票

由于您的代码只有一个subscription(一种使用[]括号),该错误消息表示您可能需要在执行ud之前检查Noneud['obj']对象,例如:

if ud is None:
    continue

同一错误消息可以在任何python解释器中触发,如下所示:

>>> a = None[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable
>>> 

documentation官方定义了订阅:

6.3.2。订阅

订阅将选择一个序列项(字符串,元组或列表)或映射(字典)对象:

订阅:::主要“ [” expression_list“]”

主要对象必须评估为支持订阅的对象(例如列表或字典)。用户定义的对象可以支持通过定义getitem()方法进行订阅。

...并继续定义支持订阅的对象的内置类型。

© www.soinside.com 2019 - 2024. All rights reserved.