Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用PyBox2d检测碰撞并使用该信息_Python_Pygame_Collision Detection_Box2d - Fatal编程技术网

Python 如何使用PyBox2d检测碰撞并使用该信息

Python 如何使用PyBox2d检测碰撞并使用该信息,python,pygame,collision-detection,box2d,Python,Pygame,Collision Detection,Box2d,我试图通过复制以下示例来过滤Box2D世界中发生的碰撞: 在我的世界中有四个类:汽车、车轮、建筑和行人,我想过滤哪个实例与哪个实例发生冲突,可能的输出之一是(伪代码) 如果contact.FixtureA.isinstance(行人)和contact.FixtureB.isinstance(汽车): 打印(“您造成了交通事故”) 我有这套分类 车辆类别=2 行人类别=4 建筑物类别=8 box2world=world(重力=(0.0,0.0),doSleep=True) 我也试过这个:但它

我试图通过复制以下示例来过滤Box2D世界中发生的碰撞:

在我的世界中有四个类:汽车、车轮、建筑和行人,我想过滤哪个实例与哪个实例发生冲突,可能的输出之一是(伪代码)

如果contact.FixtureA.isinstance(行人)和contact.FixtureB.isinstance(汽车):
打印(“您造成了交通事故”)
我有这套分类


车辆类别=2
行人类别=4
建筑物类别=8
box2world=world(重力=(0.0,0.0),doSleep=True)
我也试过这个:但它不起作用(它什么也不起作用)

类myContactListener(b2ContactListener):
定义初始化(自):
b2ContactListener.\uuuuu初始化\uuuuuuu(自)
def BeginContact(自我,联系):
夹具a=触点。夹具a
fixture_b=contact.fixtureB
车身a,车身b=夹具a.车身,夹具b.车身
ud_a,ud_b=body_a.userData,body_b.userData
行人=无
汽车=无
对于ud in(主体a、主体b):
如果存在(ud,行人):
行人=ud
elif isinstance(ud、Car):
汽车=ud
如果汽车不是无,行人不是无:
如果开始:
打印(“它确实有用”)
其他:
打印(“它做某事”)
def端触点(自身,触点):
通过
def预溶解(自、接触、旧歧管):
通过
def后解算(自、接触、脉冲):
通过
box2world=world(contactListener=myContactListener(),重力=(0.0,0.0),doSleep=True)
我在给定的类中应用了这一点(为了简单起见,仅以类为例):

class():
定义初始(self,box2world,ped_速度=25,位置=None,):
如果位置==无:
位置=[5,5]
self.ped\u速度=ped\u速度
self.position=位置
self.box2world=box2world
自最近的建筑=0
self.body=self.box2world.CreateDynamicBody(position=position,
角度=0.0,
fixtures=b2FixtureDef(
形状=圆形(半径=1),
密度=2,
摩擦=0.3,
过滤器=b2过滤器(
categoryBits=行人类别,
maskBits=建筑类+汽车类,
groupIndex=0,
)))
self.current_position=[self.body.position]
self.body.userData={'obj':self}
然后我画尸体,用pygame运行世界

但是我不知道如何继续,我如何使用collisionfilter中的信息来打印上面关于事故的句子

多谢各位 编辑:我发现了一个链接,它可以准确地解决我想做的事情,但是它是用C++编写的,我不理解它。

嘿,我刚刚回答了你关于stackexchange的问题:-)

对于碰撞,这很容易:

local filterData = {
   categoryBits = player,
   maskBits = wall + nme + platform,
   groupIndex = 0
}
fixture:setFilterData(filterData)
玩家nme。。。是整数变量(必须是2个数字的幂):

categoryBits=要在其上测试碰撞的主对象

maskBits=您可以添加主对象可以碰撞的所有数字

最好将数字存储为变量,否则会出现以下情况:

local filterData = {
   categoryBits = 1,
   maskBits = 2 + 4 + 8 + 16 ...,
   groupIndex = 0
}
fixture:setFilterData(filterData)

:-)

嘿,我刚刚回答了你关于stackexchange的问题:-)

对于碰撞,这很容易:

local filterData = {
   categoryBits = player,
   maskBits = wall + nme + platform,
   groupIndex = 0
}
fixture:setFilterData(filterData)
玩家nme。。。是整数变量(必须是2个数字的幂):

categoryBits=要在其上测试碰撞的主对象

maskBits=您可以添加主对象可以碰撞的所有数字

最好将数字存储为变量,否则会出现以下情况:

local filterData = {
   categoryBits = 1,
   maskBits = 2 + 4 + 8 + 16 ...,
   groupIndex = 0
}
fixture:setFilterData(filterData)

:-)

要回答你的第二个更复杂的评论,我将其作为另一个答案添加

您不需要自己处理碰撞,Box2D会为您处理碰撞,但您需要进行设置

-创造你的世界

world = b2.World.new(0, 24, true)
-将侦听器连接到您的世界(用于冲突处理)

-在游戏循环中,您需要调用Box2D update

self.world:step(1/60, 1, 1)
-然后,答案是在这里,您可以检查这些box2d函数侦听器中每个对象的冲突

-- collisions handler
function LF_Bullet:onBeginContact(e)
    local bodyA = e.fixtureA:getBody()
    local bodyB = e.fixtureB:getBody()
    if bodyA.type == 100 or bodyB.type == 100 then
        self.removebullet = true
    end
    if bodyA.type == 200 and bodyB.type == 100 then
        bodyA.isdead = true
    end
    if bodyA.type == 100 and bodyB.type == 200 then
        bodyB.isdead = true
    end
    if bodyA.type == 201 and bodyB.type == 100 then
        bodyA.isdead = true
    end
    if bodyA.type == 100 and bodyB.type == 201 then
        bodyB.isdead = true
    end
end

function LF_Bullet:onPreSolveContact(e)
end

function LF_Bullet:onPostSolveContact(e)
end

function LF_Bullet:onEndContact(e)
end
这是一个使用gideros-mobile用LUA编写的快速示例

关于box2d的一个必备网站当然是:

这是一个广泛的主题,你可能想关注一些youtube的Tut。即使它不是用py编写的,box2d的工作原理也是一样的,所以您只需要适应py。 一些可能有帮助的链接:


这就是我使用box2d学习的方式。希望这能有所帮助?

要回答你的第二个更复杂的评论,我添加它作为另一个答案

您不需要自己处理碰撞,Box2D会为您处理碰撞,但您需要进行设置

-创造你的世界

world = b2.World.new(0, 24, true)
-将侦听器连接到您的世界(用于冲突处理)

-在游戏循环中,您需要调用Box2D update

self.world:step(1/60, 1, 1)
-然后,答案是在这里,您可以检查这些box2d函数侦听器中每个对象的冲突

-- collisions handler
function LF_Bullet:onBeginContact(e)
    local bodyA = e.fixtureA:getBody()
    local bodyB = e.fixtureB:getBody()
    if bodyA.type == 100 or bodyB.type == 100 then
        self.removebullet = true
    end
    if bodyA.type == 200 and bodyB.type == 100 then
        bodyA.isdead = true
    end
    if bodyA.type == 100 and bodyB.type == 200 then
        bodyB.isdead = true
    end
    if bodyA.type == 201 and bodyB.type == 100 then
        bodyA.isdead = true
    end
    if bodyA.type == 100 and bodyB.type == 201 then
        bodyB.isdead = true
    end
end

function LF_Bullet:onPreSolveContact(e)
end

function LF_Bullet:onPostSolveContact(e)
end

function LF_Bullet:onEndContact(e)
end
这是一个用LU编写的快速示例