如何在Spritekit中随机化球的起始方向?

时间:2014-11-10 01:59:20

标签: objective-c sprite-kit

我已经开始尝试使用SpriteKit进行游戏开发。我正在创造一个破砖游戏。所以我遇到了一个关于如何随机化球的起始方向的问题。

我的球具有以下属性

ball.physicsBody.friction = 0;
ball.physicsBody.linearDamping = 0;
ball.physicsBody.restitution = 1 ; //energy lost on impact or bounciness

为了在游戏过程中从不同方向开始,我随机选择了4个向量,因为我使用applyImpulse方法将球指向特定方向,我需要确保球如果矢量值很低,则不会变慢。

int initialDirection = arc4random()%10;
CGVector myVector;

if(initialDirection < 2)
{
    myVector = CGVectorMake(4, 7);
}
else if(initialDirection >3 && initialDirection <= 6)
{
    myVector = CGVectorMake(-7, -5);
}
else if(initialDirection >6 && initialDirection <= 8)
{
     myVector = CGVectorMake(-5, -8);
}
else
{
     myVector = CGVectorMake(8, 5);
}
//apply the vector
[ball.physicsBody applyImpulse:myVector];

这是正确的方法吗?我尝试使用applyForce方法,然后,在施加力后球速度减慢。

有什么方法可以让我的方向随机化并且仍能保持我的速度吗?

1 个答案:

答案 0 :(得分:2)

基本步骤

  1. 在[0,2 * PI]中随机选择一个角度
  2. 选择冲动的大小
  3. 通过将幅度/角度转换为矢量分量来形成矢量
  4. 这是一个如何做到这一点的例子

    <强> ObjC:

    CGFloat angle = arc4random_uniform(1000)/1000.0 * M_PI_2; 
    CGFloat magnitude = 4;
    CGVector vector = CGVectorMake(magnitude*cos(angle), magnitude*sin(angle));
    
    [ball.physicsBody applyImpulse:vector];
    

    <强>夫特

    let angle:CGFloat = CGFloat(arc4random_uniform(1000)/1000) * (CGFloat.pi/2)
    let magnitude:CGFloat = 4
    
    let vector = CGVector(x:magnitude * cos(angle), y:magnitude * sin(angle))
    ball.physicsBody?.applyImpulse(vector)