Spritekit介紹
http://www.reibang.com/p/0427dc183ca8
游戲介紹
點擊炸彈慷暂,炸彈消失效五,超過5s沒有點擊 蛤高,發(fā)生爆炸
效果圖
點擊消失
超過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()
//分數(shù)
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")
}
//數(shù)一下有是多少炸彈
for node in children{
if let node = node as? SKLabelNode, node.name == "Bomb"{
node.text = "??"http://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
}
//查看所有子節(jié)點是否在范圍內
for node in children{
timer.invalidate() //
score += 1 // 分數(shù)加一
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;
}