0

_world-> step(dt、5,5)を使用して衝突システムを検出しています。したがって、衝突は実際にはbox2dクラスによって処理されています。衝突したボールに応じて、ボールの衝突のスコアを表示したいですか?

誰かがこれを手伝ってくれませんか?必要に応じて、ティック関数のソースコードを提供できます。

あなたの助けに感謝します。

ありがとうございました、

アンキタ

4

4 に答える 4

1

まず、C++クラスb2ContactListenerをサブクラス化します。次に例を示します。

class GamePhysicsContactListener : public b2ContactListener 
{
public:
    GamePhysicsContactListener();   
    ~GamePhysicsContactListener();  
    void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);

};

PostSolve以下を使用して、接触している2つのボディをチェックするメソッドを実装します。

b2Body *bodyA = contact->GetFixtureA()->GetBody();
b2Body *bodyB = contact->GetFixtureB()->GetBody();

最後に、インスタンス化するメソッドb2World(おそらくCCLayerinitメソッド)で以下の行を呼び出して、リスナーをインスタンス化します。

_world->SetContactListener(new GamePhysicsContactListener());

p / s:GamePhysicsContactListenerクラスで連絡先チェックロジックを実行する代わりに、NSInvocationを使用して呼び出されるターゲットとセレクターを受け入れるようにそのクラスを作成することもできます。ただし、それはもう少し複雑になります。

編集:

これがGamePhysicsContactListenerの実用的な実装です:https ://gist.github.com/922824 (これはCocos2DとBox2Dクラスを橋渡しする私のプライベートGamePhysicsフレームワークの一部です)

于 2011-04-15T16:52:14.290 に答える
0

各ボディのフィクスチャを作成し、ティック機能で衝突をチェックします。

if((contact.fixtureA == fixture1 && contact.fixtureB == fixture2) ||
(contact.fixtureA == fixture2 && contact.fixtureB == fixture1))
{
//do something
}

お役に立てれば!!!!

于 2011-04-15T16:51:09.503 に答える
0

これは、衝突時に小さなアニメーションを表示するために使用している方法です。アニメーションの代わりにラベルを表示するように簡単に変更できます。

-(void) paintCollisionImage:(CGPoint) point{

CGSize screenSize = self.view.bounds.size;

CGRect myImageRect = CGRectMake((point.x -24), ((screenSize.height - point.y) -24), 48.0f, 48.0f);

NSArray *myImages = [NSArray arrayWithObjects: 
    [UIImage imageNamed:@"collideImage0.png"], 
    [UIImage imageNamed:@"collideImage1.png"], 
                     nil];
UIImageView *myAnimatedView = [UIImageView alloc]; 

[myAnimatedView initWithFrame:myImageRect]; 
myAnimatedView.animationImages = myImages; 
myAnimatedView.animationDuration = 0.25; // seconds 
myAnimatedView.animationRepeatCount = 1; // 0 = loops forever 

[myAnimatedView startAnimating]; 
[self.view addSubview:myAnimatedView]; 
[myAnimatedView release];

}

私はそれをそのように呼びます:

[self paintCollisionImage:collisionPoint];
于 2011-04-15T21:52:41.240 に答える
0

私は同じ問題に直面していました。プレイヤーがパワーを打ったときにラベルを表示したかった。このために、シーンにラベルを追加する静的関数をCCSceneで作成しました。そして、ContactListenerで、beginContactメソッドでシーンオブジェクトを初期化してから、シーン関数を呼び出しました。

+(void)addPointLabel  
{  
    DataClass *d5=[DataClass getInstance];  
   [_label setString:@"+10"];        // Define label in init  
    _label.color = ccc3(0,255,0);  
    _label.position = ccp(d5.playerXPosition,d5.playerYPosition);  
    [self addChild:_label];  
    d5.lbl=_label;  
    id action1 = [CCMoveTo actionWithDuration:2 position:ccp(d5.playerXPosition,d5.playerYPosition+20)];  
    id action2 = [CCFadeOut actionWithDuration:1.0f];  
    [_label runAction: [CCSequence actions:action1,action2,  nil]];    
}  

次に、ContactListenerクラスでこのメソッドを呼び出します。

[GameScene addPointLabel];  
于 2011-05-05T06:52:31.633 に答える