我在一个SKScene中有两个不同的固定SKPhysicsBody。两者之间唯一的区别是它们的categoryBitMask。一个的categoryBitMask为512,另一个为1024。
static const u_int32_t kWallCategory = 0x1 << 9; //512
static const u_int32_t kStructureCategory = 0x1 << 10; //1024在我的程序中,我有一个从-(void)didBeginContact:(SKPhysicsContact *)contact调用的标准联系处理程序,它的开头是:
-(void)handleContact:(SKPhysicsContact*)contact {
SKPhysicsBody *bodyA = contact.bodyA;
SKPhysicsBody *bodyB = contact.bodyB;
int type1 = contact.bodyA.categoryBitMask;
int type2 = contact.bodyB.categoryBitMask;为此,我访问了SKPhysicsContact的contactNormal属性
CGVector c = contact.contactNormal;然而,我注意到的是,接触向量是不一致的,我确定这是因为有时SKPhysicsContact的bodyA是固定体,有时bodyA是动态体。
例如,当子弹(动态体)从左侧击中建筑物(固定体)时,我希望每次接触向量都为(-1,0)。
我的问题:在其他条件相同的情况下(物理属性等)什么决定了什么是bodyA,什么是SKPhysicsContact中的bodyB?
发布于 2017-01-09 05:49:55
在修改了每个SKPhysicsBody的几个方面(质量、摩擦力、categoryBitmask等)之后,我已经确定了SKPhysicsContact.bodyA和SKPhysicsContact.bodyB之间的确定完全基于何时将SKPhysicsBody添加到场景中
下面是一个突出区别的示例:
SKPhysicsBody *bullet从左边击中了SKPhysicsBody *building。
情况1:如果在*bullet之前将*building添加到场景中,则SKPhysicsContact.contactNormal为:(-1,0),因为SKPhysicsContact.bodyA为*building,因此接触向量是接触*building的位置(即左侧)。
案例2:如果在*bullet之后将*building添加到场景中,则SKPhysicsContact.contactNormal为:(1,0),因为SKPhysicsContact.bodyA现在为*bullet,因此接触向量是接触*bullet的位置(即右侧)。
Problem
因为*bullet和*building实体是在程序中的不同时间添加的,所以我需要实现一种方法,在该方法中,我始终知道SKPhysicsContact.bodyA和SKPhysicsContact.bodyB是什么,更重要的是,实现一种保持SKPhysicsContact.contactNormal一致性的方法。
解决方案
确定确定冲突来源所需的SKPhysicsBody,并设置physicsBody.categoryBitMask
static const u_int32_t kProjectileCategory = 0x1 << 1; //Dynamic body
//Make everything with bitmask > 32 will be set for the fixed bodies
static const u_int32_t kStructureCategory = 0x1 << 10; //Fixed body然后,在联系人处理程序中:
-(void)handleContact:(SKPhysicsContact*)contact {
//bodyA will be the SKPhysicsBody that was added to the SKScene before bodyB
SKPhysicsBody *bodyA = contact.bodyA;
//bodyB will be the SKPhysicsBody that was added to the SKScene after bodyA
SKPhysicsBody *bodyB = contact.bodyB;
int categoryBitmask1 = contact.bodyA.categoryBitMask;
int categoryBitmask2 = contact.bodyB.categoryBitMask;
CGVector v;
//If the categoryBitmask of bodyA is lower, we will get the contact vector from the Dynamic body, which we don't want
if (categoryBitmask1 < categoryBitmask2)
{
//Since we always want the contact vector determined FROM the fixed body (higher category bitmask), we have to get the reciprocal contact vector in the case that bodyA is the dynamic (non-fixed) body
v = CGVectorMake(contact.contactNormal.dx * -1, contact.contactNormal.dy * -1);
} else {
//If the categoryBitmask
v = contact.contactNormal;
}https://stackoverflow.com/questions/41536939
复制相似问题