SpriteKit與arkit結合炸彈小遊戲

Spritekit介紹

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

SKNode & SKScene
屬性:
Position: node 定位在座標系中的位置
xScale & yScale 尺寸的縮放
zRotate: 旋轉節點
Frame: 節點包含的矩形
Accumulated: 積累
Alpha: 透明度
isHidden: 是否可見
ignoresSiblingOrder:判別相同位置的兩個 node 他們是否並存 默認是不併存的 false 如果改成 true 則都可以看到,那麼假設說在 true 情況下,我們想要遮住他們的話,可以修改他們的 zPosition 數字比較大的會在上面


SKACtion:

runAction: 執行動作
runActionWithKey: 執行動作並且分配一個 key
runActionComlietion: 添加完成處理程序

集體的動作
Sequence: 子操作在另一個操作之後運行
Group: 子操作跟他同時進行
Repeat: 子操作運行行一定或是無線的循環操作
—————————-
hasAction: 當物件本身有操作的時候,我才進行子操作


PhysicsWorld:
將重力定義CGVector
SKPhyicsBody: 基於我們的物件所具有質量和提及的動態體


myTextureSpriteNode.physicsBody?.allowsRotation = true//是否改變重力衝擊的方向
myTextureSpriteNode.physicsBody?.restitution = 1.0
// restitution 每次的碰撞中損失了多少動力,默認 0.2

遊戲介紹

點擊炸彈,炸彈消失,超過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 = "
發佈了63 篇原創文章 · 獲贊 31 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章