私はスプライト キットを初めて使用し、スキルを磨くために、人気のある 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];
}
}];
}