如何每10秒钟添加一个敌人并让敌人跟踪你的位置并跟踪它

时间:2017-05-18 22:43:47

标签: ios swift sprite-kit

我正在开发一款应用程序,其中你的玩家是一个小圆球,被你的手指拖到屏幕上。然后每10秒钟添加一个敌人球,自动跟踪你的球并跟踪它直到它进入它。到目前为止,这是我的代码。你可以在屏幕上拖动你的球,然后将敌人的球只显示为红色的x,即使它的文件在资产中每一帧产生,它们只是移动到你的球产生的位置。有什么方法可以解决这个问题,任何帮助表示赞赏。我将在稍后添加的球之间的接触。

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)


}

}

3 个答案:

答案 0 :(得分:0)

所以你遇到的问题是你的敌人球图像没有加载,而你却看到了红色的X?

如果是这样,您需要将创建精灵的代码分解为步骤。首先将图像加载到临时变量中,打印它,然后使用图像创建精灵:

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

如果enemyImage为零,则需要找出原因。

答案 1 :(得分:0)

以下是您的代码的修改版本,每10秒生成一次敌人并让他们关注您。我使用了Apple的SpriteKit模板为敌人提供的太空船图形。至于你没有出现敌人图形的问题我确保图像被命名为#34;球2&#34;在资产文件夹中。

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)
        }
    }
}

答案 2 :(得分:0)

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) {


    }
}