c++ - 在接触监听器类中创建焊缝的问题

标签 c++ cocos2d-iphone box2d box2d-iphone

我设置了一个接触监听器,当两个物体之间建立接触时,它会创建一个焊缝。当 body 接触时,我不断收到指向这条线的 SIGABRT

b2Assert(IsLocked() == false);

在方法中

b2Joint* b2World::CreateJoint(const b2JointDef* def)

在类里面

b2World.cpp

以下是接触监听器类: SubcContactListener.h:

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "Box2D.h"
#import "Spriter.h"
#import "CreateRope.h"

class SubcContactListener : public b2ContactListener    {
public:
void     *helloWorldLayer;

b2WeldJoint *weldJoint;
b2World *world;

void BeginContact(b2Contact* contact);
void EndContact(b2Contact* contact);
void createWeldJoint(b2Body* ABody ,b2Body* BBody);
//void destroyWeldJoint(b2WeldJoint *weldJoint);

};

SubcContactListener.mm:

#import "SubcContactListener.h"
#import "HelloWorldLayer.h"


void SubcContactListener:: BeginContact(b2Contact *contact) {

}

void SubcContactListener:: EndContact(b2Contact *contact)   {
b2Fixture       *fixtureA = contact->GetFixtureA();
b2Fixture       *fixtureB = contact->GetFixtureB();
b2Body          *fixtureABody = fixtureA->GetBody();
b2Body          *fixtureBBody = fixtureB->GetBody();

// We don't care about collisions that don't involve two bodies.
if (helloWorldLayer && fixtureABody && fixtureBBody)
{

    if(fixtureABody != NULL && fixtureBBody != NULL){
        createWeldJoint(fixtureABody, fixtureBBody);
    }

}

}
void SubcContactListener:: createWeldJoint(b2Body* ABody ,b2Body* BBody)    {

// The sprite tag is 1 for the spriter sprite and 3 for the rope links.
if (ABody && BBody)
//{
    CCSprite            *bodyASprite = (CCSprite *) ABody->GetUserData();
    CCSprite            *bodyBSprite = (CCSprite *) BBody->GetUserData();
    NSInteger           bodyASpriteTag = bodyASprite.tag;
    NSInteger           bodyBSpriteTag = bodyBSprite.tag;

    if (((bodyASpriteTag == 1) && (bodyBSpriteTag == 3)) ||
        ((bodyASpriteTag == 3) && (bodyBSpriteTag == 1)))
    {

        //creation of weldjoint
        if ( ABody!= NULL && BBody != NULL) {


        b2WeldJointDef      weldJointDef;
        weldJointDef.Initialize(ABody,
                                BBody,
                                ABody->GetWorldCenter());
        weldJointDef.collideConnected = false;

        weldJoint = (b2WeldJoint*) ABody->GetWorld()->CreateJoint(&weldJointDef);
        }
    }
}

}

也在 HelloWorldLayer.mm initPhysics 方法中:

// Create contact listener
contactListener = new SubcContactListener();
contactListener->helloWorldLayer = self;
world->SetContactListener(contactListener);

从报错来看我觉得跟焊缝有关系,只是不太确定。请帮忙。

最佳答案

您不能在回调中修改世界。 assert 语句声明它已锁定世界以开始模拟步骤,因此不允许您执行该操作。

这个问题通过缓存接触事件并在模拟步骤后处理它们来解决。

关于c++ - 在接触监听器类中创建焊缝的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13364716/

相关文章:

ios - 如何使用 CCClippingNode 来剪切 CCTableView 的顶部和底部

iphone - cocos2D 中持续的基于时间的计算应该放在哪里?

java - 如何在libGDX中以相反的方式射击子弹

java - 将 Box2D 主体创建与实体组件系统集成

c++ - 将(n 个第一个字节的)unsigned char 指针转换为 float 和 double C++

c++ - 带有 Win32 HWND 嵌入的 Qt5 QWidget::create() 在从 Qt4 移植后不再工作

c# - 在 visual studio 2013 中设置发布项目

iphone - b2 body 问题

java - libgdx - box2d 速度和力不起作用

c++ - constexpr 变量的初始化