2015-10-19 87 views
0

我开始使用SKS文件来快速创建游戏,在这个游戏中,我试图让敌人在手机屏幕的宽度内随机产卵,而不是整个sks文件现场只在屏幕宽度内随机生成敌人

override func didMoveToView(view: SKView) { 
    self.physicsWorld.contactDelegate = self 
    NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: Selector("spawnEnemy"), userInfo: nil, repeats: true) 
} 

func spawnEnemy(){ 
    //supposed to pick random point within the screen width 
    let xPos = Int.random(self.frame.width) 

    enemy = SKSpriteNode(imageNamed: "enemy") 
    enemy.position = CGPointMake(CGFloat(xpos), self.frame.size.height/2) 
    enemy.physicsBody = SKPhysicsBody(circleOfRadius: 7) 
    enemy.physicsBody?.affectedByGravity = true 
    enemy.physicsBody?.categoryBitMask = 0 
    enemy.physicsBody?.contactTestBitMask = 1 
    addChild(self.enemy) 
} 
+0

首先,使用SKAction或更新:产卵的方法。如果节点,场景或视图暂停,NSTimer不受影响,因此可能导致“麻烦”。其次,您试图一遍又一遍地添加相同的节点(在spawnEnemy方法中添加self.enemy)。你应该创建一个新的节点,或者至少创建一个现有节点的副本,然后再将它添加到场景中(如果你尝试添加一个已经有父节点的节点,你将会得到一个错误)。您的代码中还有一些拼写错误。修复这一切,看看它是否工作。让我知道你是否需要一个代码示例。 – Whirlwind

回答

1

不管怎么说,我写了一个例子,你:)

所以,这里就是你们的榜样应该是什么样子才能工作:

override func didMoveToView(view: SKView) { 
     self.physicsWorld.contactDelegate = self 

     NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: Selector("spawnEnemy"), userInfo: nil, repeats: true) 


    } 


    func randomBetweenNumbers(firstNum: CGFloat, secondNum: CGFloat) -> CGFloat{ 
     return CGFloat(arc4random())/CGFloat(UINT32_MAX) * abs(firstNum - secondNum) + min(firstNum, secondNum) 
    } 

    func spawnEnemy(){ 
     //supposed to pick random point within the screen width 
     let xPos = randomBetweenNumbers(0, secondNum: frame.width) 

     let enemy = SKSpriteNode(imageNamed: "enemy") //create a new enemy each time 
     enemy.position = CGPointMake(CGFloat(xPos), self.frame.size.height/2) 
     enemy.physicsBody = SKPhysicsBody(circleOfRadius: 7) 
     enemy.physicsBody?.affectedByGravity = true 
     enemy.physicsBody?.categoryBitMask = 0 
     enemy.physicsBody?.contactTestBitMask = 1 
     addChild(enemy) 
    } 

方法randomBetweenNu mbers是从here借来的。

而且,这是你如何可以通过使用SKAction产卵敌人另一种方式:

override func didMoveToView(view: SKView) { 
     self.physicsWorld.contactDelegate = self 

     let wait = SKAction .waitForDuration(1, withRange: 0.5) 

     let spawn = SKAction.runBlock({ 

      self.spawnEnemy() 

     }) 

     let spawning = SKAction.sequence([wait,spawn]) 

     self.runAction(SKAction.repeatActionForever(spawning), withKey:"spawning") 



    } 

方法spawnEnemy仍然在这两种情况下是相同的。要停止产卵,您可以删除某个键的操作(在这种情况下为“产卵”)。你可以这样做:

if((self.actionForKey("spawning")) != nil){ 
     self.removeActionForKey("spawning") 
    } 
+0

与应用程序的问题是,敌人不是在手机屏幕内产卵,他们正在贯穿sks文件。 frame.width获取整个sks文件的宽度。我只希望范围只是在手机的宽度内,谢谢你的回复btw –

+0

@ sk8ertagsk8ertag你真的试过了代码吗?在我的身边,它的工作原理应该如此。沿着从左边开始到屏幕右侧的线生成节点。另一件你应该知道的事情是,当你从.sks文件创建场景时,默认的场景大小是1024x768。但是我认为你已经正确地初始化你的场景(和视图)的大小。 – Whirlwind

+0

雅我试过的代码,但它仍然无法正常工作。你是如何初始化你的场景的 –