1

我有一个联系人监听器来处理两个 box2d 身体之间的联系。我正在从 HelloWorldLayer 中的 Contacter 访问主体,因为 box2d 建议应保存联系主体并在时间步之后实施更改。请看下面的代码:

联系人.h:

#import "CCPhysicsSprite.h"

@interface Contacter : CCPhysicsSprite {

}

@property(nonatomic, assign) NSMutableArray* arrayOfBodies;
@property(nonatomic, assign) CCPhysicsSprite* spriteToDestroy;


-(void)physicsSpritesContact:(CCPhysicsSprite*)onePhysicsSprite otherSprite:(CCPhysicsSprite*)twoPhysicsSprite;

@end

联系人.mm:

#import "Contacter.h"
#import "Box2D.h"

@implementation Contacter

@synthesize arrayOfBodies = _arrayOfBodies;
@synthesize spriteToDestroy = _spriteToDestroy;

-(void)destroyBodies:(b2Body*)body   {
    _arrayOfBodies = [[NSMutableArray alloc] init];
    NSValue *bodyValue = [NSValue valueWithPointer:body];
    [_arrayOfBodies addObject:bodyValue];
}

-(void)physicsSpritesContact:(CCPhysicsSprite*)onePhysicsSprite otherSprite:   (CCPhysicsSprite*)twoPhysicsSprite; {
int firstTag = onePhysicsSprite.tag;
int secondTag = twoPhysicsSprite.tag;

if (((firstTag == 90) && (secondTag == 101 )) || ((firstTag == 101) && (secondTag == 90))) {

    if (tag1 == 90) {
        [self destroyBodies:onePhysicsSprite.b2Body];// adds body to array to be destroyed
        spriteToDestroy = onePhysicsSprite; // taking note of sprite to be destroyed

    }
    else if (tag2 == 90)   {
        [self destroyBodies:twoPhysicsSprite.b2Body];
        spriteToDestroy = twoPhysicsSprite;
    }
}

}

HelloWorldLayer.mm 中的以下方法在 update 方法中被调用:

-(void)removeDestroyedBodiesAndSprites  {
bodyContact = [Contacter node];    
if ([bodyContact arrayOfBodies]) {


for (NSValue* bodyValue in [bodyContact arrayOfBodies]) {
    b2Body *removeBody;
    removeBody = (b2Body*)[bodyValue pointerValue];

    world->DestroyBody(removeBody);
    removeBody = NULL;
    [self removeChild:[bodyContact spriteToDestroy]];
       }
    }
}

在 removeDestroyedBodiesAndSprites 中有接触,但精灵没有被移除,并且身体没有被破坏。在使用 CCLOG 进行测试后,我发现 for 循环不满意,这意味着 arrayOfBodies 可能为空。自从建立联系以来,这令人惊讶。我会很感激你的帮助。

更新

以下是联系人监听器:

TestContactListener.h:

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "Box2D.h"
#import "GameObjects.h"
#import "Contacter.h"


class TestContactListener : public b2ContactListener    {
public:
    Contacter* contacter;

    void BeginContact(b2Contact* contact);
};

TestContactListener.mm:

#import "TestContactListener.h"

void TestContactListener:: BeginContact(b2Contact *contact)
{
    contacter = [Contacter node];

    b2Fixture       *fixtureA = contact->GetFixtureA();
    b2Fixture       *fixtureB = contact->GetFixtureB();
    b2Body          *fixtureABody = fixtureA->GetBody();
    b2Body          *fixtureBBody = fixtureB->GetBody();

    CCPhysicsSprite* physicsSprite = (CCPhysicsSprite*)fixtureABody->GetUserData();
    CCPhysicsSprite* physicsSprite2 = (CCPhysicsSprite*)fixtureBBody->GetUserData();

    [contacter physicsSpritesContact:physicsSprite otherSprite:physicsSprite2];

}
4

2 回答 2

1

将它从destroyBodies方法移动到init方法,因此它只被调用一次:

_arrayOfBodies = [[NSMutableArray alloc] init];
于 2013-05-22T17:21:58.597 回答
0

好好看看你的 destroyBodies 方法。每次调用它时,您都会创建一个新数组,替换任何现有数组。因此,您只会销毁您传递给该方法的最后一个主体。

如果您不使用 ARC,您还将泄漏所有替换的数组。

于 2013-05-22T09:13:44.967 回答