SpriteKit与arkit结合炸弹小游戏

Spritekit介绍

http://www.jianshu.com/p/0427dc183ca8

游戏介绍

点击炸弹,炸弹消失,超过5s没有点击 ,发生爆炸

效果图

点击消失
超过5s爆炸

新建项目

新建项目选择game


这里写图片描述

选择spritekit


这里写图片描述

设置追踪镜头

  let configuration = AROrientationTrackingConfiguration()//追踪镜头的位置,只有三个自由度 速度比较快
        

编写核心Scene

代码很简单,看下就明白了

//
//  Scene.swift
//  SpriteKitInAr
//
//  Created by Liyanjun on 2017/10/10.
//  Copyright © 2017年 liyanjun. All rights reserved.
//

import SpriteKit
import ARKit

class Scene: SKScene {
    
    var playing = false//是否在play
    
    //计时器
    var timer = Timer()
    
    //分数
    var score = 0
    
    override func didMove(to view: SKView) {
        // Setup your scene here
    }
    
    override func update(_ currentTime: TimeInterval) {
        // Called before each frame is rendered
    }
    
    func displayMenu(){
        /**
         SKLabelNode: 一种 label 來使用的 node
         name???
         */
        
        let logoLabel = SKLabelNode(fontNamed: "AvenirNext-Bold")
        logoLabel.fontSize = 50.0
        
        logoLabel.text = "Game Over!"
        logoLabel.verticalAlignmentMode = .center
        logoLabel.horizontalAlignmentMode = .center
        
        logoLabel.position = CGPoint(x: frame.midX, y: frame.midY + logoLabel.frame.size.height)
        
        logoLabel.name = "Menu"
        self.addChild(logoLabel)
        
        let infoLabel = SKLabelNode(fontNamed: "AvenirNext-Bold")
        infoLabel.fontSize = 50.0
        
        infoLabel.text = "你被炸飞了"
        infoLabel.verticalAlignmentMode = .center
        infoLabel.horizontalAlignmentMode = .center
        
        infoLabel.position = CGPoint(x: frame.midX, y: frame.midY - infoLabel.frame.size.height)
        
        infoLabel.name = "Menu"
        self.addChild(infoLabel)
        
        //      最高分
        let higthtScore = SKLabelNode(fontNamed: "AvenirNext-Bold")
        higthtScore.fontSize = 50.0
        
        higthtScore.text = "最高分:\(UserDefaults.standard.integer(forKey: "HighestScore"))"
        higthtScore.verticalAlignmentMode = .center
        higthtScore.horizontalAlignmentMode = .center
        
        higthtScore.position = CGPoint(x: frame.midX, y: infoLabel.frame.midY - higthtScore.frame.size.height * 2 )
        
        higthtScore.name = "Menu1" //??
        self.addChild(higthtScore)
        
        
        //点击屏幕从新开始
        let beginAgain = SKLabelNode(fontNamed: "AvenirNext-Bold")
        beginAgain.fontSize = 30.0
        beginAgain.text = "点击屏幕从新开始"
        beginAgain.verticalAlignmentMode = .center
        beginAgain.horizontalAlignmentMode = .center
        
        beginAgain.position = CGPoint(x: frame.midX, y: higthtScore.frame.midY - beginAgain.frame.size.height*2)
        
        beginAgain.name = "Menu1"
        self.addChild(beginAgain)
    }
    
    //添加炸弹
    
    func addBomd()  {
        
        guard let sceneView = self.view as? ARSKView else {
                        return
        }
        
        //判断镜头的位置
        if let currentFrame = sceneView.session.currentFrame {
            
            let xOffset = Float(arc4random_uniform(UInt32(10)))/10 - 1.5
            
            let zOffset = Float(arc4random_uniform(UInt32(30)))/10 + 0.5
            
            var transFrame = matrix_identity_float4x4
            
            transFrame.columns.3.x = currentFrame.camera.transform.columns.3.x - xOffset
            transFrame.columns.3.z = currentFrame.camera.transform.columns.3.z - zOffset
            transFrame.columns.3.y = currentFrame.camera.transform.columns.3.y
            
            let archor = ARAnchor(transform: transFrame)
            
            
            sceneView.session.add(anchor: archor)
            
        }
        
        timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(explode), userInfo: nil, repeats: false)
        
    }
    
    @objc func explode(){
        
        //游戏结束
        
        timer.invalidate()//暂停计时器
        
        if UserDefaults.standard.integer(forKey: "HighestScore") < score {
            
            UserDefaults.standard.set(score, forKey: "HighestScore")
        }
        
        //数一下有是多少炸弹
        for node in children{
            if let node = node as? SKLabelNode, node.name == "Bomb"{
               node.text = "💥"//control+command+空格可以坦诚emoj表情
                
               node.name = "Menu"
                
                let scaleExlode = SKAction.scale(to: 30, duration: 1.0)
                
                node.run(scaleExlode, completion: {
                    self.displayMenu()
                    self.score = 0
                    self.playing = false
                })
                
            }
        }
        
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        if !playing {
            playing = true
            for lable in children {
                lable.removeFromParent()//移除炸弹
            }
            self.addBomd()
        
        }else{
            //如果在游戏中
            //判断是否第一次点击屏幕
            guard let location = touches.first?.location(in: self) else{
               return
            }
            
            //查看所有子节点是否在范围内
            
            for node in children{
                
                timer.invalidate() //
                score += 1 // 分数加一
                
                
                if node.contains(location),node.name == "Bomb"{
                    //让他在0.5秒消失
                    
                    let fadeOut = SKAction.fadeOut(withDuration: 0.5)
                    node.run(fadeOut, completion: {
                        node.removeFromParent()
                        //添加新的炸弹
                        self.addBomd()
                    })


                }
            }
            
            
        }
        
        
    }
}

在viewcontroller中设置点击为炸弹

  func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
        // Create and configure a node for the anchor added to the view's session.
        let labelNode = SKLabelNode(text: "💣")
        labelNode.horizontalAlignmentMode = .center
        labelNode.verticalAlignmentMode = .center
        
        labelNode.fontSize = 50
        labelNode.name = "Bomb"
        return labelNode;
    }

代码地址

https://github.com/jinliyuelong/SpriteKitInAr

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容