5

画面上のポイント 0.0 に 1 つのシーン、1 つのスプライト ノード 20x20px の非常に単純なサンプル コードを作成しました。呼び出すscene.physicsWorld bodyAtPointと、34x34 などのポイントでもこのノードが返されます。しかし、ポイント 35x35 では を返しますnull。したがって、基本的に、両方の軸の 0px から 34px までのすべてのポイントがこのノードを返します。35px から開始すると、もう返されません。スプライトが目に見えて 20px 20px で終了する場合、何が原因でしょうか? にも同じ動作が見られbodyInRectます。

サンプルコードは次のとおりです。

-(id)initWithSize:(CGSize)size {    
if (self = [super initWithSize:size]) {
    /* Setup your scene here */

    self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
    self.physicsWorld.gravity = CGVectorMake(0, 0);

    SKSpriteNode *node = [[SKSpriteNode alloc] initWithColor:[UIColor whiteColor] size:CGSizeMake(20, 20)];
    node.position = CGPointMake(10, 10);

    node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(20, 20)];
    [self addChild:node];

}
return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

for (UITouch *touch in touches) {
    CGPoint location = [touch locationInNode:self];
    if([self.physicsWorld bodyAtPoint:location])
    {
        NSLog(@"Detected at point: %f %f", location.x, location.y);
    }else{
        NSLog(@"No node at point: %f %f", location.x, location.y);
    }
}
}

コンソールログは次のとおりです。

2013-11-09 15:05:52.822 SKTest[43143:70b] Detected at point: 2.000000 1.000000
2013-11-09 15:05:56.274 SKTest[43143:70b] Detected at point: 3.000000 7.000000
2013-11-09 15:05:57.006 SKTest[43143:70b] Detected at point: 3.000000 11.000000
2013-11-09 15:05:58.199 SKTest[43143:70b] Detected at point: 3.000000 12.000000
2013-11-09 15:05:58.918 SKTest[43143:70b] Detected at point: 3.000000 14.000000
2013-11-09 15:05:59.785 SKTest[43143:70b] Detected at point: 3.000000 17.000000
2013-11-09 15:06:00.685 SKTest[43143:70b] Detected at point: 3.000000 20.000000
2013-11-09 15:06:01.565 SKTest[43143:70b] Detected at point: 3.000000 22.000000
2013-11-09 15:06:02.915 SKTest[43143:70b] Detected at point: 3.000000 25.000000
2013-11-09 15:06:04.285 SKTest[43143:70b] Detected at point: 3.000000 30.000000
2013-11-09 15:06:05.387 SKTest[43143:70b] Detected at point: 3.000000 34.000000
2013-11-09 15:06:08.492 SKTest[43143:70b] No node at point: 4.000000 38.000000
2013-11-09 15:06:12.499 SKTest[43143:70b] Detected at point: 4.000000 5.000000
2013-11-09 15:06:13.240 SKTest[43143:70b] Detected at point: 6.000000 5.000000
2013-11-09 15:06:13.881 SKTest[43143:70b] Detected at point: 10.000000 5.000000
2013-11-09 15:06:15.064 SKTest[43143:70b] Detected at point: 12.000000 5.000000
2013-11-09 15:06:16.120 SKTest[43143:70b] Detected at point: 14.000000 5.000000
2013-11-09 15:06:16.873 SKTest[43143:70b] Detected at point: 16.000000 5.000000
2013-11-09 15:06:17.582 SKTest[43143:70b] Detected at point: 18.000000 5.000000
2013-11-09 15:06:18.066 SKTest[43143:70b] Detected at point: 21.000000 5.000000
2013-11-09 15:06:18.966 SKTest[43143:70b] Detected at point: 24.000000 5.000000
2013-11-09 15:06:19.585 SKTest[43143:70b] Detected at point: 31.000000 5.000000
2013-11-09 15:06:20.531 SKTest[43143:70b] Detected at point: 35.000000 5.000000
2013-11-09 15:06:22.581 SKTest[43143:70b] No node at point: 36.000000 4.000000
2013-11-09 15:06:26.560 SKTest[43143:70b] Detected at point: 19.000000 16.000000
2013-11-09 15:06:27.933 SKTest[43143:70b] Detected at point: 20.000000 17.000000
2013-11-09 15:06:29.856 SKTest[43143:70b] Detected at point: 25.000000 19.000000
2013-11-09 15:06:31.487 SKTest[43143:70b] Detected at point: 26.000000 22.000000
2013-11-09 15:06:33.850 SKTest[43143:70b] Detected at point: 29.000000 27.000000
2013-11-09 15:06:35.492 SKTest[43143:70b] Detected at point: 31.000000 29.000000
2013-11-09 15:06:36.854 SKTest[43143:70b] Detected at point: 35.000000 32.000000
2013-11-09 15:06:40.004 SKTest[43143:70b] No node at point: 40.000000 34.000000

と の両方で、Apple のバグである可能性はnodeAtPointありnodeInRectますか? 信じにくいです。しかし、コードが非常に短いため、どこでミスを犯したのかわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

0

私はこれで少し実験しました。スプライトを拡大して気づいたのは、ボディの面積がスプライトよりも大きいように見えることです。スプライトのサイズを 1.15 で割って、4 つの側面すべてで表示されたスプライトとほぼ一致するように体の四角形を取得する必要がありました。しかし、理由はわかりません。ゲームプレイに問題はなかったので、おそらく nodeAtPoint にはしきい値の範囲がありますか?

SKSpriteNode *node = [SKSpriteNode spriteNodetWithColor:[SKColor whiteColor]
                                                   size:CGSizeMake(200, 200)];
node.position = CGPointMake(200, 200);

CGRect bodySize = CGSizeMake(node.size.width / 1.15, node.size.height / 1.15);
node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:bodySize];
[self addChild:node];

これを Retina 4 インチおよび非 Retina iPad シミュレーターでテストしました。

于 2013-11-09T22:26:12.437 に答える