如何在每10秒内增加一个敌人,让这个敌人跟踪你的位置并跟随它

即时通讯正在制作一个应用程序,其中你的玩家是一个小圆球,被手指拖到屏幕上。 然后每隔10秒就会有一个敌人的球join,自动追踪你的球并跟随它,直到它进入。 这是迄今为止我所拥有的代码。 你可以在屏幕上拖动你的球,尽pipe它的文件在资产中的每一帧都会产生,并且只是移动到你的球产生的位置。 有什么办法可以解决这个问题,任何帮助表示赞赏。 我将在稍后添加的球之间的接触。

import SpriteKit import GameplayKit class GameScene: SKScene { var me = SKSpriteNode() let enemy = SKSpriteNode (imageNamed: "ellipse 1") override func didMove(to view: SKView) { me = self.childNode(withName: "me") as! SKSpriteNode let border = SKPhysicsBody (edgeLoopFrom: self.frame) border.friction = 0 self.physicsBody = border } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { for touch in touches{ let location = touch.location(in: self) me.run(SKAction.moveTo(x: location.x, duration: 0)) me.run(SKAction.moveTo(y: location.y, duration: 0)) } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { for touch in touches{ let location = touch.location(in: self) me.run(SKAction.moveTo(x: location.x, duration: 0)) me.run(SKAction.moveTo(y: location.y, duration: 0)) } } override func update(_ currentTime: TimeInterval) { let enemy = SKSpriteNode (imageNamed: "ball 2") enemy.position = CGPoint(x:667, y: -200) enemy.run(SKAction.moveTo(x: me.position.x, duration: 1.5)) enemy.run(SKAction.moveTo(y: me.position.y, duration: 1.5)) enemy.zPosition = +1 addChild(enemy) } 

}

所以你遇到的问题是,你的敌人的球图像不加载,而你看到一个红色的X?

如果是这样,你需要打破你的代码,创build你的精灵进入步骤。 首先将图像加载到一个临时variables中,打印出来,然后使用图像创build精灵:

 let enemyImage = imageNamed: "ellipse 1" print("enemyImage = \(enemyImage)") let enemy = SKSpriteNode (enemyImage) 

如果enemyImage是零,你需要弄清楚为什么。

这里是你的代码的一个修改版本,每隔10秒会产生一次敌人,让他们跟随你。 我使用了苹果SpriteKit模板为敌人提供的Spaceshipgraphics。 至于你的问题与敌人的graphics没有显示,我会确保图像被命名为“球2”资产文件夹。

 import SpriteKit import GameplayKit class Enemy: SKSpriteNode { var enemySpeed: CGFloat = 4 } class GameScene: SKScene { var me: SKSpriteNode! var enemies = [Enemy]() override func didMove(to view: SKView) { me = self.childNode(withName: "me") as! SKSpriteNode let border = SKPhysicsBody (edgeLoopFrom: self.frame) border.friction = 0 self.physicsBody = border spawnEnemy() // Spawn an enemy to begin with Timer.scheduledTimer(timeInterval: 10.0, target: self, selector: #selector(spawnEnemy), userInfo: nil, repeats: true) // Spawns an enemy every 10 seconds } func spawnEnemy() { let enemy = Enemy(imageNamed: "Spaceship") enemy.xScale = 0.25 enemy.yScale = 0.25 enemy.position = CGPoint(x: CGFloat(arc4random() % UInt32(size.width)) - size.width / 2, y: CGFloat(arc4random() % UInt32(size.height)) - size.height / 2) enemy.zPosition = 1 addChild(enemy) enemies.append(enemy) } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { for touch in touches { let location = touch.location(in: self) me.run(SKAction.move(to: location, duration: 0.05)) } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { for touch in touches { let location = touch.location(in: self) me.run(SKAction.move(to: location, duration: 0.05)) } } override func update(_ currentTime: TimeInterval) { for enemy in enemies { let angle = CGFloat(atan2f(Float(me.position.y - enemy.position.y), Float(me.position.x - enemy.position.x))) enemy.zRotation = angle - CGFloat.pi / 2 enemy.position = CGPoint(x: enemy.position.x + cos(angle) * enemy.enemySpeed, y: enemy.position.y + sin(angle) * enemy.enemySpeed) } } } 
 import SpriteKit import GameplayKit class GameScene: SKScene { var me = SKSpriteNode() override func didMove(to view: SKView) { me = self.childNode(withName: "me") as! SKSpriteNode let border = SKPhysicsBody (edgeLoopFrom: self.frame) border.friction = 0 self.physicsBody = border run(SKAction.repeatForever(SKAction.sequence([SKAction.run(createEnemy), SKAction.wait(forDuration: 10.0)]))) } func createEnemy () { let enemy = SKSpriteNode(imageNamed: "ball 1") enemy.name = "enemy" enemy.position = CGPoint(x:667, y: -200) enemy.run(SKAction.moveTo(x: me.position.x, duration: 1.5)) enemy.run(SKAction.moveTo(y: me.position.y, duration: 1.5)) enemy.zPosition = +1 addChild(enemy) } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { for touch in touches{ let location = touch.location(in: self) me.run(SKAction.moveTo(x: location.x, duration: 0)) me.run(SKAction.moveTo(y: location.y, duration: 0)) } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { for touch in touches{ let location = touch.location(in: self) me.run(SKAction.moveTo(x: location.x, duration: 0)) me.run(SKAction.moveTo(y: location.y, duration: 0)) } } override func update(_ currentTime: TimeInterval) { } }