如何将敌人移动到移动的玩家?

我正在创build一个简单的精灵套装游戏,将玩家置于屏幕的左侧,而敌人从右侧接近。 由于玩家可以上下移动,我希望敌人“巧妙地”调整他们的路线。

我试着在玩家移动的时候删除和重新添加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() } 

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

寻求者和目标

好吧,让我们添加一些节点到现场。 我们需要一个探索者和一个目标。 search者将是一个导弹,目标将是一个触摸位置。 我说你应该在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) } } 

针对

为了实现瞄准,你必须计算你有多less基于目标旋转一个精灵。 在这个例子中,我将使用导弹,并指向触摸位置。 要做到这一点,你应该使用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。

所以现在呢,我们有一个导弹要走的angular度。 现在让我们根据这个angular度更新它的位置(在瞄准部分正下方添加这个里面的touchesMoved:方法):

 //Seek let vx = cos(angle) * missileSpeed let vy = sin(angle) * missileSpeed missile.position.x += vx missile.position.y += vy 

那就是了。 结果如下:

寻求导弹

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

极地坐标

在这里阅读更多。

这意味着你应该把导弹定位在右边 导弹鼻子指向右侧 而不是向上 在这里输入图像描述 。 你也可以使用向上的图像,但你必须做这样的事情:

 missile.zRotation = angle - CGFloat(M_PI_2)