私は、特定のb2bodyが他の何か(すべてではない)と衝突したときにメソッドを呼び出す方法に関するOBJ-Cベースのチュートリアルを何週間も探していました。
基本的に、ブロックは毎秒地面に落ちます。これは問題なく機能しますが、地面またはプレーヤーに当たると、ブロックが削除され、ブロックの一部(別のオブジェクト)が生成されるはずです。
誰かがこれを行う方法を教えてもらえますか?
どんな助けでも熱くなります
ありがとう
私は、特定のb2bodyが他の何か(すべてではない)と衝突したときにメソッドを呼び出す方法に関するOBJ-Cベースのチュートリアルを何週間も探していました。
基本的に、ブロックは毎秒地面に落ちます。これは問題なく機能しますが、地面またはプレーヤーに当たると、ブロックが削除され、ブロックの一部(別のオブジェクト)が生成されるはずです。
誰かがこれを行う方法を教えてもらえますか?
どんな助けでも熱くなります
ありがとう
これが必要なものだと思います。MycontactListenerを含める必要があります
-(void) checkForHit{
std::vector<b2Body *>toDestroy;
std::vector<MyContact>::iterator pos;
for(pos = _contactListener->_contacts.begin(); pos != _contactListener->_contacts.end(); ++pos) {
MyContact contact = *pos;
bodyA = contact.fixtureA->GetBody();
bodyB = contact.fixtureB->GetBody();
if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) {
spriteA = (CCSprite *) bodyA->GetUserData();
spriteB = (CCSprite *) bodyB->GetUserData();
//NSLog(@”sprite tag is %d”,spriteA.tag);
if (spriteA.tag == 50) {
if (std::find(toDestroy.begin(), toDestroy.end(), bodyB) == toDestroy.end()) {
toDestroy.push_back(bodyB);
}
}
std::vector<b2Body *>::iterator pos2;
for(pos2 = toDestroy.begin(); pos2 != toDestroy.end(); ++pos2) {
b2Body *body = *pos2;
if (body->GetUserData() != NULL) {
CCSprite *sprite = (CCSprite *) body->GetUserData();
[self removeChild:sprite cleanup:YES];
}
_world->DestroyBody(body);
}
または、連絡先リスナーを使用したくない場合は、地面のボディと破壊したいボディのフィクスチャを作成し、次のコードを使用して、交差しているかどうかを確認して破壊することができます...
if((contact.fixtureA == groundFixture && contact.fixtureB == bodyFixture) ||
(contact.fixtureA == bodyFixture&& contact.fixtureB == groundFixture ))
{
//destroy the body
}
オブジェクトが地面に落ちたときに、開始速度を作成し、それをupdateメソッドで特定の量だけ増やすことで、非常に単純な物理を作成できることに気付きました。
衝突の場合、オブジェクトはすべて48ポイント幅のグリッドに収まるため、単純な長方形の衝突検出を行うことができます。