首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在碰撞过滤过程中,PyBox2D - NoneType不可订阅。

在碰撞过滤过程中,PyBox2D - NoneType不可订阅。
EN

Stack Overflow用户
提问于 2019-12-13 18:35:07
回答 1查看 35关注 0票数 1

我有一个Box2D世界,我需要过滤碰撞,我有三个实体,一个汽车,一个行人和一个建筑物。细节可以是在这里发现的,在那里我被告知要问一个新的问题。我最终成功地过滤了碰撞,当一辆汽车撞上行人时,它做了些什么,但是当汽车撞上大楼时,我得到了一个错误:"NoneType是不可订阅的“,我如何修复它呢?谢谢

代码语言:javascript
运行
复制
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)

我怎样才能纠正错误?感谢你的任何帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-13 22:24:34

由于您的代码只有一个订阅(使用[]括号一次),因此错误消息意味着您在执行ud['obj']之前可能需要检查None对象,如下所示:

代码语言:javascript
运行
复制
if ud is None:
    continue

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

代码语言:javascript
运行
复制
>>> a = None[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable
>>> 

官方的文档定义了订阅:

6.3.2.订阅 订阅选择序列(字符串、元组或列表)或映射(字典)对象的项: 订阅::=主“expression_list” 主体必须计算到支持订阅的对象(例如列表或字典)。用户定义的对象可以通过定义getitem()方法来支持订阅。

..。然后定义支持订阅的内置对象类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59328097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档