0
MyContactListener 클래스 : .HContact Listener를 사용하려고합니다. "contact.End()"가 작동하지 않습니다. (Box2D의, 아이폰)
#import "Box2D.h"
#import <vector>
#import <algorithm>
struct MyContact {
b2Fixture *fixtureA;
b2Fixture *fixtureB;
bool operator==(const MyContact& other) const
{
return (fixtureA == other.fixtureA) && (fixtureB == other.fixtureB);
}
};
class MyContactListener : public b2ContactListener {
public:
std::vector<MyContact>_contacts;
MyContactListener();
~MyContactListener();
virtual void BeginContact(b2Contact* contact);
virtual void EndContact(b2Contact* contact);
virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);
virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);
};
이제 .mm
#import "MyContactListener.h"
MyContactListener::MyContactListener() : _contacts() {
}
MyContactListener::~MyContactListener() {
}
void MyContactListener::BeginContact(b2Contact* contact) {
// We need to copy out the data because the b2Contact passed in
// is reused.
MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };
_contacts.push_back(myContact);
}
void MyContactListener::EndContact(b2Contact* contact) {
MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };
std::vector<MyContact>::iterator pos;
pos = std::find(_contacts.begin(), _contacts.end(), myContact);
if (pos != _contacts.end()) {
_contacts.erase(pos);
}
}
void MyContactListener::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) {
}
void MyContactListener::PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) {
}
문제 : 내 업데이트 방법에서 나는 충돌을 확인하는 코드가있는 경우 접촉 * 끝 * :
std::vector<MyContact>::iterator pos3;
for(pos3 = contactListener->_contacts.end();
pos3 != contactListener->_contacts.begin(); ++pos3) {
MyContact contact = *pos3; // here I get "EXE_BAD_ACCESS"
if (contact.fixtureA == detectorFixture || contact.fixtureB == detectorFixture) {
}
}
하지만 오류가 있습니다. 접촉를 시작하는 경우 충돌을 확인하려면
(주석으로 코드에 표시) I가 작동이 코드 :
std::vector<MyContact>::iterator pos;
for(pos = contactListener->_contacts.begin();
pos != contactListener->_contacts.end(); ++pos) {
MyContact contact = *pos;
if (contact.fixtureA == detectorFixture || contact.fixtureB == detectorFixture) {
}
}
주의가 문 "에 대해"나는 .begin를 교환() .end(). 그것이 차이점입니다.
하지만 왜 작동하지 않습니까? "콘택트가 끝나면"조명기를 점검하는 데 뭔가 잘못 됐습니까?
내가 이것을하고 싶은 이유는 조명기가 아무것도/아무것도 건드리지 않으면 지금하고 싶다.
하지만 그건 내가 원하는 게 아니에요. 무언가와의 접촉이있는 경우 호출됩니다. 그러나 나는 시체를 구별하고 싶다. 그러나 나는 여전히 해결책을 찾았다. (box2d, 방금 연락처 청취자를 복사했습니다.) – cocos2dbeginner