我有一个需要过滤碰撞的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)
如何解决该错误? 任何帮助表示赞赏
答案 0 :(得分:0)
由于您的代码只有一个 subscription (一种使用[]
括号),因此错误消息表示您可能需要检查ud
对象中的{{1} },然后再进行None
,如下:
ud['obj']
可以在任何python解释器中触发相同的错误消息,如下所示:
if ud is None:
continue
官方documentation定义了订阅:
6.3.2。订阅
订阅将选择一个序列项(字符串,元组或列表) 或映射(字典)对象:
订阅:::主要的[[“ expression_list”]“
主要对象必须评估为支持预订的对象 (例如列表或字典)。用户定义的对象可以支持 通过定义 getitem ()方法进行订阅。
...,然后继续定义不支持订阅的对象的内置类型。