日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何编写和精灵宝可梦一样的 app?

發(fā)布時(shí)間:2023/12/20 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何编写和精灵宝可梦一样的 app? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文:How To Make An App Like Pokemon Go
作者:Jean-Pierre Distler
譯者:kmyhy

如今最流行的一個(gè)手機(jī)游戲就是精靈寶可夢。它使用增強(qiáng)現(xiàn)實(shí)技術(shù)將游戲帶入到“真實(shí)世界”,讓玩家做一些對(duì)健康有益的事情。

在本教程中,我們將編寫自己的增強(qiáng)現(xiàn)實(shí)精靈捕獲游戲。這個(gè)游戲會(huì)顯示一張包含有你的位置和敵人的位置的地圖,用一個(gè) 3D SceneKit 視圖呈現(xiàn)后置攝像頭中拍攝的圖像和敵人的 3D 模型。

如果你第一次接觸增強(qiáng)現(xiàn)實(shí),你可以先看一下我們的基于地理位置的 RA 教程。對(duì)于要介紹如何編寫精靈寶可夢 app 的本教程來說,它不是必須的,但它里面包含了大量本教程未涉及的關(guān)于數(shù)學(xué)和 RA 的有用知識(shí)。

開始

本教程的開始項(xiàng)目在此處下載。項(xiàng)目包含了兩個(gè) view controller 和一個(gè) art.scnassets 文件夾,這個(gè)文件夾中包括了必須的 3D 模型和貼圖。

ViewController.swift 是一個(gè) UIViewController 子類,用于顯示 app 的 AR 內(nèi)容。MapViewController 用于顯示一張地圖,地圖上會(huì)包含你的當(dāng)前位置以及附近敵人的位置。一些基本的東西,比如約束和出口,都是已經(jīng)建好的了,你只需要關(guān)注本教程的核心內(nèi)容,即怎樣讓 app 長得像精靈寶可夢。

在地圖上添加敵人

在你能夠和敵人戰(zhàn)斗之前,需要知道敵人在哪。新建一個(gè) Swift 文件,叫做 ARItem.swift。

在文件的 ARItem.swift 的 import Foundation 一行后添加:

import CoreLocationstruct ARItem {let itemDescription: Stringlet location: CLLocation }

ARItem 有一個(gè)描述字段和一個(gè)坐標(biāo)。這樣我們就能夠知道是什么樣的敵人,以及它在哪里。

打開 MapViewController.swift 添加一個(gè) impor CoreLocation 語句以及一個(gè)屬性:

var targets = [ARItem]()

添加如下方法:

func setupLocations() {let firstTarget = ARItem(itemDescription: "wolf", location: CLLocation(latitude: 0, longitude: 0))targets.append(firstTarget)let secondTarget = ARItem(itemDescription: "wolf", location: CLLocation(latitude: 0, longitude: 0))targets.append(secondTarget)let thirdTarget = ARItem(itemDescription: "dragon", location: CLLocation(latitude: 0, longitude: 0))targets.append(thirdTarget) }

我們通過硬編碼的方式創(chuàng)建了 3 個(gè)敵人。我們會(huì)將坐標(biāo)(0,0) 替換成靠近你物理坐標(biāo)附近的坐標(biāo)。

有許多查找坐標(biāo)的方法。比如,可以在你當(dāng)前位置附近創(chuàng)建一些隨機(jī)的坐標(biāo),使用我們在上一篇教程的 PlacesLoader 或者 Xcode 模擬當(dāng)前位置。當(dāng)然,我們不想讓隨機(jī)坐標(biāo)出現(xiàn)在你鄰居的臥室里。那就尷尬了。

簡單點(diǎn)的方法,就是使用 Google 地圖。打開 https://www.google.com/maps/ 查找你當(dāng)前的位置。當(dāng)你點(diǎn)擊地圖,會(huì)顯示一個(gè)大頭釘,底部彈出一個(gè)氣泡。

在氣泡中會(huì)顯示你的經(jīng)緯度。我建議你從你的位置或你所在的街道附近創(chuàng)建出一些硬編碼的位置,這樣你就沒有必要去敲鄰居家門,告訴他你需要去他的臥室抓一條龍。

選擇 3 個(gè)位置,將上面代碼中的 0 替換成你選擇的坐標(biāo)。

在地圖上標(biāo)出敵人

我們已經(jīng)設(shè)定了敵人的坐標(biāo),應(yīng)該在地圖上將它們顯示出來。新增一個(gè) Swift 文件,取名為 MapAnnotation.swift。在這個(gè)文件中編寫如下代碼:

