iOS,swift实现SpriteKit弹珠小游戏

前期废话

SpriteKit是苹果封装好的一个非常简单方便的2D游戏框架,内容丰富,想怎么玩就怎么玩。
刚好这段时间有些时间,就写了一个小时候玩过的弹珠小游戏,只是用来练练手,因为没有素材,所以整个页面略显简单,不过整个游戏逻辑已经完成哈,先来展示下效果,看看你能玩多少分。
最终效果
详细过程

1、给游戏设置4种状态

enum GameStatus {
    case idle//初始状态
    case running//运行中
    case over//结束
    case pass//过关
}

2、布置游戏场景:
1.添加一个挡板
2.添加白球
3.添加顶部砖头
4.在底部添加一个透明body,用来检测是否游戏结束
5.为了让游戏界面更加丰富一点,在顶部留了100的空余显示金币数,那个头像在左边还没有弄

3、具体实现:
因为不想贴那么多,这里就把顶部砖头的代码贴下,注意,spriteKit中的坐标系与普通OC是不一样的,


坐标系.JPG
添加砖头代码
///设置上方砖头
    func setUpBarrier() {
        ///方便重置游戏界面
        for pipeNode in self.children where pipeNode.name == "brick" {
            if let pipeSprite = pipeNode as? SKSpriteNode {
                pipeSprite.removeFromParent()
            }
        }
        
        //设计成正方形
        let width = self.size.width/19
        let height = width
        for i in 1...19*6 {
            let copyNode = SKSpriteNode.init(texture: nil, size: CGSize(width: width, height: height))
            copyNode.name = "brick"
            let pointx = (i-1)%19
            let pointy = (i-1)/19
            
            var nodeX = CGFloat(pointx)*width
            var nodeY = self.size.height - CGFloat(pointy)*height-100///给顶部留了100
            nodeX += width*0.5
            nodeY -= height*0.5
            copyNode.position = CGPoint(x: nodeX, y: nodeY)
            ///因为缺少素材,这里使用随机色了
            copyNode.color = self.randomColor()
            copyNode.physicsBody = SKPhysicsBody.init(rectangleOf: CGSize(width: width, height: height), center: CGPoint(x: 0.5, y: 0.5))
            ///设置自身的physicsBody二进制数据,在实体出现碰撞后根据这个值判断是否为本对象
            copyNode.physicsBody?.categoryBitMask = brickCategory
            ///设置 在实体运动过程中与哪些实体可发生碰撞,这里设置关联对象为球,因为只会与球发生碰撞,在碰撞后会通过代理回调结果
            copyNode.physicsBody?.contactTestBitMask = ballCategory
            copyNode.physicsBody?.isDynamic = false
            addChild(copyNode)
        }
        ///一个砖头就一分,所以总分在设置砖头后就已经知道了
        self.destinationScore = 19*6
        
    }
///设置随机色
    func randomColor()->SKColor {
       return SKColor.init(red: CGFloat(arc4random_uniform(255))/255.0, green: CGFloat(arc4random_uniform(255))/255.0, blue: CGFloat(arc4random_uniform(255))/255.0, alpha: 1.0)
    }

当砖头与球发生碰撞的时候,砖头会消失,并产生碰撞声音,本来想做一个砖头碎掉的动画,缺少素材或者技术还不行就放弃了,各位有好点子可以留个言哈。

///当撞击的时候,障碍物消失
    func briierRemoveAction(brickNode:SKSpriteNode) {
        brickNode.run(SKAction.sequence([
                                          SKAction.fadeAlpha(to: 0, duration: 0.5),
                                          SKAction.removeFromParent()]))
    }
游戏声音管理者,专门播放各种声音,素材网上随便找的,class GameAudioManager: NSObject
关于挡板手势拖动,非常感谢这个博主
碰撞代理回调分析:

稍微难点就是球和挡板碰撞后球该往哪个方向弹的问题,其实分析后就很简单了,默认初始的时候,球和挡板的position.x是一样的,只要判断position.x的大小即可确定方向

if(bodyA.categoryBitMask == boardCategory && bodyB.categoryBitMask == ballCategory){
            ///通过比较挡板和球的位置的x值的相对值来确定应该的角度
            let boardPointX = self.boardNode.position.x
            let ballPointX =  self.ballNode.position.x
            
            var value = CGFloat(fabsf(Float(boardPointX-ballPointX)))
            value = value/2
            if(boardPointX > ballPointX){//球在挡板的左边
            value = -value
            }else if(boardPointX == ballPointX){//球在挡板的中间
                value = 0
            }else{//球在挡板的右边
                
            }
            GameAudioManager.share.manager.playTapAudio()
            self.ballNode?.physicsBody?.applyImpulse(CGVector(dx: value, dy: 15))
        }

OK,写到这整个游戏差不多了,具体细节各位可以看看源码,其他细节就不贴上了。
demo在这

喜欢的就点赞就好,纯属学习分享,大家相互学习!!!

你可能感兴趣的:(iOS,swift实现SpriteKit弹珠小游戏)