我有两个物理体都是非动态的(静态的)
当我触摸物体时,它随着触摸一起移动,当两个物体碰撞时
-BeginContact:没有调用
这是我的两个对象
SKSpriteNode *bg= [SKSpriteNode spriteNodeWithImageNamed:@"wood.png"];
bg.position = CGPointMake(60, self.frame.size.height/2);
bg.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path2];
bg.name = @"wood";
bg.physicsBody.usesPreciseCollisionDetection = YES;
bg.physicsBody.dynamic = NO;
[self addChild:bg];
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"wood2.png"];
sprite.position = CGPointMake(self.frame.size.width-40, self.frame.size.height/2+40);
sprite.name = @"woods";
sprite.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
sprite.physicsBody.usesPreciseCollisionDetection = YES;
sprite.physicsBody.dynamic = NO;
[self addChild:sprite];
这里我将移动一个物体,我试图触碰另一个物体,它们不会碰撞
请帮帮我 提前致谢
答案 0 :(得分:0)
您需要设置对象的bitMask属性。这些属性包括:
self.physicsBody.categoryBitMask
self.physicsBody.collisionBitMask
self.physicsBody.contactTestBitMask
然后你需要有代码来检查联系。
- (void)didBeginContact:(SKPhysicsContact *)contact
{
uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
if (collision == (CNPhysicsCategoryObjectA | CNPhysicsCategoryObjectB))
{
// do whatever
}
}
您还可以使用- (void)didEndContact:(SKPhysicsContact *)contact
方法检查联系人是否已结束。
阅读关于模拟物理的Sprite Kit编程指南部分。 Working with Collisions and Contacts部分将更详细地解释它。
使用碰撞和联系人
迟早,两具尸体会试图占据同一个空间。您可以自行决定游戏的响应方式。 Sprite Kit在物理实体之间使用两种相互作用:
当您需要知道两个身体相互接触时,会使用联系人。在大多数情况下,当您需要在发生碰撞时进行游戏更改时,可以使用联系人。
碰撞用于防止两个物体相互穿透。当一个物体撞击另一个物体时,Sprite Kit会自动计算碰撞的结果并对碰撞中的物体施加冲动。
您的游戏配置场景中的物理实体以确定何时应发生碰撞以及物理实体之间的交互何时需要执行其他游戏逻辑。限制这些交互不仅对定义游戏逻辑很重要,而且为了从Sprite Kit获得良好性能也是必要的。 Sprite Kit使用两种机制来限制每个帧中的交互次数:
基于边缘的物理实体从不与其他基于边缘的实体交互。这意味着即使您通过重新定位节点来移动基于边缘的实体,物理实体也不会相互碰撞或相互接触。
每个物理机构都被分类。类别由您的应用定义;每个场景最多可以有32个类别。配置物理实体时,可以定义它所属的类别以及要与之交互的实体类别。联系人和碰撞是单独指定的。