import MapKitclass MapAnnotation: NSObject, MKAnnotation {//1let coordinate: CLLocationCoordinate2Dlet title: String?//2let item: ARItem//3init(location: CLLocationCoordinate2D, item: ARItem) {self.coordinate = locationself.item = itemself.title = item.itemDescriptionsuper.init()} }

我們創(chuàng)建了一個(gè) MapAnnotation 類并實(shí)現(xiàn)了 MKAnnotation 協(xié)議。

  • 這個(gè)協(xié)議需要實(shí)現(xiàn)一個(gè) coordinate 屬性和 title 屬性。
  • item 屬性保存了和大頭釘相關(guān)的 ARItem。
  • 實(shí)現(xiàn)一個(gè)便利初始化方法,在方法中對(duì)所有屬性進(jìn)行賦值。
  • 回到 MapViewController.swift 在 setupLocations() 方法最后一句添加:

    for item in targets { let annotation = MapAnnotation(location: item.location.coordinate, item: item)self.mapView.addAnnotation(annotation) }

    循環(huán)遍歷 targets 數(shù)組,每個(gè) target 都會(huì)添加一個(gè)大頭釘?shù)降貓D上。

    在 viewDidLoad() 方法最后調(diào)用 setupLocations():

    override func viewDidLoad() {super.viewDidLoad()mapView.userTrackingMode = MKUserTrackingMode.followWithHeadingsetupLocations() }

    在定位之前,我們必須獲得權(quán)限。

    在 MapViewController 中添加一個(gè)新屬性:

    let locationManager = CLLocationManager()

    在 viewDidLoad() 最后一句,添加請(qǐng)求權(quán)限的代碼:

    if CLLocationManager.authorizationStatus() == .notDetermined {locationManager.requestWhenInUseAuthorization() }

    注意:如果不進(jìn)行權(quán)限請(qǐng)求,map view 無法加載用戶位置。而且不會(huì)提示任何錯(cuò)誤信息。每當(dāng)你調(diào)用位置服務(wù)時(shí),你都無法獲得位置信息,要排除錯(cuò)誤請(qǐng)首先從這個(gè)地方開始。

    運(yùn)行 app,等一會(huì)地圖將縮放到你的當(dāng)前位置并顯示出一些紅色的大頭釘,它們表示了敵人的位置。

    添加增強(qiáng)現(xiàn)實(shí)效果

    我們有一個(gè)看起來不錯(cuò)的 app,但我們還需要添加一些 AR 元素。在下一節(jié),我們將添加一個(gè)攝像窗口并添加一個(gè)簡單的方塊來代表敵人。

    首先我們需要跟蹤用戶位置。在 MapViewController 聲明屬性:

    var userLocation: CLLocation?

    然后添加一個(gè)擴(kuò)展:

    extension MapViewController: MKMapViewDelegate {func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {self.userLocation = userLocation.location} }

    每次設(shè)備的位置發(fā)生改變,這個(gè)方法會(huì)被調(diào)用。這個(gè)方法中,我們簡單地保存了用戶位置,以便在另一個(gè)方法中使用。

    在擴(kuò)展中添加委托方法:

    func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {//1let coordinate = view.annotation!.coordinate//2if let userCoordinate = userLocation {//3if userCoordinate.distance(from: CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)) < 50 {//4let storyboard = UIStoryboard(name: "Main", bundle: nil)if let viewController = storyboard.instantiateViewController(withIdentifier: "ARViewController") as? ViewController {// more code later//5if let mapAnnotation = view.annotation as? MapAnnotation {//6self.present(viewController, animated: true, completion: nil)}}}} }

    當(dāng)用戶點(diǎn)擊到一個(gè)距離你不超過 50 米的敵人時(shí),顯示一個(gè)攝像畫面:

  • 獲取所選中的大頭釘?shù)淖鴺?biāo)。
  • 去報(bào) uerLocation 不為空。
  • 確認(rèn)所點(diǎn)的大頭釘在用戶位置 50 米范圍內(nèi)。
  • 從故事版中實(shí)例化一個(gè) ARViewController 實(shí)例。
  • 檢查被點(diǎn)擊到的大頭釘類型是 MapAnnotation。
  • 顯示 viewController。
  • 運(yùn)行 app,點(diǎn)擊你位置附近的任意大頭釘,會(huì)顯示一個(gè)空白的 view controller:

    添加攝像畫面

    打開 ViewController.swift,在 import SceneKit 后面添加 import AVFoundation:

    import UIKit import SceneKit import AVFoundationclass ViewController: UIViewController { ...

    添加兩個(gè)屬性用于保存一個(gè) AVCaptureSession 對(duì)象和一個(gè) AVCaptureVideoPreviewLayer 對(duì)象:

    var cameraSession: AVCaptureSession? var cameraLayer: AVCaptureVideoPreviewLayer?

    我們會(huì)用 capture session 來訪問視頻輸入(比如鏡頭)和輸出(比如取景框)。

    添加一個(gè)方法:

    func createCaptureSession() -> (session: AVCaptureSession?, error: NSError?) {//1var error: NSError?var captureSession: AVCaptureSession?//2let backVideoDevice = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back)//3if backVideoDevice != nil {var videoInput: AVCaptureDeviceInput!do {videoInput = try AVCaptureDeviceInput(device: backVideoDevice)} catch let error1 as NSError {error = error1videoInput = nil}//4if error == nil {captureSession = AVCaptureSession()//5if captureSession!.canAddInput(videoInput) {captureSession!.addInput(videoInput)} else {error = NSError(domain: "", code: 0, userInfo: ["description": "Error adding video input."])}} else {error = NSError(domain: "", code: 1, userInfo: ["description": "Error creating capture device input."])}} else {error = NSError(domain: "", code: 2, userInfo: ["description": "Back video device not found."])}//6return (session: captureSession, error: error) }

    這個(gè)方法負(fù)責(zé)這些事情:

  • 創(chuàng)建一些變量,用于返回一些值。
  • 獲得后置攝像頭。
  • 如果攝像頭有效,獲取它的輸入。
  • 創(chuàng)建 AVCaptureSession 對(duì)象。
  • 將后置攝像頭輸入添加到 capture session。
  • 返回一個(gè)元組,包含 captureSession 和 error。
  • 現(xiàn)在我們已經(jīng)從攝像頭拿到輸入了,就可以把它添加到視圖中:

    func loadCamera() {//1let captureSessionResult = createCaptureSession()//2 guard captureSessionResult.error == nil, let session = captureSessionResult.session else {print("Error creating capture session.")return}//3self.cameraSession = session//4if let cameraLayer = AVCaptureVideoPreviewLayer(session: self.cameraSession) {cameraLayer.videoGravity = AVLayerVideoGravityResizeAspectFillcameraLayer.frame = self.view.bounds//5self.view.layer.insertSublayer(cameraLayer, at: 0)self.cameraLayer = cameraLayer} }

    代碼解釋如下:

    • 首先調(diào)用前面的方法獲得一個(gè) capture session。
    • 判斷是否有錯(cuò)誤發(fā)生,或者 capture session 為空,如果是立即 return,和 AR 說 bye-bye 吧!
    • 否則,將 capture session 保存到 cameraSession 變量。
    • 創(chuàng)建攝像預(yù)覽圖層,如果創(chuàng)建成功,設(shè)置它的 videoGravity 屬性和 frame 屬性,讓它占據(jù)整個(gè)屏幕。
    • 將攝像預(yù)覽圖層(取景框)添加到 sublayers 中并保存到 cameraLayer 變量。

    然后,在 viewDidLoad() 加入:

    loadCamera()self.cameraSession?.startRunning()

    這里只做了兩件事情:首先調(diào)用前面編寫的方法,然后打開鏡頭取景框。這個(gè)取景框立馬會(huì)顯示到預(yù)覽圖層上。

    運(yùn)行 app,點(diǎn)擊你身邊的任何一個(gè)位置,你會(huì)看到一個(gè)全新的鏡頭預(yù)覽界面:

    添加方塊

    干得不錯(cuò),但這還不算真正的 RA。在這一節(jié),我們將添加一個(gè)簡單的方塊來表示敵人,并根據(jù)用戶的位置和朝向來移動(dòng)它。

    這個(gè)游戲會(huì)有兩種敵人:狼和龍。

    因此,我們需要知道敵人的種類以及應(yīng)該在哪里顯示它們。

    在 ViewController 中添加如下屬性(用于保存敵人的信息):

    var target: ARItem!

    打開 MapViewController.swift, 找到 mapView(_:, didSelect:) 將最后一個(gè) if 語句修改為:

    if let mapAnnotation = view.annotation as? MapAnnotation {//1viewController.target = mapAnnotation.itemself.present(viewController, animated: true, completion: nil) }

    在顯示 viewController 之前,將一個(gè) ARItem(它是被點(diǎn)擊的大頭釘?shù)?item 屬性)賦給它。這樣,viewController 就能夠知道當(dāng)前敵人的種類。

    現(xiàn)在 ViewController 已經(jīng)獲得了 target 的信息了。

    打開 ARItem.swift 導(dǎo)入 SceneKit。

    import Foundation import SceneKitstruct ARItem { ... }

    添加一個(gè)屬性,用于保存一個(gè) SCNNode 對(duì)象:

    var itemNode: SCNNode?

    確保這個(gè)屬性聲明在 ARItem 結(jié)構(gòu)的其它屬性之后,因?yàn)樵陔[式的初始化方法將使用相同的順序來定義參數(shù)。

    Xcode 會(huì)提示 MapViewController.swift 中有一個(gè)錯(cuò)誤。要解決這個(gè)錯(cuò)誤,請(qǐng)打開這個(gè)文件,找到 setupLocations() 方法。

    我們需要修改在編輯器左邊標(biāo)有一個(gè)紅點(diǎn)的代碼。

    對(duì)于這些代碼,我們都需要將缺少的 itemNode 參數(shù)用 nil 來補(bǔ)上。

    例如,這一行:

    let firstTarget = ARItem(itemDescription: "wolf", location: CLLocation(latitude: 50.5184, longitude: 8.3902))

    應(yīng)當(dāng)改為:

    let firstTarget = ARItem(itemDescription: "wolf", location: CLLocation(latitude: 50.5184, longitude: 8.3902), itemNode: nil)

    我們知道了敵人的種類,以及它們的位置,但我們還需要知道設(shè)備當(dāng)前朝向。

    打開 ViewController.swift ,導(dǎo)入 CoreLocation:

    import UIKit import SceneKit import AVFoundation import CoreLocation

    然后,增加屬性聲明:

    //1 var locationManager = CLLocationManager() var heading: Double = 0 var userLocation = CLLocation() //2 let scene = SCNScene() let cameraNode = SCNNode() let targetNode = SCNNode(geometry: SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0))

    代碼解釋如下:

  • 我們用一個(gè) CLLocationManager 去監(jiān)聽設(shè)備的朝向。heading 的單位為度,表示正北方或者磁北極偏轉(zhuǎn)角度。
  • 創(chuàng)建一個(gè) SCNode() 和一個(gè) SCNode 對(duì)象。targetNode 將用來放入一個(gè)立方體。
  • 在 viewDidLoad() 最后一句添加:

    //1 self.locationManager.delegate = self //2 self.locationManager.startUpdatingHeading()//3 sceneView.scene = scene cameraNode.camera = SCNCamera() cameraNode.position = SCNVector3(x: 0, y: 0, z: 10) scene.rootNode.addChildNode(cameraNode)

    代碼解釋如下:

  • 將 ViewController 設(shè)置為 CLLocationManager 委托。
  • 通過調(diào)用 startUpdatingHeading 方法,我們可以接收方向通知。默認(rèn),當(dāng)方向改變超過 1 度時(shí),委托方法會(huì)被調(diào)用。
    This sets ViewController as the delegate for the CLLocationManager.
  • 設(shè)置 SCNView。首先創(chuàng)建了一個(gè)空的 scene,然后將相機(jī)添加到其中。
  • 添加一個(gè)擴(kuò)展,實(shí)現(xiàn) CLLocationManagerDelegate 協(xié)議:

    extension ViewController: CLLocationManagerDelegate {func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {//1self.heading = fmod(newHeading.trueHeading, 360.0)repositionTarget()} }

    當(dāng)收到新的方向通知,CLLocationManager 會(huì)調(diào)用這個(gè)委托方法。fmod 對(duì) double 進(jìn)行取模運(yùn)算,確保方向的取值位于 0-359 之間。

    在 ViewController.swift 中添加一個(gè) repostionTarget()方法,注意是放在類實(shí)現(xiàn)而不是 CLLocationManagerDelegate 擴(kuò)展中:

    func repositionTarget() {//1let heading = getHeadingForDirectionFromCoordinate(from: userLocation, to: target.location)//2let delta = heading - self.headingif delta < -15.0 {leftIndicator.isHidden = falserightIndicator.isHidden = true} else if delta > 15 {leftIndicator.isHidden = truerightIndicator.isHidden = false} else {leftIndicator.isHidden = truerightIndicator.isHidden = true}//3let distance = userLocation.distance(from: target.location)//4if let node = target.itemNode {//5if node.parent == nil {node.position = SCNVector3(x: Float(delta), y: 0, z: Float(-distance))scene.rootNode.addChildNode(node)} else {//6node.removeAllActions()node.runAction(SCNAction.move(to: SCNVector3(x: Float(delta), y: 0, z: Float(-distance)), duration: 0.2))}} }

    代碼解釋如下:

  • getHeadingForDirectionFromCoordinate 這個(gè)方法用于計(jì)算從當(dāng)前位置到目標(biāo)的方向,具體實(shí)現(xiàn)后面介紹。
  • 計(jì)算設(shè)備當(dāng)前方向和目標(biāo)方向之間的偏轉(zhuǎn)角度(即 delta)。如果 delta 小于 -15,顯示左箭頭。如果大于 15,顯示右箭頭。如果在 -15 到 15 之間,兩個(gè)箭頭都隱藏,表示敵人就在屏幕中。
  • 計(jì)算從設(shè)備位置到敵人之間的距離。
  • 如果 itemNode 不為空……
  • 同時(shí) node 沒有父節(jié)點(diǎn),將 itemNode 的位置設(shè)置為 distance 并將 node 放到屏幕上。
  • 否則,刪除所有 action 并創(chuàng)建一個(gè)新的 action。
  • 如果你懂 SceneKit 或者 SpriteKit,則最后一句代碼你懂的。否則,這里會(huì)進(jìn)行更詳細(xì)的介紹。

    SCNAction.move(to:, duration:) 方法創(chuàng)建一個(gè) action,將節(jié)點(diǎn)以指定時(shí)間移動(dòng)到指定的位置。runAction(_:) 也是 SCNNode 方法,用于執(zhí)行一個(gè) action。我們還可以創(chuàng)建 action 組/序列。要了解更多內(nèi)容,請(qǐng)閱讀我們的這本書3D Apple Games by Tutorials。

    繼續(xù)實(shí)現(xiàn)前面未實(shí)現(xiàn)的方法。在 ViewController.swift 中添加這幾個(gè)方法:

    func radiansToDegrees(_ radians: Double) -> Double {return (radians) * (180.0 / M_PI) }func degreesToRadians(_ degrees: Double) -> Double {return (degrees) * (M_PI / 180.0) }func getHeadingForDirectionFromCoordinate(from: CLLocation, to: CLLocation) -> Double { //1let fLat = degreesToRadians(from.coordinate.latitude)let fLng = degreesToRadians(from.coordinate.longitude)let tLat = degreesToRadians(to.coordinate.latitude)let tLng = degreesToRadians(to.coordinate.longitude) //2let degree = radiansToDegrees(atan2(sin(tLng-fLng)*cos(tLat), cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(tLng-fLng))) //3if degree >= 0 {return degree} else {return degree + 360} }

    radiansToDegrees(_:) 和 degreesToRadians(_:) 方法用于將弧度和角度互轉(zhuǎn)。

    getHeadingForDirectionFromCoordinate(from:to:) 方法代碼解釋如下:

  • 首先,將角度轉(zhuǎn)換為弧度。
  • 然后用轉(zhuǎn)換后的弧度計(jì)算出方向在轉(zhuǎn)成角度。
  • 如果 degree 是負(fù)數(shù),將之加上 360 度讓數(shù)據(jù)更一致。這是可以的,因?yàn)?-90 度就等于 270 度。
  • 還需要幾個(gè)步驟才能運(yùn)行你的 app。

    首先,必須將用戶的坐標(biāo)傳遞給 viewController。打開 MapViewController.swift 找到 mapView(_:, didSelect:) 的最后一個(gè) if 語句,在顯示 view controller 之前加上這句:

    viewController.userLocation = mapView.userLocation.location!

    然后在 ViewController.swift 中添加這個(gè)方法:

    func setupTarget() {targetNode.name = "enemy"self.target.itemNode = targetNode }

    這個(gè)方法為 targetNode 設(shè)置一個(gè)名字,然后將它賦給 target。

    現(xiàn)在可以在 viewDidLoad() 方法最后來調(diào)用這個(gè)方法了。在添加完攝像頭之后添加:

    scene.rootNode.addChildNode(cameraNode) setupTarget()

    運(yùn)行 app,可以看到方塊在移動(dòng):

    美化我們的 app

    在開發(fā) app 初期用方塊或者圓球是一種簡單的處理方法,因?yàn)檫@樣省去了大量 3D 建模的時(shí)間——但 3D 模型看起來畢竟要漂亮得多。在這一節(jié),我們將繼續(xù)美化我們的 app ,為敵人加入 3D 模型,以及賦予玩家扔出火球的能力。

    打開 art.scnassets 文件夾,里面有兩個(gè) .dae 文件。它們包含了敵人的模型:狼和龍。

    接下來修改 ViewController.swift 中的 setupTarget() 方法,在其中加載這些 3D 模型并賦給目標(biāo)的 itemNode 屬性。

    將 setupTarget() 方法修改為:

    func setupTarget() {//1let scene = SCNScene(named: "art.scnassets/\(target.itemDescription).dae")//2let enemy = scene?.rootNode.childNode(withName: target.itemDescription, recursively: true)//3 if target.itemDescription == "dragon" {enemy?.position = SCNVector3(x: 0, y: -15, z: 0)} else {enemy?.position = SCNVector3(x: 0, y: 0, z: 0)}//4 let node = SCNNode()node.addChildNode(enemy!)node.name = "enemy"self.target.itemNode = node }

    代碼解釋如下:

  • 首先將模型加載到場景中。目標(biāo)的 itemDescription 屬性名和 .dae 文件名對(duì)應(yīng)。
  • 然后遍歷場景,查找其中和 itemDescription 名字相同的節(jié)點(diǎn)。這只會(huì)有一個(gè)節(jié)點(diǎn),即模型的根節(jié)點(diǎn)。
  • 調(diào)整模型放置的位置,以便兩個(gè)模型都會(huì)在同一地方出現(xiàn)。如果兩個(gè)模型都出自同一個(gè)設(shè)計(jì)師之手,可能這一步是不必要的。但是我的這兩個(gè)模型分別來自不同的設(shè)計(jì)師:狼來自于 3dwarehouse.sketchup.com ,龍來自于 https://clara.io。
  • 將模型添加到空節(jié)點(diǎn),然后將節(jié)點(diǎn)賦給當(dāng)前目標(biāo)的 itemNode 屬性。還剩下一個(gè)小問題,即觸摸的處理,放在后面介紹。
  • 運(yùn)行 app,你會(huì)看到一只立體的狼,這可比一個(gè)便宜的方塊要嚇人多了!

    事實(shí)上,這只狼足以讓你嚇得遠(yuǎn)遠(yuǎn)拋開了,但作為勇敢主角的你,逃跑從來不是你的選擇!接下來你應(yīng)該加上幾個(gè)火球,這樣你就能在成為狼的點(diǎn)心之前戰(zhàn)勝它了。

    拋出火球的最好時(shí)機(jī)是用戶的觸摸結(jié)束事件,因此在 ViewController.swift 中實(shí)現(xiàn)這個(gè)方法:

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {//1let touch = touches.first!let location = touch.location(in: sceneView)//2let hitResult = sceneView.hitTest(location, options: nil)//3let fireBall = SCNParticleSystem(named: "Fireball.scnp", inDirectory: nil)//4let emitterNode = SCNNode()emitterNode.position = SCNVector3(x: 0, y: -5, z: 10)emitterNode.addParticleSystem(fireBall!)scene.rootNode.addChildNode(emitterNode)//5 if hitResult.first != nil {//6target.itemNode?.runAction(SCNAction.sequence([SCNAction.wait(duration: 0.5), SCNAction.removeFromParentNode(), SCNAction.hide()]))let moveAction = SCNAction.move(to: target.itemNode!.position, duration: 0.5)emitterNode.runAction(moveAction)} else {//7emitterNode.runAction(SCNAction.move(to: SCNVector3(x: 0, y: 0, z: -30), duration: 0.5))} }

    代碼解釋如下:

  • 將觸摸轉(zhuǎn)換成場景坐標(biāo)。
  • hitTest(_, options:) 方法向指定的位置發(fā)射射線,返回一個(gè) SCNHitTestResult 數(shù)組,表示該射線所穿過的所有節(jié)點(diǎn)。
  • 從 SceneKit 粒子文件中加載粒子系統(tǒng),用于發(fā)射火球。
  • 將粒子系統(tǒng)加到一個(gè)空節(jié)點(diǎn)身上,然后將它放到屏幕下方以外。這使得火球看起來是從玩家位置發(fā)射的。
  • 判斷是否有碰撞發(fā)生……
  • 等待 0.5 秒,然后移除敵人所對(duì)應(yīng)的 itemNode。同時(shí)將粒子發(fā)射器節(jié)點(diǎn)移動(dòng)到敵人的位置。
  • 如果沒有碰撞發(fā)生,火球移動(dòng)到一個(gè)固定的位置。
  • 運(yùn)行 app,讓惡餓狼在火焰中焚燒吧!

    收尾工作

    要完成 app,我們還需要將敵人從列表中刪除,關(guān)閉 AR 視圖并回到地圖,以便找到下一個(gè)敵人。

    移除敵人應(yīng)當(dāng)在 MapViewController 中進(jìn)行,因?yàn)閿橙肆斜砭驮谀抢铩N覀兛梢哉f明只有一個(gè)方法的委托協(xié)議,當(dāng)目標(biāo)被擊中后調(diào)用這個(gè)方法。

    在 ViewController.swift 的類聲明之前,添加如下協(xié)議:

    protocol ARControllerDelegate {func viewController(controller: ViewController, tappedTarget: ARItem) }

    同時(shí)為 ViewController 聲明一個(gè)屬性:

    var delegate: ARControllerDelegate?

    委托方法會(huì)告訴委托對(duì)象說明時(shí)候發(fā)生了碰撞事件,然后委托對(duì)象就可以進(jìn)行下一步的處理。

    在 ViewController.swift 中找到 touchesEnded(_:with:) 方法,將if 語句中的代碼塊修改為:

    if hitResult.first != nil {target.itemNode?.runAction(SCNAction.sequence([SCNAction.wait(duration: 0.5), SCNAction.removeFromParentNode(), SCNAction.hide()]))//1let sequence = SCNAction.sequence([SCNAction.move(to: target.itemNode!.position, duration: 0.5),//2SCNAction.wait(duration: 3.5), //3SCNAction.run({_ inself.delegate?.viewController(controller: self, tappedTarget: self.target)})])emitterNode.runAction(sequence) } else {... }

    解釋如下:

  • 將粒子發(fā)射器節(jié)點(diǎn)的 action 改成一個(gè) action 序列,其中 move 動(dòng)作仍然保留。
  • move 動(dòng)作之后,暫停 3.5 秒。
  • 通知委托對(duì)象,target 被擊中。
  • 打開 MapViewController.swift 聲明一個(gè)屬性,用于保存 選中的大頭釘:

    var selectedAnnotation: MKAnnotation?

    這個(gè)屬性用于待會(huì)將它從地圖上移出。修改它的 viewController 的初始化和條件綁定(if let)部分的代碼:

    if let viewController = storyboard.instantiateViewController(withIdentifier: "ARViewController") as? ViewController {//1viewController.delegate = selfif let mapAnnotation = view.annotation as? MapAnnotation {viewController.target = mapAnnotation.itemviewController.userLocation = mapView.userLocation.location!//2selectedAnnotation = view.annotationself.present(viewController, animated: true, completion: nil)} }

    非常簡單:

  • 將 viewController 的委托設(shè)置為 MapViewController。
  • 保存用戶點(diǎn)中的大頭釘對(duì)象。
  • 在 MKMapViewDelegate 擴(kuò)展下面添加:

    extension MapViewController: ARControllerDelegate {func viewController(controller: ViewController, tappedTarget: ARItem) {//1self.dismiss(animated: true, completion: nil)//2let index = self.targets.index(where: {$0.itemDescription == tappedTarget.itemDescription})self.targets.remove(at: index!)if selectedAnnotation != nil {//3mapView.removeAnnotation(selectedAnnotation!)}} }

    代碼解釋如下:

  • 解散 AR 視圖。
  • 從 targets 數(shù)組中刪除 target。
  • 從地圖上刪除大頭釘。
  • 運(yùn)行 app,你將看到最終效果:

    結(jié)束

    最終完成的項(xiàng)目在這里下載。

    如果你想盡可能地學(xué)習(xí)如何編寫這個(gè) app,請(qǐng)參考下列教程:

    • 關(guān)于 MapKit 和位置服務(wù),請(qǐng)參考我們的 MapKit Swift 入門。
    • 關(guān)于視頻捕捉,請(qǐng)參考我們的 AVFoundation 系列。
    • 關(guān)于 SceneKit,請(qǐng)參考我們的 SceneKit 系列教程。
    • 要避免對(duì)敵人位置進(jìn)行硬編碼,則需要后臺(tái)數(shù)據(jù)的支持,請(qǐng)參考如何編寫一個(gè)簡單的 PHP/MySQL 服務(wù) 以及 如何用 Vapor 進(jìn)行服務(wù)端編程。

    希望你喜歡本教程。如果有任何問題和建議,請(qǐng)?jiān)谙旅媪粞浴?/p>

    總結(jié)

    以上是生活随笔為你收集整理的如何编写和精灵宝可梦一样的 app?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    av解说在线观看 | 夜夜操网| 91黄色小网站 | 国产欧美精品在线观看 | 国产啊v在线观看 | 97精品国自产拍在线观看 | av女优中文字幕在线观看 | 91成人网在线 | 激情综合网婷婷 | 日韩av视屏在线观看 | 五月天激情婷婷 | 黄色免费在线视频 | 成人av动漫在线观看 | 国产成人久久77777精品 | 日韩中文字幕第一页 | www视频在线播放 | 97超碰在线久草超碰在线观看 | 日日干夜夜爱 | 日韩毛片精品 | 五月婷av| 97免费公开视频 | 国产视频午夜 | av中文字幕日韩 | 四月婷婷在线观看 | 久久人人爽人人爽人人片 | 成人丁香花| 成人h在线观看 | 激情开心色 | 91精品啪在线观看国产线免费 | 久久精品国产亚洲精品 | 在线观看日韩免费视频 | 99精品国产一区二区 | 国产精品久久久久久久免费大片 | 亚洲精品国产精品国自产 | 在线观看免费一级片 | 91在线网址| 超碰在线中文字幕 | 日韩精品中文字幕一区二区 | 久久精品三级 | 久久免费99精品久久久久久 | 麻豆影视在线观看 | 色a综合| 久久综合网色—综合色88 | 丁香导航| 亚洲性少妇性猛交wwww乱大交 | 中文网丁香综合网 | 亚洲精品乱码久久久久久蜜桃欧美 | 91天天视频 | 美女免费网视频 | 精品久久久99 | 久久久精品国产一区二区电影四季 | 91香蕉久久 | 国产综合在线视频 | 色天天久久 | 99在线视频网站 | 特级西西444www高清大视频 | 国产视频精品在线 | 亚洲精品乱码久久久久v最新版 | 国产精品9999久久久久仙踪林 | 久久激情五月婷婷 | 91av原创| 日韩免费视频在线观看 | 香蕉网在线 | 国产精品一区欧美 | 国产亚洲综合性久久久影院 | 亚洲影音先锋 | 亚洲一区免费在线 | 在线成人av | 中文字幕国语官网在线视频 | 亚洲伊人婷婷 | 国产成人一区二区精品非洲 | 国产免费xvideos视频入口 | 久久国产精品久久久久 | 色婷婷激情电影 | 国产一级视频在线观看 | 欧美性生交大片免网 | 国产精品一区二区av影院萌芽 | 国产又粗又猛又色又黄网站 | 久久久久久高潮国产精品视 | 日韩欧美高清在线 | 中文字幕日韩一区二区三区不卡 | 黄网站免费大全入口 | 五月天婷婷在线观看视频 | 久久精品国产第一区二区三区 | 午夜久久视频 | 国产精品2区| 国产精品精品久久久 | 欧美性黄网官网 | 日本三级不卡视频 | 91丨九色丨蝌蚪丨老版 | av先锋中文字幕 | 97色婷婷成人综合在线观看 | 免费观看国产视频 | 亚洲人在线7777777精品 | 中文字幕久久网 | 国内一级片在线观看 | 亚洲精品资源 | 激情综合五月天 | 麻豆网站免费观看 | 日韩一级成人av | 成人黄色片免费 | 91秒拍国产福利一区 | 91视频下载| 欧美一级片播放 | 国产主播大尺度精品福利免费 | 奇米网在线观看 | 久久国产精品区 | 伊人天天综合 | 欧美在线91 | 欧美一进一出抽搐大尺度视频 | 91在线免费观看网站 | 懂色av一区二区在线播放 | 国产成人一区二区三区电影 | 国产成人99久久亚洲综合精品 | av国产在线观看 | 午夜精品久久一牛影视 | 免费激情在线电影 | 久久久激情网 | 国产专区一| 日韩高清免费观看 | 91视频在线免费看 | 免费v片| 九九在线免费视频 | 日本精品久久久久 | 天天操天天操天天操天天操 | 精品国产99 | 在线国产观看 | 日韩一区二区免费播放 | 97国产一区 | 成人网在线免费视频 | 日韩在线在线 | 国产午夜亚洲精品 | 亚洲精品视频在线免费 | 国产精品 国产精品 | 一二三区视频在线 | 国产精品免费久久久久影院仙踪林 | 亚洲欧美国产精品va在线观看 | 国产日韩精品一区二区三区 | 色在线视频| 成人精品影视 | 在线天堂中文www视软件 | 三级av在线| 久久免费影院 | 国产亚洲精品免费 | 五月婷婷一区二区三区 | 99在线免费视频观看 | 超级碰视频| 天天草天天插 | 国产黄色片久久久 | 日韩欧美在线第一页 | 美女视频黄免费的久久 | 欧美一区日韩精品 | 亚洲视频观看 | 在线黄色国产电影 | 婷婷精品国产一区二区三区日韩 | 国产1区在线观看 | 91在线公开视频 | 精品国产乱码一区二区三区在线 | 欧美国产日韩一区二区 | 不卡视频在线看 | 在线免费看黄网站 | 五月色综合 | 99久久99久久精品 | 手机av在线免费观看 | 亚洲精品视频二区 | 精品毛片久久久久久 | 国内精品免费久久影院 | 午夜精品一区二区三区可下载 | 国产午夜视频在线观看 | 99精品视频免费观看 | 日韩亚洲国产精品 | 一区在线观看 | 日韩免费b | 天干啦夜天干天干在线线 | 美女视频黄免费 | 五月天婷婷丁香花 | 国产精品福利无圣光在线一区 | 国产精品男女啪啪 | 91在线视频免费观看 | 日韩久久精品一区二区 | 亚洲精品乱码久久久久久蜜桃91 | 免费一级黄色 | 国产高清视频免费在线观看 | 国产中年夫妇高潮精品视频 | 99色99| 天堂在线一区二区三区 | 黄色日批网站 | 日韩在线观看第一页 | av电影免费在线看 | 黄色电影在线免费观看 | 日韩电影中文,亚洲精品乱码 | 国产精品国产三级国产aⅴ9色 | 嫩模bbw搡bbbb搡bbbb | 免费黄色看片 | 久热av在线| 国产视频一二三 | 人人看97| 亚洲免费av一区二区 | 国产视频日韩 | 亚洲在线高清 | 中文字幕人成乱码在线观看 | 日韩三级视频在线看 | 在线观看av免费观看 | 中文字幕色站 | 狠狠操狠狠干天天操 | 亚洲年轻女教师毛茸茸 | 五月精品 | 国产 字幕 制服 中文 在线 | 欧美日韩亚洲在线观看 | 亚洲精品一区二区三区高潮 | 国产一级免费在线观看 | 国产免费xvideos视频入口 | 久久国产精品一二三区 | 日韩三级视频 | 亚洲国产精品免费 | 国产精品成人一区二区三区吃奶 | 五月天天色 | 久久中文精品视频 | 97免费在线观看视频 | 天堂av网站 | av资源在线看 | 日日草夜夜操 | 国产精品一区二区 91 | 99久视频 | 热久久视久久精品18亚洲精品 | 色婷婷激情综合 | 国产精品久久久久久久久久99 | a级一a一级在线观看 | 91免费高清观看 | 日韩精品中字 | 国产精品成人av电影 | 8x成人免费视频 | 精品你懂的 | 最近日本字幕mv免费观看在线 | 四虎www | 亚洲综合欧美日韩狠狠色 | 91免费观看视频网站 | www.夜夜操.com | 美女网站黄免费 | 国产精品成人aaaaa网站 | 亚洲专区视频在线观看 | 亚洲成人资源 | 美女免费视频网站 | 午夜av一区二区三区 | 日韩激情综合 | 97成人在线视频 | 又紧又大又爽精品一区二区 | 久久精品123 | 日韩高清片 | 久久国产高清视频 | 日日爱夜夜爱 | 国产精品精品久久久久久 | 欧美日韩在线免费视频 | 色七七亚洲影院 | 国产xxxx性hd极品 | 久草视频在线看 | 欧美色图亚洲图片 | 精品国产亚洲日本 | 亚洲婷婷丁香 | 91久久一区二区 | 免费在线观看日韩欧美 | 亚洲高清免费在线 | 天天干天天操天天爱 | 日韩欧美极品 | 日韩h在线观看 | 国产在线国偷精品产拍 | 久青草视频在线观看 | 欧美性生活小视频 | 亚洲精品在线观看不卡 | 成人影片免费 | 探花视频免费观看高清视频 | 人人插人人爱 | 亚洲精品国产精品国自产观看浪潮 | 中文字幕久久精品 | 成人一区二区三区在线 | 免费av网站在线看 | 五月婷婷在线视频观看 | 激情av一区二区 | 91在线永久 | 国产精品99久久久久久久久 | 国产成人av片 | 中文字幕有码在线观看 | 亚洲国产高清视频 | 久久av高清 | 日日夜夜狠狠干 | 天天干天天操天天入 | 麻豆影视网站 | 中文字幕在线视频国产 | 国产精品久久久久久高潮 | 精品久久久久久国产偷窥 | 五月天激情综合网 | 91久久丝袜国产露脸动漫 | 久久综合久久综合九色 | 综合色婷婷 | 中文 一区二区 | 久草网在线视频 | 特黄一级毛片 | 99国产一区二区三精品乱码 | 久草在线免费播放 | 天天操天天添 | 日韩在线一级 | av免费在线网 | 色七七亚洲影院 | 午夜精选视频 | 免费看一级黄色大全 | 免费成人在线网站 | 精品久久网站 | 国产精品亚洲视频 | 天天躁天天狠天天透 | 日韩中文字幕免费在线观看 | 国产精品久久久久毛片大屁完整版 | 欧美一区成人 | 99久久夜色精品国产亚洲96 | 天天综合网 天天综合色 | 欧美韩国日本在线 | 综合久久久久久 | 91视频3p | 天天综合视频在线观看 | 国产精品白丝av | 成人久久久久久久久久 | 亚洲成免费 | 精品久久久久久久久亚洲 | 国产无遮挡猛进猛出免费软件 | 91大神一区二区三区 | 综合久久一本 | 天天色官网 | 一二区av| 中文字幕麻豆 | 超碰九九| 国产理论片在线观看 | 国产手机av在线 | 国产三级精品在线 | 欧美激情片在线观看 | 中文av字幕在线观看 | 国产精品成人在线 | 国产流白浆高潮在线观看 | 欧美成年网站 | 国产精品自在线 | 黄色片软件网站 | 韩国av不卡 | 97国产情侣爱久久免费观看 | 99精品免费在线 | 欧美日韩不卡在线视频 | 成全在线视频免费观看 | 亚洲成aⅴ人在线观看 | 国产美女搞久久 | 亚洲精品午夜一区人人爽 | 在线中文字幕一区二区 | 成人sm另类专区 | 超碰免费av| 成人网看片 | www麻豆视频| 夜夜操天天操 | 人人干人人做 | 8x成人在线| 国产精品美女久久久久久久久 | 国产高清在线免费视频 | 激情欧美丁香 | 日韩免费看 | 成人免费观看视频大全 | 国产精品久久久久久久婷婷 | 五月婷婷av在线 | 国产成人精品亚洲 | 欧美日韩一区二区在线观看 | 99精品免费在线 | 国产亚洲成av人片在线观看桃 | 亚洲黄色app | 国产精品爽爽爽 | 2022国产精品视频 | 欧美在线观看视频 | 97香蕉超级碰碰久久免费软件 | 欧美视频在线观看免费网址 | 97成人免费 | 亚洲国产精品成人va在线观看 | 国产大陆亚洲精品国产 | 97国产大学生情侣白嫩酒店 | 欧美一二三专区 | 久久色网站 | 久久国产精品视频 | 婷婷五综合| 久久激情网站 | 99午夜| 在线免费国产视频 | 五月婷婷综合网 | 69夜色精品国产69乱 | 中文字幕视频一区 | 欧美成人xxx | 99热这里只有精品在线观看 | 成全免费观看视频 | 天天草天天色 | 在线成人短视频 | 成人国产网站 | 国产精品爽爽久久久久久蜜臀 | 日韩午夜视频在线观看 | 伊人狠狠 | 久久最新网址 | 亚洲人精品午夜 | 日韩午夜在线播放 | 久久久国产精品亚洲一区 | 超碰在线人 | 久久网站av| 国产精品美女久久久久aⅴ 干干夜夜 | 欧美a免费 | 美女视频黄是免费的 | 日本爱爱免费 | 国产一区在线精品 | 欧美夫妻生活视频 | 日韩精品久久久久久 | 国产主播大尺度精品福利免费 | 色就是色综合 | 久久综合精品一区 | 精品国产伦一区二区三区观看方式 | 91一区啪爱嗯打偷拍欧美 | 奇米影视四色8888 | zzijzzij亚洲成熟少妇 | 韩国av免费观看 | 国偷自产视频一区二区久 | 精品一区二区三区在线播放 | 久久草网站 | 国内三级在线观看 | 麻豆一精品传二传媒短视频 | 99在线观看| www.久久com | 九九精品在线观看 | 色资源在线 | 亚洲精品动漫成人3d无尽在线 | 最新日韩在线观看 | 欧美欧美 | 国产综合精品久久 | 日韩精品不卡 | 天天摸天天操天天舔 | 五月激情站 | 欧美日韩在线精品一区二区 | 福利网址在线观看 | 欧美日韩在线视频一区 | 日韩在线观看免费 | 又黄又爽又无遮挡免费的网站 | 日韩经典一区二区三区 | 国产一区二区三区 在线 | 国产艹b视频| 夜夜操夜夜干 | 美女网站在线看 | 国产91免费在线观看 | 欧美a√大片 | 久久中文网 | 东方av免费在线观看 | 久久久激情视频 | 又黄又爽又刺激 | 色片网站在线观看 | 日本在线观看一区二区三区 | 在线观看国产日韩 | 国产999精品久久久久久麻豆 | 91在线视频精品 | 中文字幕在线看视频 | 久久电影色 | 99久e精品热线免费 99国产精品久久久久久久久久 | 国产高清免费观看 | 349k.cc看片app| 在线天堂中文www视软件 | 九九热av | 久久综合精品一区 | 亚洲精品视频在线观看免费视频 | 亚洲综合欧美日韩狠狠色 | 日韩免费大片 | 午夜三级影院 | 久久亚洲精品电影 | 欧美一级片免费 | 亚洲精品www久久久 www国产精品com | 狠狠干狠狠插 | 欧美日韩国产亚洲乱码字幕 | 黄色电影在线免费观看 | 国产精品久久久久高潮 | 亚洲欧美日韩中文在线 | 在线黄色国产电影 | 久久影视网 | 国产亚洲成人网 | 久久精品麻豆 | 一级黄色网址 | 欧美日韩在线精品一区二区 | av在线a| 国内精品久久久久久久久久久 | 永久免费精品视频网站 | 国产美女视频免费观看的网站 | 亚洲精品在 | 欧美精品九九99久久 | 午夜美女福利直播 | 97日日碰人人模人人澡分享吧 | 国产成人精品一区二区三区福利 | 久久免费毛片视频 | 国产视频日韩视频欧美视频 | 中文av资源站| 中文国产成人精品久久一 | 国产成人精品一区二区三区福利 | 五月婷在线| 精品视频免费久久久看 | 日韩精品一区电影 | 亚洲国产综合在线 | 99精品国产一区二区三区不卡 | 色在线国产 | 国产69久久久 | 天天摸日日操 | 青青五月天 | 欧美,日韩| 毛片网在线 | 国产aaa毛片 | 中文在线a√在线 | 黄色片软件网站 | 人人爽人人澡人人添人人人人 | 欧美人牲| 九九九在线观看视频 | 日本精品一区二区三区在线播放视频 | 色婷婷97 | 日韩在线免费观看视频 | 色五月成人 | 亚洲国产播放 | 中文超碰字幕 | 欧美在线观看视频一区二区三区 | 成人性生交视频 | 蜜桃视频在线视频 | 青春草免费视频 | 国产精品涩涩屋www在线观看 | 国产91精品久久久久久 | 久久精品国产精品亚洲 | 久久久激情视频 | 色干干 | 日日夜夜天天久久 | 久久精品一二三区白丝高潮 | 中文字幕在线播放日韩 | 欧美精品在线视频 | 97av在线 | 亚洲国产成人精品在线 | 黄色三级在线看 | 欧美精品成人在线 | 久久一级电影 | 一区在线观看 | 韩日电影在线观看 | 天天干天天拍天天操 | 激情婷婷| 国产日韩在线视频 | 亚洲日韩中文字幕在线播放 | 91精品爽啪蜜夜国产在线播放 | 国产1区2区 | 三级黄色欧美 | 丁香花中文在线免费观看 | 日韩二区在线 | 99精品在线观看视频 | 九九九九九国产 | 色综合久久66 | 日韩久久久久久久久久久久 | 日韩精品一区在线播放 | 国产手机视频在线观看 | 在线黄色免费 | 日韩v欧美v日本v亚洲v国产v | 一本一道久久a久久精品蜜桃 | 日韩精品一区二区三区三炮视频 | 精品视频一区在线观看 | 丁香九月婷婷 | 亚洲狠狠婷婷综合久久久 | 四虎成人网 | 亚洲国产福利视频 | 成年人在线观看网站 | 亚洲欧美在线视频免费 | 日韩三级一区 | 亚洲国产精品视频在线观看 | 视频在线精品 | 爱爱一区| 日韩一级精品 | 99这里只有久久精品视频 | 精品亚洲欧美无人区乱码 | 99精品亚洲 | 天天插综合 | www在线观看视频 | 黄色片免费在线 | av成人资源 | 国产麻豆视频在线观看 | 国产天天综合 | 国产成人精品999在线观看 | 日韩免费福利 | 国产高清视频免费观看 | 欧美精品天堂 | 久久精品免费电影 | 久久久久久欧美二区电影网 | 免费色视频| av成人在线观看 | 夜添久久精品亚洲国产精品 | 国产v在线播放 | 久久久国产毛片 | 在线小视频你懂的 | 婷婷丁香九月 | 97精品电影院 | 成人国产精品一区二区 | 91精品国自产在线偷拍蜜桃 | 国产精品va在线观看入 | 99久久99精品 | 国产在线看| 五月婷婷在线观看 | 国产高清一区二区 | 亚洲精品免费在线播放 | av中文字幕在线观看网站 | 激情欧美日韩一区二区 | 免费黄色网址大全 | 中文字幕资源站 | 精品国产精品久久一区免费式 | 欧美日韩aa | 免费高清在线视频一区· | 91成人国产 | 激情五月激情综合网 | avwww在线观看| 欧美极度另类 | 日韩a级黄色 | 欧美日韩久久 | 一区二区三区精品在线视频 | 久久综合天天 | 亚洲综合在线观看视频 | 国产精品女同一区二区三区久久夜 | 国产剧情在线一区 | 欧美激情第十页 | www.99av| 五月天久久狠狠 | 久久女同性恋中文字幕 | 中文字幕日韩一区二区三区不卡 | 成人三级黄色 | 欧美日韩精品在线观看 | 免费在线a | 天天色天天射综合网 | 国产精品一区在线观看你懂的 | 91午夜精品| www欧美日韩 | 久久久免费电影 | 久草在线视频资源 | 国产一级片毛片 | 99久久婷婷国产综合精品 | 一个色综合网站 | 韩国av电影在线观看 | 欧美韩国日本在线观看 | 国产一区二区视频在线播放 | 亚洲精品黄色片 | 这里有精品在线视频 | 91麻豆精品国产91久久久久久 | 久久精品美女 | 午夜久久久影院 | 亚洲日韩中文字幕在线播放 | 免费看黄在线看 | 日韩av午夜在线观看 | 在线中文字幕网站 | 国产精品粉嫩 | 麻豆影视网站 | 亚洲.www | 国产精品久久久久久a | 中文电影网 | 国产精品久久久久久一区二区 | 在线免费色视频 | 欧美精品久 | av官网在线 | 婷婷久久五月天 | 婷婷色综| 精品国产一区二区三区免费 | 色视频国产直接看 | 在线观看一区二区视频 | 欧美另类高清 videos | 成人高清av在线 | 久久在线视频精品 | 日韩欧美视频二区 | 日韩三级久久 | 亚洲精品资源 | 欧美日韩精品在线观看视频 | 日韩va欧美va亚洲va久久 | 三上悠亚在线免费 | 狠狠色狠狠色合久久伊人 | 在线观看岛国 | 中文字幕欧美三区 | 国内久久 | 国产成人久久精品77777 | 天天草综合网 | 五月婷在线 | 色婷婷丁香| 精品视频免费观看 | 久久久人人人 | 亚洲精品综合欧美二区变态 | 51久久成人国产精品麻豆 | 亚洲亚洲精品在线观看 | 亚洲欧美国内爽妇网 | 日韩欧美一二三 | 国产一级视屏 | 在线免费观看黄色大片 | 国产精品女人久久久久久 | 国产剧情一区二区 | 亚洲电影图片小说 | 丰满少妇高潮在线观看 | 日韩av电影中文字幕在线观看 | 最近中文字幕mv免费高清在线 | 亚州精品一二三区 | 日本爱爱免费视频 | 久久成电影| 在线观看日本高清mv视频 | 在线一区观看 | 亚洲精品视频中文字幕 | 91在线观看视频网站 | 一区二区视频播放 | 国产一区二区三区四区大秀 | 在线中文字幕一区二区 | 国产美女免费看 | 在线亚洲成人 | 婷婷在线资源 | 久热爱 | 视频一区二区三区视频 | 日日躁你夜夜躁你av蜜 | 亚洲精品白浆高清久久久久久 | 草久在线观看 | 91精品中文字幕 | 久久成电影 | 欧美一级性生活 | 欧美亚洲精品在线观看 | japanesefreesexvideo高潮 | 久久免费影院 | 天天操天天草 | 中文字幕乱视频 | a级一a一级在线观看 | 久久久999精品视频 国产美女免费观看 | 欧洲在线免费视频 | 亚洲人xxx| 91精品在线免费视频 | 天天操天天色天天射 | 亚洲性少妇性猛交wwww乱大交 | 一区二区三区视频网站 | 日韩色综合 | 日韩激情中文字幕 | 国产综合精品一区二区三区 | 亚洲一级久久 | 精品国产电影一区二区 | www91在线观看 | 国产一区二区精品久久 | 久久99久久99精品免观看粉嫩 | 96超碰在线 | 欧美日本在线观看视频 | 久久免费的视频 | 色婷丁香 | 成人91视频| 欧美日韩免费观看一区二区三区 | 亚洲欧美日韩一级 | 超碰97中文| 91麻豆精品久久久久久 | 91大神精品视频在线观看 | 国内久久看 | 天天操天天操天天操天天操天天操天天操 | 日韩中文字幕网站 | 欧美亚洲一区二区在线 | 国内99视频 | 青草草在线视频 | 99在线热播精品免费 | 国产二区电影 | 国产一二区视频 | 免费视频黄色 | 免费看片亚洲 | 九九免费精品视频 | 97精品伊人 | 91亚洲免费 | 99视频在线播放 | 亚洲精品国产精品99久久 | 国产成人精品一区二区三区福利 | 粉嫩av一区二区三区四区五区 | 很黄很色很污的网站 | 中文字幕国产在线 | 日韩中文在线字幕 | 国模视频一区二区三区 | 成人av播放| 日韩精品aaa | 国产亚洲在线观看 | 麻豆久久久久久久 | 精品主播网红福利资源观看 | 亚洲精品五月天 | 日韩视频一| 成人四虎 | 欧美最新另类人妖 | 日韩伦理片一区二区三区 | 久久久久久久国产精品影院 | 最近中文字幕第一页 | 男女激情麻豆 | 91视频88av | 在线黄色av | 日韩超碰在线 | a午夜电影 | 在线观看岛国片 | 九九三级毛片 | 黄色一级网 | 中文字幕乱码电影 | 欧美一级电影在线观看 | 一区二区中文字幕在线观看 | 最近中文字幕mv免费高清在线 | 国产中年夫妇高潮精品视频 | 综合久久久久久久久 | 日韩一区二区三区免费视频 | 国产精品久久久久久五月尺 | 久久久久国产精品免费网站 | 美女免费黄网站 | 亚洲日本一区二区在线 | 久一网站 | 国产成人精品久久久久 | 免费日p视频| 久久久99精品免费观看 | 欧美与欧洲交xxxx免费观看 | 国产欧美日韩精品一区二区免费 | 亚洲色影爱久久精品 | 久久99久久99精品免观看软件 | 波多野结衣在线观看视频 | 欧美午夜理伦三级在线观看 | 我要看黄色一级片 | 一区二区三区四区精品视频 | 国产大陆亚洲精品国产 | 国产裸体bbb视频 | 欧美黄在线 | 国产日韩一区在线 | 欧美日韩国产成人 | 91在线视频导航 | 国产97视频| 日韩1级片 | 91爱爱网址 | 亚洲一区美女视频在线观看免费 | 亚洲欧美国产精品va在线观看 | 一二三精品视频 | 在线看欧美| 国产一区在线精品 | 亚洲精品美女免费 | 国产福利资源 | 久久视频99 | 爱爱av在线| 久久亚洲专区 | 精品久久久精品 | 超碰人人乐| 久久精品日产第一区二区三区乱码 | 国内精品久久久久影院男同志 | 国产精品久久久久久久久久白浆 | 狠狠色香婷婷久久亚洲精品 | av网站有哪些 | 五月天天在线 | 一区二区中文字幕在线播放 | 国产精品久一 | 国产日韩在线播放 | 在线 视频 一区二区 | 色噜噜在线观看 | 在线观看中文字幕视频 | 新av在线 | 欧美日韩国产二区 | 手机成人免费视频 | www五月天婷婷 | 日韩在线免费视频 | 国产成人精品一二三区 | 日韩欧美国产激情在线播放 | 日本aaa在线观看 | 99久久99视频 | 97精品视频在线播放 | 国产美女视频一区 | 久久久久久久久久久成人 | 一区二区视频网站 | 国产精品久久久久久久99 | 黄a在线观看 | a在线免费观看视频 | 在线观看国产麻豆 | 亚洲欧美综合精品久久成人 | 欧美作爱视频 | 婷婷精品在线视频 | 韩国一区在线 | 亚洲精品国产高清 | 久久免费高清 | 国产乱对白刺激视频在线观看女王 | 91精彩在线视频 | 久草精品视频在线观看 | 日韩av视屏 | 国产精品18久久久久久久久久久久 | 免费黄色网址大全 | 国产精品3区 | 国产成人一区二 | 丁香午夜 | 五月婷婷六月综合 | 国产特级毛片aaaaaa毛片 | 在线视频欧美精品 | 国产专区在线视频 | 成人免费影院 | 五月激情久久久 | 在线观看中文字幕第一页 | 天天操天 | 亚洲丝袜一区二区 | 久久国产综合视频 | aa级黄色大片 | 国产99久久久精品视频 | 国产九九热视频 | 久久精品91久久久久久再现 | 成人91在线 | 亚洲精品 在线视频 | 日韩一区正在播放 | 亚洲国产午夜 | 免费精品视频在线 | 国产 一区二区三区 在线 | 天天色天天射天天操 | 国产精品久久久久一区二区三区 | 成人免费观看a | 一本一本久久a久久 | 91chinesexxx| 成人久久18免费网站 | 超碰成人网 | 在线日韩 | 久久久久久久免费 | 亚洲国产成人精品在线 | 婷婷久久综合九色综合 | 久久综合亚洲鲁鲁五月久久 | 麻豆国产电影 | 美国三级黄色大片 | 久久夜色精品国产欧美一区麻豆 | 日韩中文字幕免费在线播放 | 亚洲最新视频在线 | 国产成人久久精品77777 | 91九色蝌蚪国产 | 久久视频在线观看中文字幕 | 中文字幕视频观看 | 国产高清专区 | 中文字幕在线播出 | 欧美欧美| 久久精品久久国产 | 久艹在线播放 | 成人在线黄色 | 午夜久久福利视频 | 久久国产综合视频 | 国产精品99久久久久人中文网介绍 | 国产生活一级片 | 亚洲电影av在线 | 日韩av手机在线看 | 亚洲一级免费电影 | 欧美极品少妇xbxb性爽爽视频 | 婷婷去俺也去六月色 | 91九色蝌蚪视频在线 | 好看av在线 | a电影在线观看 | 日本韩国精品一区二区在线观看 | 91av精品| 欧美福利视频一区 | 久久曰视频| 免费观看成人网 | 久久精品高清视频 | 欧美少妇xx | 中文字幕 在线 一 二 | 久久久久久久久久久黄色 | 日韩免费一级电影 | 亚洲美女精品 | 91福利专区 | 日韩黄色一区 | 久久国产精品二国产精品中国洋人 | 麻豆精品视频 | 中文字幕影片免费在线观看 | 日韩精选在线观看 | 久久伊人综合 | 二区在线播放 | 在线不卡a | 五月天开心| 国产精品久久久久久久av大片 | 成人在线观看免费 | 亚洲精品免费在线 | 91av在线国产 | 日韩高清免费无专码区 | 东方av在 | 亚洲精品欧美成人 | 曰本免费av | 成年人免费电影在线观看 | 久久免费视频在线观看6 | 日韩3区| 伊人五月天婷婷 | 天天综合网 天天 | 婷婷丁香在线 | 久久精品一区二区三 | 国产一级片久久 | 久久av网址 | 久久久久一区二区三区 | 99视频免费看 | 久久99网 | 免费网站看av片 | 在线精品视频免费播放 | www黄免费| 国产无套一区二区三区久久 | 国产精品福利无圣光在线一区 | 欧美韩日视频 | 欧美激情综合色综合啪啪五月 | 国产精品视频999 | 国产精品亚洲视频 | 一级片视频在线 | 99精品视频精品精品视频 | 久久精品欧美 | 久久久久亚洲精品国产 | 日韩综合一区二区三区 | 探花视频在线观看免费版 | 国产高清成人av | 亚洲天天综合 | 日韩视频一区二区在线 | 99爱在线 | 日韩欧美亚州 | 天天操夜夜爱 | 日韩av成人在线观看 | 伊人久久国产 | 九九在线免费视频 | 国产精品爽爽爽 |