这确实是一个基本的问题,但我正在用一个物理体移动一个精灵A,而不是另一种有另一个物理体的精灵B。我预计这些机构会调用碰撞回调oncontact。它们使用setCategoryBitmask()
设置各自的类别位掩码,并使用setContactTestBitmask()
分别设置彼此的类别。
只要我不移动sprite A,冲突就能工作。我假设问题是我使用cocos2d操作移动sprite A,我需要做一些其他的事情。但是使用cocos2d操作来编写这样的脚本在我看来比我能想到的任何事情都简单得多。
还有别的捷径吗?还是我错过了别的什么?
发布于 2016-03-03 23:59:07
最后,我做了“在update()中做我自己的碰撞检测”。这不是太成问题。
像这样的更新()..。
const Rect RECT_A = spriteA->getBoundingBox();
for (auto spriteB : someparent->getChildren()) {
const Rect RECT_B = spriteB->getBoundingBox();
if (RECT_A.intersectsRect(RECT_B)) {
// Hit
}
}
发布于 2016-03-09 06:13:56
接触检测应该是好的,而结肠不起作用。
Scene* HelloWorld::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::createWithPhysics();
// 'layer' is an autorelease object
auto layer = HelloWorld::create();
// add layer as a child to scene
scene->addChild(layer);
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
scene->getPhysicsWorld()->setGravity(Vec2::ZERO);
// return the scene
return scene;
}
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
auto createSprite = [this](const Vec2& pos) {
auto sprite = Sprite::create();
auto bodyA = PhysicsBody::createCircle(20);
sprite->setPhysicsBody(bodyA);
sprite->setPosition(pos);
bodyA->setCollisionBitmask(0xff);
bodyA->setCategoryBitmask(0xff);
bodyA->setContactTestBitmask(0xff);
return sprite;
};
auto spriteA = createSprite(Vec2(300, 300));
auto moveBy = MoveBy::create(1.f, Vec2(200, 200));
spriteA->runAction(moveBy);
auto spriteB = createSprite(Vec2(350, 350));
addChild(spriteA);
addChild(spriteB);
auto contactListener = EventListenerPhysicsContact::create();
contactListener->onContactBegin = [=](PhysicsContact& contact) {
auto a = contact.getShapeA()->getBody()->getNode();
auto b = contact.getShapeB()->getBody()->getNode();
assert((a == spriteA && b == spriteB) || (a == spriteB && b == spriteA));
log("It is working");
return false;
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);
return true;
}
https://stackoverflow.com/questions/35787782
复制