XCode SpriteKit物理体不';不匹配雪碧的大小

XCode SpriteKit物理体不';不匹配雪碧的大小,xcode,sprite-kit,flappy-bird-clone,Xcode,Sprite Kit,Flappy Bird Clone,我是一个新的精灵工具包,为了发展我的技能,我正在创造一个类似于流行的Flappy Bird的游戏。 我创建了一种方法,将管道添加到场景中作为障碍物。我已经为这些障碍物创建了静态物理实体,方法是使用长方形大小的实体并将其设置为障碍物大小。但是,物理实体的大小与屏幕上显示的管道图像不同。在屏幕上显示为空白的地方,鸟正在撞上。这种鸟也可以在管道的各个部分飞行。 这似乎是由物理体(包括障碍物在尺寸中的位置)引起的。 (例如,管道漂浮在屏幕底部上方320px,高度240px。物理体延伸至屏幕的整个长度。)

我是一个新的精灵工具包,为了发展我的技能,我正在创造一个类似于流行的Flappy Bird的游戏。 我创建了一种方法,将管道添加到场景中作为障碍物。我已经为这些障碍物创建了静态物理实体,方法是使用长方形大小的实体并将其设置为障碍物大小。但是,物理实体的大小与屏幕上显示的管道图像不同。在屏幕上显示为空白的地方,鸟正在撞上。这种鸟也可以在管道的各个部分飞行。 这似乎是由物理体(包括障碍物在尺寸中的位置)引起的。 (例如,管道漂浮在屏幕底部上方320px,高度240px。物理体延伸至屏幕的整个长度。)

更新:这不再是问题所在。我现在发现底部的物理体又短又胖,而顶部的物理体太长。间隙在那里,但是它在显示管道的中间。

正如我之前所说。我是spritekit的新手,这很可能是我的一个基本错误。 感谢您的帮助。多谢各位

以下是生成每个障碍的代码:

-(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];

    }
}];
}
-(无效)移动障碍物
{
[使用block:^(SKNode*node,BOOL*stop)的名称为@“低障碍”的自枚举子节点{
SKSpriteNode*ob=(SKSpriteNode*)节点;
ob.position=CGPointMake(ob.position.x-1.5,0);
if(观察位置x<-观察尺寸宽度){
[ob从父项移除];
}
}];
[使用block:^(SKNode*node,BOOL*stop)的名称为@“highbarrier”的自枚举子节点{
SKSpriteNode*highOb=(SKSpriteNode*)节点;
highOb.position=CGPointMake(highOb.position.x-1.5,highOb.position.y);
if(高定位x<-高定位尺寸宽度){
[highOb-removeFromParent];
}
}];
}

使用图像初始化时,应将lowshibird.size单独保留。当你在建立物理实体的时候

长方形车身尺寸:Low.frame.size

应为长方形车身,尺寸为:Low.size


我设置锚定点的经验并不好。它似乎摆脱了物理本体。祝你好运

你能在你的代码中发布你将精灵添加到场景中的部分吗?我希望你为每个障碍物创建两个物理实体,一个用于顶部,一个用于底部。。。gap不应该有另一只飞鸟?!?!?