5

最初に、このウェブサイトのすべてのユーザーに感謝したいと思います。なぜなら、私はいつもここで解決策を見つけているからです。

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 つ目は本来の動作をしていません。衝突が検出されるのは上部のみです。

http://hpics.li/86a69e2

http://hpics.li/e16d18e

また、更新機能でボールが障害物に入ったときを検出して、手動で跳ね返るようにしようとしましたが、もちろん、実際には機能していません。あと、数学の勉強が苦手です(笑)

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 を作成することも考えましたが、数学でそれを行う方法が本当にわかりません..

とにかく、それは長い投稿です。あなたの何人かがそれをすべて読んですべてを理解してくれることを願っています(私の英語で申し訳ありません、私はフランス語です!)そして何よりも、私を助けることができるでしょう!!

どうもありがとうございました

4

1 に答える 1

10

最初のスクリーンショットの形状は凸状ですが、2 番目のスクリーンショットの形状は凹状です。

物理ポリゴン形状が正しく機能するには、凸状である必要があります。次の 2 つのいずれかを行うことができます。

  • 2 つのノードと 2 つのボディを作成します。それぞれの形状は凸状ですが、全体として凹状の形状を形成します。これらのボディは動的にすることができます。それらを静的に設定するか、リジッド ディスタンス ジョイントで接続するか、そうでなければ離れないようにすることができます。
  • bodyWithEdgeLoopFromPath:またはを使用bodyWithEdgeChainFromPath:して、凹状の衝突形状を作成できるようにします。これらのボディは動的ではなく、単独で移動することはできませんが、静的なプレイフィールドでの任意の衝突形状に対する完璧なソリューションです。
于 2014-01-15T17:28:49.020 に答える