cocos2dx 에서 Physics 객체들끼리 충돌을 체크하기 위해선
EventListnerPhysicsContact 이벤트를 생성해주어야한다.
사용의예
auto colide = EventListenerPhysicsContact::create();
colide->onContactBegin = std::bind(&Unit::physicsContact,this,std::placeholders::_1);
_eventDispatcher->addEventListenerWithSceneGraphPriority(colide, this);
함수를 Bind 해서 이벤트 등록을 진행해줘야한다.
그리고 충돌을 확인할 Physics 객체들간
BitMask를 입력해주고 bind 할 함수에서 충돌체크를 진행해주어야한다.
예)
PhysicsBody* a = PhysicsBody::createBox(Size(20,20));
a->setCollisionBitmask(TAG_VALUE_FIRST);
a->setContactTestBitmask(TAG_VALUE_FIRST);
PhysicsBody* b = PhysicsBody::createBox(Size(30,30));
b->setCollisionBitmask(TAG_VALUE_SECOND);
b->setContactTestBitmask(TAG_VALUE_SECOND);
/*
각클래스 에서 지정하여도되며 인스턴스를 생성하고 PhysicsBody에 비트마스크 값을 지정해도무관하다.
(단 비트마스크 값은 16진수 값으로 지정할것. )
*/
bind 함수 사용예제
bool HelloWorld::physicsContact(PhysicsContact& c) {
PhysicsBody* aBody = c.getShapeA()->getBody();
PhysicsBody* bBody = c.getShapeB()->getBody();
if (aBody->getContactTestBitmask() == TAG_VALUE_FIRST&&
bBody->getContactTestBitmask() ==
TAG_VALUE_FIRST_SECOND) {
bBody->removeFromWorld();
return false;
}
if (bBody->getContactTestBitmask() == TAG_VALUE_FIRST&&
aBody->getContactTestBitmask() == TAG_VALUE_FIRST_SECOND) {
aBody->removeFromWorld();
return false;
}
return true;
}
바인드를할 함수의 내용중에서 ShapeA 와 shapeB 가 있다. 하지만
어떤것이 A가 되고 B될지 알수없다.
그래서 A일경우 B일경우 지정해줘야한다. 그리고 위코드는 충돌할시
TAG_VALUE_SECOND 인 PhysicsBody 를 삭제해주는 코드이다.
return false 를 이유는 충돌한 객체들간 통과 즉 oneWay를 위해.
return 값을 false 로 지정해주었다. 만약 return true 로 지정하면.
각객체들간 충돌이 발생하고 충돌했을시의 restitution 이나 잠시 멈춤현상이 발생할것으로 판단되어 충돌할시
각 PhysicsBody 간은 충돌되지 않도록 하였고 충돌판단시 삭제로 진행하였다.
Cocos2d-x Camera (0) | 2017.10.20 |
---|---|
Cocos2d-x Camera Option 관련. (0) | 2017.10.19 |
Localzation 관련. (0) | 2017.10.12 |
Physics Basic - 2 (0) | 2017.08.23 |
Cocos2d-X , Physics Basic (0) | 2017.08.21 |
cocos2dx Create Project (31) | 2017.07.27 |