天天看点

Swift SpriteKit 忍者无敌

这个很简单。用Swift和SpriteKit的。熟悉cocos2d,coco2d-x的其实上手SpriteKit很容易。

Swift SpriteKit 忍者无敌
import SpriteKit

class GameScene: SKScene {
    var _player: SKSpriteNode!
    
    var fbArray = Array<SKSpriteNode>()
    var monsterArray = Array<SKSpriteNode>()
    
    var _fbArray = NSMutableArray()
    
    var _monsterArray = NSMutableArray()
    
    override func didMoveToView(view: SKView) {
        // 把忍者放在屏幕左边中间
        let sk = SKSpriteNode(imageNamed: "player")
        sk.position = CGPoint(x: sk.size.width / 2, y: self.size.height / 2)
        self.addChild(sk)
        _player = sk
        self.addMonster()
        
        let wait = SKAction.waitForDuration(1.0)
        let addAction = SKAction.runBlock { () -> Void in
            self.addMonster()
        }
        
        let sq = SKAction.sequence([addAction, wait])
        
        let fsq = SKAction.repeatActionForever(sq)
        self.runAction(fsq)
        
       
    }
    
    // 当点击屏幕时,添加飞镖
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        
        //let point = (CGPoint)(touches.anyObject()?.locationInNode(self))
        for touch in touches {
            let point = touch.locationInNode(self)
            addFB(point)
        }


    }
    
    // 添加忍者飞镖
    func addFB(point: CGPoint) {
        let pro = SKSpriteNode(imageNamed: "projectile")
        let from = CGPointMake(_player.size.width + pro.size.width * 0.5, self.size.height * 0.5)
        
        let x = self.size.width + pro.size.width * 0.5 - from.x
        
        let offset = CGPointMake(point.x - from.x, point.y - from.y)
        
        if (offset.x <= 0) {
            return
        }
        
        let y = offset.y / offset.x * x + from.y
        
        let to = CGPointMake(x, y)
        
        pro.position = from
        self.addChild(pro)
        //fbArray.append(pro)
        _fbArray.addObject(pro)
        
        
        let p = CGPointMake(to.x - from.x, to.y - from.y)
        
        let distance = sqrt(p.x * p.x + p.y + p.y)
        
        let volcity = self.size.width
        
        var duration: Double  = Double(distance / volcity)

        
        let move = SKAction.moveTo(to, duration: duration)
        
        pro.runAction(move, completion: { () -> Void in
            pro.removeFromParent()
            self._fbArray.removeObject(pro)
            
        })
        
    }
    
    // 添加怪物
    func addMonster() {
        let monster = SKSpriteNode(imageNamed: "monster")
        let maxY = UInt32(self.size.height - monster.frame.size.height)
        let x = (self.size.width  + monster.frame.size.width * 0.5)
        let y = CGFloat(arc4random_uniform(maxY))
        let y1 = y + monster.frame.size.height * 0.5
        monster.position = CGPoint(x: x, y: y1)
        self.addChild(monster)
        _monsterArray.addObject(monster)
        
        let move = SKAction.moveToX(-monster.frame.size.width, duration: 4.0)
        
        monster.runAction(move, completion: { () -> Void in
            monster.removeFromParent()
            self._monsterArray.removeObject(monster)
            
        })
    }
    

   // 碰撞检测,移除飞镖,怪物。
    override func update(currentTime: CFTimeInterval) {

        var proSet = NSMutableSet()
        for pro in _fbArray {
            
            var monsterSet = NSMutableSet()
            
            for monster in _monsterArray {
                if (CGRectIntersectsRect(monster.frame, pro.frame)) {
                    monsterSet.addObject(monster)
                }
            }
            
            for monster in monsterSet {
                _monsterArray.removeObject(monster)
                
                let rotate = SKAction.rotateToAngle(-3.14 * 0.5, duration: 0.1)
                
                monster.runAction(rotate, completion: { () -> Void in
                    monster.removeFromParent()
                })
            }
            
            if (monsterSet.count > 0) {
                proSet.addObject(pro)
            }
        }
        
        for sk in proSet {
            sk.removeFromParent()
            _fbArray.removeObject(sk)
            
        }

    }

}
           

https://github.com/SylvanasX/NaJia