【问题标题】:How to move enemy towards a moving player?如何将敌人移向移动的玩家?
【发布时间】:2016-07-13 20:09:25
【问题描述】:

我正在创建一个简单的精灵套件游戏,它将玩家定位在屏幕的左侧,而敌人则从右侧接近。由于玩家可以上下移动,我希望敌人“聪明地”调整他们朝向玩家的路径。

我尝试在玩家移动时删除和重新添加 SKAction 序列,但下面的代码导致敌人根本不显示,可能是因为它只是在每次帧更新时添加和删除每个动作,所以他们从来没有移动的机会。

希望获得一些关于创建“智能”敌人的最佳实践的反馈,这些敌人会随时向玩家的位置移动。

这是我的代码:

    func moveEnemy(enemy: Enemy) {
    let moveEnemyAction = SKAction.moveTo(CGPoint(x:self.player.position.x, y:self.player.position.y), duration: 1.0)
    moveEnemyAction.speed = 0.2
    let removeEnemyAction = SKAction.removeFromParent()
    enemy.runAction(SKAction.sequence([moveEnemyAction,removeEnemyAction]), withKey: "moveEnemyAction")
}

func updateEnemyPath() {
    for enemy in self.enemies {
        if let action = enemy.actionForKey("moveEnemyAction") {
            enemy.removeAllActions()
            self.moveEnemy(enemy)
        }
    }
}

override func update(currentTime: NSTimeInterval) {
    self. updateEnemyPath()
}

【问题讨论】:

  • “不能正常工作”不是一个技术术语。我们需要有关您的期望及其不当行为的完整信息。
  • @Rob 抱歉含糊不清,现在上面的代码不会导致敌人出现。可能是因为它只是在每次帧更新时添加和删除每个动作,所以他们永远没有机会移动。谢谢!
  • 虽然您已经得到一个标记为正确的答案,但我强烈建议您查看 GameplayKit (ios 9 API)。它为更灵活的游戏设计提供了工具,包括寻路和寻找敌人,这使您想要的事情变得更好、更容易。网上有一些关于这个的很好的教程。 raywenderlich.com/119959/…code.tutsplus.com/tutorials/…

标签: swift sprite-kit skaction


【解决方案1】:

你必须在每次更新中更新敌人positionzRotation 属性:方法调用。

寻找者和目标

好的,让我们在场景中添加一些节点。我们需要一个寻求者和一个目标。 Seeker 是导弹,target 是一个接触点。我说你应该在 update: 方法中执行此操作,但我将使用 touchesMoved 方法来做一个更好的例子。以下是您应该如何设置场景:

import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate {

    let missile = SKSpriteNode(imageNamed: "seeking_missile")

    let missileSpeed:CGFloat = 3.0

    override func didMoveToView(view: SKView) {

        missile.position = CGPoint(x: frame.midX, y: frame.midY)

        addChild(missile)
    }
}

瞄准

要实现瞄准,您必须根据其目标计算您必须旋转多少精灵。在此示例中,我将使用导弹并使其指向触摸位置。为此,您应该使用 atan2 函数,如下所示(在 touchesMoved: 方法中):

if let touch = touches.first {

    let location = touch.locationInNode(self)

    //Aim
    let dx = location.x - missile.position.x
    let dy = location.y - missile.position.y
    let angle = atan2(dy, dx)

    missile.zRotation = angle

}

请注意,atan2 接受 y,x 顺序的参数,而不是 x,y。

所以现在,我们有一个导弹应该飞的角度。现在让我们根据那个角度更新它的位置(在瞄准部分正下方的touchesMoved:方法中添加这个):

//Seek
 let vx = cos(angle) * missileSpeed
 let vy = sin(angle) * missileSpeed

 missile.position.x += vx
 missile.position.y += vy

就是这样。结果如下:

请注意,在 Sprite-Kit 中,0 弧度的角度指定正 x 轴。而正角是逆时针方向:

阅读更多here

这意味着您应该将导弹指向右侧,而不是向上。您也可以使用向上的图像,但您必须执行以下操作:

missile.zRotation = angle - CGFloat(M_PI_2)

【讨论】:

  • 太棒了!完美的答案,感谢详细的解释!
  • 太棒了!谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 2023-02-08
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多