Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.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
尝试使用联系人侦听器。“倾听”;contact.End();不工作。(Box2d,iPhone)_Iphone_Cocos2d Iphone_Box2d_Collision_Kobold2d - Fatal编程技术网

尝试使用联系人侦听器。“倾听”;contact.End();不工作。(Box2d,iPhone)

尝试使用联系人侦听器。“倾听”;contact.End();不工作。(Box2d,iPhone),iphone,cocos2d-iphone,box2d,collision,kobold2d,Iphone,Cocos2d Iphone,Box2d,Collision,Kobold2d,MyContactListener类: h #导入“Box2D.h” #进口 #进口 结构MyContact{ b2Fixture*fixtureA; b2Fixture*fixtureB; 布尔运算符==(常量MyContact和其他)常量 { 返回(fixtureA==other.fixtureA)和&(fixtureB==other.fixtureB); } }; 类MyContactListener:公共b2ContactListener{ 公众: std::向量_触点; MyConta

MyContactListener类: h

#导入“Box2D.h”
#进口
#进口
结构MyContact{
b2Fixture*fixtureA;
b2Fixture*fixtureB;
布尔运算符==(常量MyContact和其他)常量
{
返回(fixtureA==other.fixtureA)和&(fixtureB==other.fixtureB);
}
};
类MyContactListener:公共b2ContactListener{
公众:
std::向量_触点;
MyContactListener();
~MyContactListener();
虚拟无效开始接触(b2Contact*contact);
虚拟无效结束触点(b2Contact*触点);
虚空预解(b2Contact*contact,常数b2Manifold*oldManifold);
虚空后解算(b2Contact*contact,常数b2ContactImpulse*impulse);
};

#导入“MyContactListener.h”
MyContactListener::MyContactListener():_contacts(){
}
MyContactListener::~MyContactListener(){
}
void MyContactListener::BeginContact(b2Contact*contact){
//我们需要复制数据,因为B2B联系人传入了
//重复使用。
MyContact MyContact={contact->GetFixtureA(),contact->GetFixtureB()};
_触点。推回(myContact);
}
void MyContactListener::EndContact(b2Contact*contact){
MyContact MyContact={contact->GetFixtureA(),contact->GetFixtureB()};
std::vector::iterator pos;
pos=std::find(_contacts.begin(),_contacts.end(),myContact);
如果(位置=_contacts.end()){
_触点。擦除(pos);
}
}
void MyContactListener::PreSolve(b2Contact*contact,const b2Manifold*oldManifold){
}
void MyContactListener::PostSolve(b2Contact*触点,常量b2ContactImpulse*脉冲){
}
现在的问题是:在我的更新方法中,如果联系人*结束*,我有以下代码来检查冲突:

std::vector::iterator pos3;
对于(pos3=contactListener->_contacts.end();
pos3!=contactListener->_contacts.begin();++pos3){
MyContact contact=*pos3;//这里我得到了“EXE\u BAD\u访问”
if(contact.fixtureA==detectorFixture | | contact.fixtureB==detectorFixture){
}
}
但是我犯了一个错误。(在代码中标记为注释)

要检查触点是否开始碰撞,我有以下代码:

std::vector<MyContact>::iterator pos;
    for(pos = contactListener->_contacts.begin(); 
        pos != contactListener->_contacts.end(); ++pos) {
        MyContact contact = *pos;

        if (contact.fixtureA == detectorFixture || contact.fixtureB == detectorFixture) {
        }

    }
std::vector::iterator pos;
对于(pos=contactListener->_contacts.begin();
pos!=contactListener->_contacts.end();++pos){
MyContact contact=*位置;
if(contact.fixtureA==detectorFixture | | contact.fixtureB==detectorFixture){
}
}
注意“for”语句,我将.begin()替换为.end()。这就是区别

但是为什么它不起作用呢?如果“触点结束”,我检查夹具时是否做错了什么

我之所以想这样做,是因为我现在想知道夹具是否接触到任何东西/什么都没有

for(pos3 = contactListener->_contacts.end(); 
        pos3 != contactListener->_contacts.begin(); ++pos3)
我认为你应该用以下内容来代替:

for(pos3 = contactListener->_contacts.begin(); 
        pos3 != contactListener->_contacts.end(); ++pos3)

但那不是我想要的。如果某物与某物有接触,它将被调用。但我想把尸体分开后再去睡一觉。但我还是找到了解决办法。(参见box2d,我刚刚从那里复制了联系人侦听器。)
std::vector<MyContact>::iterator pos;
    for(pos = contactListener->_contacts.begin(); 
        pos != contactListener->_contacts.end(); ++pos) {
        MyContact contact = *pos;

        if (contact.fixtureA == detectorFixture || contact.fixtureB == detectorFixture) {
        }

    }
for(pos3 = contactListener->_contacts.end(); 
        pos3 != contactListener->_contacts.begin(); ++pos3)
for(pos3 = contactListener->_contacts.begin(); 
        pos3 != contactListener->_contacts.end(); ++pos3)