我知道为什么我的didBeginContact方法永远不会被解雇?球体和矩形实际上是相互接触的......
这里我宣布两个类别
static const uint32_t rectangleCategory = 0x1 << 0;
static const uint32_t ballCategory = 0x1 << 1;
此方法创建一个球体
- (SKSpriteNode *)createSphereNode
{
SKSpriteNode *sphereNode =
[[SKSpriteNode alloc] initWithImageNamed:@"sphere.png"];
sphereNode.name = @"sphereNode";
sphereNode.physicsBody.categoryBitMask = ballCategory;
sphereNode.physicsBody.contactTestBitMask = rectangleCategory;
return sphereNode;
}
此方法创建一个矩形
- (void) createRectangle
{
SKSpriteNode *rectangle = [[SKSpriteNode alloc] initWithImageNamed:@"balk.png"];
rectangle.position = CGPointMake(randomBetween(0, self.size.width),
self.size.height);
rectangle.name = @"rectangleNode";
rectangle.physicsBody =
[SKPhysicsBody bodyWithCircleOfRadius:(rectangle.size.width/2)-7];
rectangle.physicsBody.usesPreciseCollisionDetection = YES;
rectangle.physicsBody.categoryBitMask = rectangleCategory;
rectangle.physicsBody.contactTestBitMask = ballCategory;
[self addChild:rectangle];
}
这是不会触发的didBeginContact方法
- (void) didBeginContact:(SKPhysicsContact *)contact
{
NSLog(@"Contact begin");
SKSpriteNode *firstNode, *secondNode;
firstNode = (SKSpriteNode *)contact.bodyA.node;
secondNode = (SKSpriteNode *) contact.bodyB.node;
if ((contact.bodyA.categoryBitMask == rectangleCategory)
&& (contact.bodyB.categoryBitMask == ballCategory))
{
CGPoint contactPoint = contact.contactPoint;
float contact_x = contactPoint.x;
float target_x = secondNode.position.x;
float margin = secondNode.frame.size.height/2 - 25;
if ((contact_x > (target_x - margin)) &&
(contact_x < (target_x + margin)))
{
NSLog(@"Hit");
self.score++;
}
}
}
有什么想法吗?非常感谢所有帮助!
提前致谢
斯泰恩
答案 0 :(得分:2)
我原本怀疑可能缺少一个合适的SKPhysicsContactDelegate,因为它在原帖中没有提到。然而,在检查代码时,情况并非如此,问题只是用于矩形的SKPhysicsBody
是使用不合适的bodyWithCircleOfRadius:
而不是bodyWithRectangleOfSize:
创建的。
rectangle.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize: rectangle.size];
原始答案,对于这个特殊情况不正确,但是留在这里给任何有类似问题的人:
在您提供的代码中,没有任何地方可以看到SKPhysicsContactDelegate
。 didBeginContact:
方法是physicsWorld
的{{1}}属性的委托方法。
因此,如果您希望将SKScene
作为自己的委托,则必须支持SKScene
协议。即G:
SKPhysicsContactDelegate
然后你需要在游戏开始之前在你的场景中的某个地方设置委托...
@interface YourSceneSubclass : NSObject <SKPhysicsContactDelegate>