_world-> step(dt、5,5)を使用して衝突システムを検出しています。したがって、衝突は実際にはbox2dクラスによって処理されています。衝突したボールに応じて、ボールの衝突のスコアを表示したいですか?
誰かがこれを手伝ってくれませんか?必要に応じて、ティック関数のソースコードを提供できます。
あなたの助けに感謝します。
ありがとうございました、
アンキタ
_world-> step(dt、5,5)を使用して衝突システムを検出しています。したがって、衝突は実際にはbox2dクラスによって処理されています。衝突したボールに応じて、ボールの衝突のスコアを表示したいですか?
誰かがこれを手伝ってくれませんか?必要に応じて、ティック関数のソースコードを提供できます。
あなたの助けに感謝します。
ありがとうございました、
アンキタ
まず、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フレームワークの一部です)
各ボディのフィクスチャを作成し、ティック機能で衝突をチェックします。
if((contact.fixtureA == fixture1 && contact.fixtureB == fixture2) ||
(contact.fixtureA == fixture2 && contact.fixtureB == fixture1))
{
//do something
}
お役に立てれば!!!!
これは、衝突時に小さなアニメーションを表示するために使用している方法です。アニメーションの代わりにラベルを表示するように簡単に変更できます。
-(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];
私は同じ問題に直面していました。プレイヤーがパワーを打ったときにラベルを表示したかった。このために、シーンにラベルを追加する静的関数を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];