最初に、このウェブサイトのすべてのユーザーに感謝したいと思います。なぜなら、私はいつもここで解決策を見つけているからです。
Xonix、Bix、Jezzball のようなゲームを SpriteKit で作ろうとしています。とにかく、壁に跳ね返るボールがあり、ボールが行けない障害物を作ろうとしています。それらの障害物は CGPathref から作成されます (ユーザーはその動きで作成します)。
bodyWithPolygonFromPath を使用して skspritenode の物理ボディを作成していますが、常に機能しているわけではありません。ボディの中身を見るためにYMCPhysicsDebuggerをダウンロードしたところ、いずれも良いのですが、CGPath上に4点以上あるとボールがボディ全体にぶつからず、それはより小さなゾーンに対してのみ衝突します..私は何の結果もなしに多くのことを試み、検索しました..CGPathのポイントを反時計回りにしようとしましたが、反対側でも同様に機能しません..
SKSpriteNode を作成するためのコードをコピーしていますが、役に立つとは思えません。問題はポイントにあると思います。物理体がポリゴンでどのように機能するかについて、もっと説明が必要かもしれません。
SKSpriteNode *zone = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(50, 50)];
zone.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path.CGPath]; // 1
zone.physicsBody.friction = 0.0f;
zone.physicsBody.restitution = 0.0f;
zone.physicsBody.linearDamping = 0.0f;
zone.physicsBody.allowsRotation = NO;
zone.physicsBody.categoryBitMask = wallsCategory;
zone.physicsBody.dynamic = NO; // 2
[self addChild:zone];
ここに私の「ゲーム」の 2 つの写真があります。2 つ目は本来の動作をしていません。衝突が検出されるのは上部のみです。
また、更新機能でボールが障害物に入ったときを検出して、手動で跳ね返るようにしようとしましたが、もちろん、実際には機能していません。あと、数学の勉強が苦手です(笑)
for(SKSpriteNode *zone in zonesTab)
{
UIBezierPath *path = [zoneesTab objectAtIndex:i]; // Array of UIBezierPath for the obstacles
if(CGPathContainsPoint(path.CGPath, NULL, ball.frame.origin, FALSE))
{
ball.physicsBody.velocity=CGVectorMake(ball.physicsBody.velocity.dx*-1, ball.physicsBody.velocity.dy*-1);
NSLog(@"Touches iT");
}
i++;
}
また、CGPath に 4 つ以上のポイントがあるたびにいくつかの SKSpriteNode を作成することも考えましたが、数学でそれを行う方法が本当にわかりません..
とにかく、それは長い投稿です。あなたの何人かがそれをすべて読んですべてを理解してくれることを願っています(私の英語で申し訳ありません、私はフランス語です!)そして何よりも、私を助けることができるでしょう!!
どうもありがとうございました