美文网首页SpriteKit
iOS,swift实现SpriteKit弹珠小游戏

iOS,swift实现SpriteKit弹珠小游戏

作者: 帅聪哥 | 来源:发表于2019-02-21 14:48 被阅读1次

    前期废话

    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弹珠小游戏

        本文链接:https://www.haomeiwen.com/subject/fcwmjqtx.html