【问题标题】:Node automatically move in random direction节点自动向随机方向移动
【发布时间】:2017-07-14 03:03:28
【问题描述】:

我正在尝试创建一个球,该球在创建后会自动沿随机方向向前移动。我尝试创建一个从 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)

这是我编辑的代码。现在敌方球被另一个球击中时会移动,但我希望敌方球自动移动。现在它停留在屏幕中间的位置直到被击中。

【问题讨论】:

  • enemy.physicsBody 等于 nil 吗?如果它为 nil,您编写的代码将编译并且不会崩溃,但您不会得到您所期望的。
  • 这是不可能的。你正在施加力量。您的问题是您的矢量是 2.0,2.0,这意味着您正在施加最大 4 个像素的力。如此微弱的力量,你不会看到太大的变化。
  • 有时球会自己移动,但有时会保持静止,直到被另一个球击中。为什么?

标签: swift xcode sprite-kit


【解决方案1】:

就像 Gary 已经在 cmets 中指出的那样,您要确保已创建一个 physicsBody 添加到您的 SKNode。如果您还没有,可以在here 找到一些简洁的文档。

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

生成随机向量:

let vec = CGVector(dx: CGFloat(arc4random_uniform(100)) / 50.0, dy: CGFloat(arc4random_uniform(100)) / 50.0)

arc4random_uniform 创建一个介于 0 和作为参数传递的上限之间的随机数。然后我将其稍作划分,以获得 0 到 2 之间的数字。您应该根据自己的需要进行调整。

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

【讨论】:

  • 你的数学没有考虑负数,所以你只做 0 - 90。我建议你得到一个随机角度并使用let vec = CGVector(dx:cos(randomAngle) * magnitude, dy:sin(randomAngle) * magnitude))
  • 感谢您的回复!它确实做到了,所以现在可以在被另一个球击中时移动球,但我希望它能够以随机角度自动移动。你能检查一下我编辑的代码并帮助我找出问题所在吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多