0

私は主にユーザーデータを CCPhysicsSprite に設定して以来、ずっと CCPhysicsSprite クラス内で連絡先を処理してきました。以下のように:

ContactListenerClass.mm:

void ContactListenerClass:: BeginContact(b2Contact *contact){

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();

[physicsSprite spritesHadContact:physicsSprite2];

}

spritesHadContact メソッドは、CCPhysicsSprite.mm クラスにあります。

-(void)spritesHadContact:(CCPhysicsSprite*)secondPhysicsSprite {
    int tag1 = self.tag;
    int tag2 = secondPhysicsSprite.tag;

    if ((tag1 == 30) && (tag2 == 40 )) || ((tag1 == 40) && (tag2 == 30))  {
      CCLOG(@"proceed to handle contact");
    }

上記の例は少し単純です。しかし、ジョイントの作成と破棄を開始したとき、接触を処理する CCPhysicsSprite 以外のクラスを使用する方がよいことに気付きました。それを行うクラス(contactHandler)を作ったのですが、うまくいきません。何を間違えたのかわからない。下記を参照してください:

ContactHandler.h:

#import "CCPhysicsSprite.h"

@interface ContactHandler : CCPhysicsSprite {

}

-(void)spritesHadContact:(CCPhysicsSprite*)firstPhysicsSprite otherSprite:(CCPhysicsSprite*)secondPhysicsSprite;

@end

ContactHandler.mm:

#import "ContactHandler.h"

@implementation ContactHandler

-(void)spritesHadContact:(CCPhysicsSprite*)firstPhysicsSprite otherSprite:(CCPhysicsSprite*)secondPhysicsSprite {
int tag1 = firstPhysicsSprite.tag;
int tag2 = secondPhysicsSprite.tag;

    if ((tag1 == 30) && (tag2 == 40 )) || ((tag1 == 40) && (tag2 == 30))  {
      CCLOG(@"proceed to handle contact");
}
@end

ContactListenerClass.h:

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "Box2D.h"
#import "ContactHandler.h"


class ContactListenerClass : public b2ContactListener    {
public:
    ContactHandler* contactHandler;

       void BeginContact(b2Contact* contact);

};

ContactListenerClass.mm:

#import "ContactListenerClass.h"
#import "HelloWorldLayer.h"


void ContactListenerClass:: BeginContact(b2Contact *contact)
{


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();

[contactHandler spritesHadContact:physicsSprite otherSprite:physicsSprite2];

}

更新しました

ContactHandler クラスの spritesHadContact メソッドが、CCLOG をコンソールに出力していません。どのコンタクトが行われているかを確認するために CCLOG を試みましたが、メソッドはコンタクトを認識しません。

4

0 に答える 0