Ios 精灵套件球反弹物理目标c

Ios 精灵套件球反弹物理目标c,ios,objective-c,game-physics,skphysicsbody,Ios,Objective C,Game Physics,Skphysicsbody,我想给球增加重力,这样它会上下弹跳,稍微向右或向左,球弹跳的角度,我不想失去球的能量,所以它总是在相同的高度弹跳。现在,球在各个方向反弹,几分钟后停止,即使我将摩擦力设置为0。下面是我的一点代码: ball.position = CGPointMake(self.frame.size.width/4 +arc4random() % ((int)self.frame.size.width/2), self.frame.size

我想给球增加重力,这样它会上下弹跳,稍微向右或向左,球弹跳的角度,我不想失去球的能量,所以它总是在相同的高度弹跳。现在,球在各个方向反弹,几分钟后停止,即使我将摩擦力设置为0。下面是我的一点代码:

    ball.position = CGPointMake(self.frame.size.width/4 +arc4random() % ((int)self.frame.size.width/2),
                                self.frame.size.height/2 +arc4random() % ((int)self.frame.size.height/2));
    [self addChild:ball];

    ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:ball.frame.size.width/3];
    ball.physicsBody.friction = 0.0f;
    ball.physicsBody.restitution = 1.0f;
    ball.physicsBody.linearDamping = 0.0f;
    ball.physicsBody.allowsRotation = YES;
    [ball.physicsBody applyImpulse:CGVectorMake(50.0f, -50.0f)]; 

如果你不想让球在每个方向都弹起,那么你应该朝着直的方向击球

如果你想在整个游戏过程中保持恒定的速度,那么你需要确保保持以下速度:

  if(myNode.physicsBody.velocity.dx < 30)
myNode.physicsBody.velocity = CGVectorMake(30, myNode.physicsBody.velocity.dy);
对于不同方向的击球:

-(CGVector)hitToLeftWithSpeed:(float)speed{

    return CGVectorMake(-speed, 0);
}

-(CGVector)hitToRightWithSpeed:(float)speed{

    return CGVectorMake(speed, 0);
}

-(CGVector)hitTotopWithSpeed:(float)speed{

    return CGVectorMake(0, speed);
}

-(CGVector)hitToBottomWithSpeed:(float)speed{

    return CGVectorMake(0, -speed);
}

-(CGVector)forwardCrossHitWithSpeed:(float)speed{

    return CGVectorMake(speed, speed);
}

-(CGVector)backwardCrossHitWithSpeed:(float)speed{

    return CGVectorMake(-speed, -speed);
}
对于定位球:

  -(CGPoint)addBallAtCenterWithOffsetX:(int)x withOffsetY:(int)y{

    return CGPointMake(100+x, 100+y);
}
-(CGPoint)addBallAtTopLeftWithOffsetX:(int) x withOffsetY:(int)y{

    return CGPointMake(200+x, 100+y);
}

-(CGPoint)addBallAtTopRightWithOffsetX:(int)x withOffsetY:(int)y{

    return CGPointMake(100+x, 100+y);
}

-(CGPoint)addBallAtBottomRightWithOffsetX:(int)x withOffsetY:(int)y{

    return CGPointMake(100+x, 2100+y);
}

-(CGPoint)addBallAtBottomLeftWithOffsetX:(int)x withOffsetY:(int)y{

    return CGPointMake(100+x, 200+y);
}
你可以这样称呼它:

 [self addBallOfType:hBlueBall ofSize:CGSizeMake(75, 75) addSpriteName:@"greenball" atPoint:CGPointMake(100, 100) withBounce:YES withVelocity:[self hitTotopWithSpeed:50] andHitCategory:blueBallHitCategory addEmitter:YES];

这取决于你的冲动,现在你正在往一个croos方向传球。那么你在交叉方向击球有没有更简单的方法?我的意思是,我不明白这个代码的一半你不需要复制粘贴所有这些代码。我发布了助手方法,以便您可以引用这些方法。您不了解哪部分?我将尝试详细解释我不了解位掩码的事情,我读过,但不明白位掩码是用来检测节点之间的冲突的。如果你的游戏包含球、墙、球拍,那么每一个都有不同的位掩码。你现在可以忽略它。
 [self addBallOfType:hBlueBall ofSize:CGSizeMake(75, 75) addSpriteName:@"greenball" atPoint:CGPointMake(100, 100) withBounce:YES withVelocity:[self hitTotopWithSpeed:50] andHitCategory:blueBallHitCategory addEmitter:YES];