Swift 节点自动沿随机方向移动

Swift 节点自动沿随机方向移动,swift,xcode,sprite-kit,Swift,Xcode,Sprite Kit,我正在尝试创建一个球,一旦它被创建,它会自动朝随机方向向前移动。我尝试过从0-360创建一个随机角度,让节点旋转,然后对节点应用一个脉冲,但是一旦创建了节点,节点就停留在那里,所以我无法判断是脉冲不起作用还是旋转不起作用 enemy.size = CGSize(width: 20, height:20) enemy.position = CGPoint(x: frame.width/2, y: frame.height/2) enemy.color = UIColor(

我正在尝试创建一个球,一旦它被创建,它会自动朝随机方向向前移动。我尝试过从0-360创建一个随机角度,让节点旋转,然后对节点应用一个脉冲,但是一旦创建了节点,节点就停留在那里,所以我无法判断是脉冲不起作用还是旋转不起作用

    enemy.size =  CGSize(width: 20, height:20)
    enemy.position = CGPoint(x: frame.width/2, y: frame.height/2)
    enemy.color = UIColor(red:255.0,green:0.0,blue:0.0,alpha:1.0)
    enemy.colorBlendFactor = 1.0
    enemy.physicsBody?.affectedByGravity = false
    enemy.physicsBody?.isDynamic = true
    enemy.physicsBody?.restitution = 1.0
    enemy.physicsBody?.friction = 0.0
    enemy.physicsBody?.linearDamping = 0.0
    self.addChild(enemy)
这只是为了制造敌人,但我不知道如何应用随机方向和向前移动

 enemy.size =  CGSize(width: 20, height:20)
    enemy.position = CGPoint(x: frame.width/2, y: frame.height/2)
    enemy.color = UIColor(red:255.0,green:0.0,blue:0.0,alpha:1.0)
    enemy.colorBlendFactor = 1.0
    enemy.physicsBody = SKPhysicsBody(circleOfRadius:10)
    enemy.physicsBody?.affectedByGravity = false
    enemy.physicsBody?.isDynamic = true
    enemy.physicsBody?.restitution = 1.0
    enemy.physicsBody?.friction = 0.0
    enemy.physicsBody?.linearDamping = 0.0
     self.addChild(enemy)
    let vec = CGVector(dx: CGFloat(arc4random_uniform(100)) / 50.0, dy: CGFloat(arc4random_uniform(100)) / 50.0)
    enemy.physicsBody!.applyForce(vec)

这是我编辑的代码。敌人的球现在被另一个球击中时移动,但我希望敌人的球自动移动。现在它停留在屏幕中间的位置,直到命中。 就像Gary在评论中指出的那样,您希望确保您已经在
SKNode
中添加了一个
physicsBody
。如果您没有,可以找到一些整洁的文档

现在来施加一个随机力。你基本上想要生成一个随机的CGVector,并在你的物理身体上使用

要生成随机向量,请执行以下操作:

let vec = CGVector(dx: CGFloat(arc4random_uniform(100)) / 50.0, dy: CGFloat(arc4random_uniform(100)) / 50.0)
arc4random\u uniform
创建一个介于0和上限之间的随机数,并将其作为参数传递。然后我把它除以一点,得到一个介于0和2之间的数字。你应该根据自己的需要调整一下


然后只需使用敌方.physicsBody!。applyForce(vec)。注意我使用的
标记。确保您已经创建并应用了物理实体,否则将崩溃。

就像Gary在评论中指出的那样,您希望确保您已经创建了一个添加到
SKNode
物理实体。如果您没有,可以找到一些整洁的文档

现在来施加一个随机力。你基本上想要生成一个随机的CGVector,并在你的物理身体上使用

要生成随机向量,请执行以下操作:

let vec = CGVector(dx: CGFloat(arc4random_uniform(100)) / 50.0, dy: CGFloat(arc4random_uniform(100)) / 50.0)
arc4random\u uniform
创建一个介于0和上限之间的随机数,并将其作为参数传递。然后我把它除以一点,得到一个介于0和2之间的数字。你应该根据自己的需要调整一下


然后只需使用敌方.physicsBody!。applyForce(vec)
。注意我使用的
标记。确保您已创建并应用了物理实体,否则将崩溃。

是否为敌人。物理实体是否等于零?您编写的代码将被编译,如果它为零,则不会崩溃,但您将无法获得您所期望的结果。这是不可能的。你在施力。你的问题是你的向量是2.0,2.0,这意味着你施加的力最大为4像素。如此弱的力不会带来太大的变化。有时球会自行移动,但有时球会静止不动,直到被另一个球击中。为什么?敌方物理体等于零吗?您编写的代码将被编译,如果它为零,则不会崩溃,但您将无法获得您所期望的结果。这是不可能的。你在施力。你的问题是你的向量是2.0,2.0,这意味着你施加的力最大为4像素。如此弱的力不会带来太大的变化。有时球会自行移动,但有时球会静止不动,直到被另一个球击中。为什么?你的数学不能解释负数,所以你只能做0-90。我建议获得一个随机角度,并使用
let vec=CGVector(dx:cos(randomanangle)*幅值,dy:sin(randomanangle)*幅值))
感谢您的回复!它确实使球在被另一个球击中时可以移动,但我希望它能自动以随机角度移动。你能检查一下我编辑过的代码,帮我找出问题的症结所在吗?你的数学算不出负数,所以你只能做0-90分。我建议获得一个随机角度,并使用
let vec=CGVector(dx:cos(randomanangle)*幅值,dy:sin(randomanangle)*幅值))
感谢您的回复!它确实使球在被另一个球击中时可以移动,但我希望它能自动以随机角度移动。你能检查一下我编辑过的代码,帮我找出问题所在吗?