1

私はスプライト キットを初めて使用し、スキルを磨くために、人気のある Flappy Bird に似たゲームを作成しています。パイプをシーンに追加して障害物にするメソッドを作成しました。bodyWithRectangleOfSize を使用し、それを object.size に設定して、これらの障害物用の静的な物理体を作成しました。ただし、物理ボディは、画面に表示されるパイプ イメージとはサイズが異なります。画面に何もない空間として表示されているものに、鳥が激突しています。鳥はパイプのセクションを飛ぶこともできます。これは障害物の位置をサイズに含めた物理体が原因のようです。(例: パイプは画面の下部から 320 ピクセル上に浮いており、高さは 240 ピクセルです。物理ボディは画面の全長に伸びています。)

更新: これはもはや問題ではありません。私は現在、下部の物理体が短くて太く、上部の物理体が長すぎることを発見しています。ギャップはありますが、パイプが表示されている場所の真ん中にあります。

私が前に言ったように。私はスプライトキットを初めて使用しますが、これはおそらく私の側の基本的なエラーです。どんな助けでも大歓迎です。ありがとうございました。

各障害物を生成するコードは次のとおりです。

-(void)initialiseObstacles:(int)position
{

//create random height

int random = (arc4random()%250) + 150;



    //add bottom pipe and physics body

    SKSpriteNode *lowObstacle = [SKSpriteNode     spriteNodeWithImageNamed:@"pipe.png"];
    lowObstacle.size = CGSizeMake(50, random);
    lowObstacle.position = CGPointMake(position + 200, 0);
    lowObstacle.anchorPoint = CGPointMake(0,0);
    lowObstacle.name = @"lowObstacle";

    [self addChild:lowObstacle];

    lowObstacle.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:lowObstacle.frame.size];
    lowObstacle.physicsBody.dynamic = NO;
    lowObstacle.physicsBody.categoryBitMask = obstacleCategory;

    //add top pipe & physics body

    SKSpriteNode *highObstacle = [SKSpriteNode spriteNodeWithImageNamed:@"pipetop.png"];
    highObstacle.anchorPoint = CGPointMake(0,0);
    highObstacle.size = CGSizeMake(50, 430-lowObstacle.size.height);
    highObstacle.position = CGPointMake(lowObstacle.position.x,lowObstacle.size.height + 130);
    highObstacle.name = @"highObstacle";

    [self addChild:highObstacle];

    highObstacle.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:highObstacle.frame.size];
    highObstacle.physicsBody.dynamic = NO;
    highObstacle.physicsBody.categoryBitMask = obstacleCategory;

}

このコードは、100 フレームごとにパイプを生成し、アップデートによって呼び出されます。

-(void)spawn{


frames = frames + 1;

if (frames == 100) {

    [self initialiseObstacles:200];
    frames = 0;
    }
}

このコードは、パイプを移動します。

-(void)moveObstacles
{
[self enumerateChildNodesWithName:@"lowObstacle" usingBlock:^(SKNode *node, BOOL *stop) {
SKSpriteNode *ob = (SKSpriteNode *)node;
ob.position = CGPointMake(ob.position.x - 1.5, 0);


if (ob.position.x < -ob.size.width) {
    [ob removeFromParent];
}
}];

[self enumerateChildNodesWithName:@"highObstacle" usingBlock:^(SKNode     *node, BOOL *stop) {
    SKSpriteNode *highOb = (SKSpriteNode *)node;
    highOb.position = CGPointMake(highOb.position.x - 1.5, highOb.position.y);

    if (highOb.position.x < - highOb.size.width) {
        [highOb removeFromParent];

    }
}];
}
4

1 に答える 1

0

画像で初期化するときは、lowobstacle.size をそのままにしておく必要があります。また、物理体をセットアップするとき

bodywithrectangleofsize: lowobstacle.frame.size

bodywithrectangleofsize である必要があります: lowobstacle.size

アンカー ポイントの設定に関する私の経験は良くありませんでした。物理体を脱ぎ捨てそうです。幸運を!

于 2014-02-16T07:37:17.443 に答える