日韩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ò),歡迎將生活随笔推薦給好友。

    欧美福利在线播放 | 成人午夜毛片 | 色婷婷激情四射 | 中文字幕在线影院 | 亚洲精品综合在线 | 波多野结衣视频一区二区三区 | 少妇bbw搡bbbb搡bbbb | 国产精品一区二区精品视频免费看 | 欧美日韩视频网站 | 成人免费视频播放 | 麻豆视频网址 | 欧美色综合天天久久综合精品 | 亚洲黄色app | av一本久道久久波多野结衣 | 日韩免费福利 | 日本三级中文字幕在线观看 | 99re6热在线精品视频 | 五月激情电影 | aa一级片| 日韩美女免费线视频 | 99久久精品久久亚洲精品 | 91禁看片 | 男女视频久久久 | 国产精品一区在线 | 久久久久久久久久久免费视频 | 亚洲免费av在线播放 | 午夜精品电影 | 亚洲国产日韩精品 | 国产精品黑丝在线观看 | 久久综合中文色婷婷 | 久草久热| 亚洲国产成人精品在线 | 99精品在线视频观看 | 91麻豆精品国产91 | 日韩com| 狠狠色狠狠色综合日日92 | 亚洲在线网址 | 亚洲 av网站| 精品国产日本 | 亚洲aⅴ久久精品 | 在线观看日韩av | 69视频永久免费观看 | 成人av在线电影 | 97在线观视频免费观看 | 成人av免费看 | 男女免费av | 亚洲一区 av | 手机av在线不卡 | 一区二区三区视频在线 | 91精品啪在线观看国产线免费 | 日韩欧美视频在线免费观看 | 国产精品都在这里 | 中文字幕乱码视频 | 欧美精品一区二区在线观看 | 婷婷激情综合 | 99视频久| 天天操天天操 | 久久 地址 | 国产91精品一区二区绿帽 | 看片一区二区三区 | 成人在线视频免费观看 | 五月婷婷激情 | 成人在线免费视频观看 | 色狠狠一区二区 | 日本久久综合视频 | avlulu久久精品| 91九色最新| 久久伦理电影 | 国产精品免费一区二区三区在线观看 | 最新av免费在线观看 | 亚洲视屏在线播放 | 欧美成人在线免费观看 | 中国一区二区视频 | 九色精品免费永久在线 | 亚洲人成在线观看 | 日韩国产欧美在线视频 | 国产精品国产自产拍高清av | 中文字幕在线观看视频网站 | 91av视频免费观看 | 欧美在线视频a | 亚洲一区二区三区毛片 | 免费在线观看日韩视频 | 91成人在线看 | 国产一区高清在线 | 国产精品美女久久久久久久 | 久久久久免费观看 | 五月婷婷影院 | 色五月成人 | 国产精品久久久av久久久 | 国产麻豆电影在线观看 | 在线观看久久久久久 | 国产婷婷精品av在线 | 成人在线中文字幕 | 精品国产免费久久 | 狠狠色狠狠色综合日日小说 | 亚洲综合色播 | 丁香六月婷婷开心婷婷网 | 亚洲资源视频 | 欧美另类tv| 天堂黄色片 | 一区二区三区手机在线观看 | 99精品国产一区二区三区麻豆 | 98久久| 2020天天干夜夜爽 | 人人添人人澡人人澡人人人爽 | 国产精品久久久99 | 亚洲综合在线五月天 | 波多野结衣精品 | 四虎影视精品永久在线观看 | 成人一级在线 | 在线免费高清视频 | 国产成人精品av | 91看片麻豆 | www.亚洲视频| 国产99自拍 | 日日夜夜中文字幕 | 久久久久久久99精品免费观看 | 91一区啪爱嗯打偷拍欧美 | 亚洲尺码电影av久久 | 热久久国产 | 日本黄色免费播放 | 欧美日韩中文字幕综合视频 | 久久久在线观看 | 9色在线视频 | 日韩精品偷拍 | 69国产盗摄一区二区三区五区 | 中文字幕在 | 欧洲亚洲精品 | 正在播放 久久 | 亚洲久草在线 | 天天色天天色天天色 | 日日爱999| 午夜性生活片 | 国产.精品.日韩.另类.中文.在线.播放 | 一区二区三区免费看 | 美女视频a美女大全免费下载蜜臀 | 日韩理论 | 国产午夜精品一区二区三区嫩草 | 在线观看免费国产小视频 | 在线免费中文字幕 | 亚洲精品成人在线 | www.av在线播放 | 中文字幕在线视频第一页 | 在线99 | 久久久久久免费 | 黄色小说在线免费观看 | 国产精品久久久久久99 | 亚洲视频免费在线看 | 国产亚洲精品中文字幕 | 午夜久操 | 日韩xxxxxxxxx | 国产麻豆精品95视频 | 美女福利视频一区二区 | 99久久精品国产免费看不卡 | 亚洲中字幕| 亚洲国产97在线精品一区 | 美女搞黄国产视频网站 | 中文字幕在线视频一区二区三区 | 亚洲国产精品va在线看黑人动漫 | 中文字幕在线观看视频一区二区三区 | 天天射夜夜爽 | 天天射天天爱天天干 | 久久69精品久久久久久久电影好 | 成年人在线播放视频 | 欧美日韩中文字幕在线视频 | 日本精品一区二区在线观看 | 麻豆精品在线视频 | 亚洲综合一区二区精品导航 | 天天操天天操天天操 | 久久a v视频 | 三级视频片 | 国产一区免费在线 | av福利第一导航 | 国精产品一二三线999 | 中文字幕视频网 | 日本久久精品视频 | 人人玩人人添人人澡97 | 国产在线观 | 成人免费毛片aaaaaa片 | 日韩免费一区二区在线观看 | 成人一区二区在线 | 中文字幕文字幕一区二区 | 国产精品资源在线观看 | 日韩av成人在线观看 | 欧美日韩一二三四区 | 999国内精品永久免费视频 | 欧美日韩视频免费 | 成人a级免费视频 | 亚洲免费永久精品国产 | 激情伊人 | 国产日本在线播放 | 亚洲婷婷综合色高清在线 | 中文不卡视频 | 国产 欧美 日产久久 | 人人爽人人射 | 免费网站v | 精品国产色 | 国产精品成人一区二区三区 | 激情综合五月婷婷 | 国产在线精品播放 | 国产一级三级 | 中文字幕av免费观看 | 日韩欧美视频在线观看免费 | 久久日本视频 | 欧美日韩一区二区久久 | 免费看v片 | 四虎在线观看网址 | 91精品一区二区三区蜜桃 | 亚洲人成人在线 | 懂色av一区二区三区蜜臀 | 午夜精品一区二区三区在线观看 | 欧美另类调教 | 精品久久久免费视频 | 久久国产精品电影 | 四虎国产精品成人免费4hu | 国产小视频免费在线观看 | 日本激情视频中文字幕 | 狠狠色丁香婷婷综合久小说久 | 亚洲激情校园春色 | 欧洲一区精品 | 久久久综合香蕉尹人综合网 | 国产乱码精品一区二区三区介绍 | 五月天久久激情 | 一区二区三高清 | 操操操夜夜操 | 亚洲无在线 | 在线观看国产v片 | 色网站在线免费 | 51久久成人国产精品麻豆 | 99视频在线免费看 | 国产精品99久久久久久宅男 | a级黄色片视频 | 波多在线视频 | 亚洲区另类春色综合小说校园片 | 香蕉影院在线播放 | 国产在线国产 | 国产一区国产二区在线观看 | 日韩欧美一区二区三区黑寡妇 | 国产剧在线观看片 | 99久久99久久免费精品蜜臀 | 天天躁天天躁天天躁婷 | 99精品国产福利在线观看免费 | 亚洲国产精品999 | 激情丁香| 视频二区 | 国产原厂视频在线观看 | 久草在线费播放视频 | 亚洲一区网站 | 乱子伦av| 欧美成天堂网地址 | 视频在线91 | 精品国产亚洲日本 | 日韩黄在线观看 | 亚洲成人xxx | 精品国产伦一区二区三区免费 | 免费av片在线 | 懂色av一区二区三区蜜臀 | 青青河边草免费视频 | 成人亚洲精品久久久久 | 在线观看午夜av | 天天爱天天操 | 在线视频观看你懂的 | 亚洲免费高清视频 | 国产手机av在线 | 国产毛片aaa| 精品日韩在线一区 | 91精品啪在线观看国产81旧版 | 久久九九久久精品 | 亚州精品在线视频 | 亚洲 欧洲 国产 精品 | 一区二区不卡 | 99激情网 | 久草网视频在线观看 | 99精品国产一区二区 | 色网站免费在线观看 | 九九爱免费视频 | av大全在线播放 | 在线观看视频你懂得 | 国产美女视频网站 | 高清国产在线一区 | 国产中文字幕亚洲 | av亚洲产国偷v产偷v自拍小说 | 91新人在线观看 | 日韩在线免费高清视频 | 国产一级黄色免费看 | 中文字幕在线播放日韩 | 99高清视频有精品视频 | 日韩视频专区 | 麻豆果冻剧传媒在线播放 | av蜜桃在线 | 成人国产精品电影 | 欧美在线99 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 在线视频日韩欧美 | 99久久国产免费看 | 天天av资源 | 色综合五月天 | 国产精品视频 | 国产清纯在线 | 久久久久日本精品一区二区三区 | 天天干夜夜夜操天 | 久久久九色精品国产一区二区三区 | 欧美日韩国产色综合一二三四 | 亚洲国产片 | 久久天| 免费久久久久久久 | 久久精品欧美日韩精品 | 91av在线视频免费观看 | 99精品免费在线观看 | 中文字幕在线久一本久 | 中文字幕在线播放av | 亚洲欧美怡红院 | 久久免费在线观看 | 日韩黄色一区 | 日韩毛片久久久 | 粉嫩一区二区三区粉嫩91 | 中文字幕av日韩 | 伊人五月婷 | 高清在线观看av | 国内亚洲精品 | 欧美极度另类性三渗透 | 日韩一区二区免费在线观看 | 日韩中文字幕一区 | 97在线视频免费观看 | 国产精品激情偷乱一区二区∴ | 丁香久久婷婷 | 国产精品123 | 2024国产精品视频 | 成人91在线 | 免费观看丰满少妇做爰 | 日韩欧美精品在线视频 | 在线看的毛片 | 日本在线观看一区二区三区 | 免费视频91蜜桃 | 午夜视频一区二区三区 | 99爱在线观看 | 中文字幕日韩免费视频 | 日本爱爱免费 | 国产成人精品一区二区三区在线 | 久久99久久久久久 | 日韩欧美第二页 | 91久久国产露脸精品国产闺蜜 | 毛片网站免费 | www视频免费在线观看 | 中午字幕在线观看 | 欧美一级免费高清 | 日本一区二区三区视频在线播放 | 精品999国产| 欧美性久久久久久 | 久久久国产精品一区二区三区 | 亚洲精品网址在线观看 | 国产在线精品播放 | 欧美一级免费片 | 国产手机视频在线播放 | 久久一精品 | 国产精品视频你懂的 | 色久av| 久久综合爱 | 国产精品欧美一区二区三区不卡 | 在线天堂视频 | 天天射天天干 | 99热最新精品 | 亚州国产精品视频 | 日本精品久久 | 在线观看免费色 | 黄色免费观看网址 | 天堂av网在线 | 中文超碰字幕 | 日韩女同av | 久久黄色片子 | 成片人卡1卡2卡3手机免费看 | 九九99 | 欧美日韩精品免费观看 | 免费性网站 | 日日射天天射 | a级片久久久 | 亚洲久草网| 久久99日韩 | 在线99视频 | 中文字幕 在线看 | 久久国产经典 | 中文字幕免费观看 | 亚洲精品美女在线观看播放 | 中文字幕在线观看完整 | 久久精品1区 | 骄小bbw搡bbbb揉bbbb | 99视频在线观看免费 | 成人免费一区二区三区在线观看 | 亚洲va欧美va国产va黑人 | 在线观看免费色 | av免费网站 | 久久这里只有精品9 | 手机av看片 | 久热av在线| 亚洲在线国产 | 日韩电影在线视频 | 91正在播放 | 深爱五月网 | 国产日产精品一区二区三区四区 | 日韩电影在线一区二区 | 色综合久 | 开心婷婷色 | 丁香婷婷久久久综合精品国产 | 免费高清av在线看 | 色婷婷狠狠操 | 久久久久综合网 | 一本大道久久精品懂色aⅴ 五月婷社区 | 亚洲国产精品久久久久久 | 欧美性大战 | 久久国产精品精品国产色婷婷 | 激情欧美在线观看 | 亚洲影视资源 | 久久综合色天天久久综合图片 | 好看av在线| 日韩激情视频在线 | 成人在线免费视频 | 四虎在线永久免费观看 | 亚洲婷婷免费 | 日韩 精品 一区 国产 麻豆 | 亚洲国产欧美一区二区三区丁香婷 | 中文字幕 国产视频 | 国产视频一区精品 | 久久精品成人欧美大片古装 | 欧美男男tv网站 | 日韩欧美在线国产 | 日本公妇色中文字幕 | 狠狠色香婷婷久久亚洲精品 | 日日干夜夜爱 | 在线观看日韩精品视频 | 日韩精品视频在线观看免费 | 国产精品久久久久久久久大全 | 日日爽夜夜爽 | www..com毛片 | 在线中文字幕电影 | 欧美极品久久 | 在线精品播放 | 一区二区在线不卡 | 久久久免费高清视频 | 国产精品麻豆欧美日韩ww | 久久蜜臀一区二区三区av | 黄色免费国产 | 中文视频在线播放 | 激情片av| 亚洲色图 校园春色 | 午夜久久久久久久 | 99色在线观看| 久久线视频 | 久久久久久高清 | 色综合久久综合 | 国产黄色av网站 | 激情视频区 | 91在线小视频 | 97超级碰碰碰视频在线观看 | 麻豆久久一区二区 | 69久久夜色精品国产69 | 久久综合九色欧美综合狠狠 | 一级成人在线 | 欧美性脚交 | 免费在线观看黄 | 日韩在线看片 | 91porny九色在线播放 | 天天摸日日摸人人看 | 欧美精品一区在线发布 | 91精彩视频 | 日日操狠狠干 | 亚洲黄色在线观看 | 久草免费在线 | 三级在线视频播放 | 国产成人精品久久亚洲高清不卡 | 天天综合入口 | 午夜丰满寂寞少妇精品 | 国产中文字幕在线看 | 婷婷色网视频在线播放 | 91av在线视频免费观看 | 超碰在线人人 | 色亚洲网 | 国产精品国产三级国产专区53 | 亚洲精品在线电影 | 成年人免费在线看 | 亚洲a网| 免费看一级黄色 | 美女黄频在线观看 | 黄色www| 精品在线观看一区二区 | 四虎成人精品 | 黄色成品视频 | 亚洲免费黄色 | 精品久操| 欧美激情精品久久久久久免费印度 | 美女黄频免费 | 综合网婷婷 | 精品9999| 欧美福利网址 | 就要干b | 午夜免费久久看 | 国产成在线观看免费视频 | 91精品视频一区 | 亚洲网站在线 | 久草精品网 | 91网免费看 | 免费网站看av片 | 欧美精品久久久久久久久久久 | 欧美日韩不卡在线 | 波多野结衣精品在线 | 欧美色道| 国产一区二区久久久 | 国产福利中文字幕 | 高清色免费 | 久草在线国产 | 国产乱码精品一区二区三区介绍 | 国产精品一区二区av影院萌芽 | 免费在线观看黄色网 | 国产一级91| 亚洲精品在线免费播放 | 成年美女黄网站色大片免费看 | 国产精品久久久久免费 | 欧美日韩xxxxx | 久久视频精品在线 | 中文字幕欧美三区 | 国产精品1区2区3区 久久免费视频7 | 99精品视频免费在线观看 | 深夜免费小视频 | 人人揉人人揉人人揉人人揉97 | 99在线视频播放 | 波多野结衣电影一区二区三区 | 狠狠色伊人亚洲综合网站野外 | 亚洲另类视频在线观看 | 免费又黄又爽视频 | 亚洲一区二区三区精品在线观看 | 中文字幕视频三区 | 黄色1级毛片| 香蕉视频在线免费 | 欧美激情视频在线免费观看 | 天天操天天干天天综合网 | 国产日韩欧美视频在线观看 | 三级免费黄色 | 免费在线观看av电影 | 九草在线视频 | 国产黄视频在线观看 | 欧美性生活免费 | 日韩av免费一区 | 九九免费在线观看 | 久久精品一区二 | 在线视频在线观看 | 免费视频 三区 | 国产国产人免费人成免费视频 | 精品亚洲va在线va天堂资源站 | 亚洲一区二区观看 | 久久久99精品免费观看乱色 | 在线观看免费视频你懂的 | 少妇高潮流白浆在线观看 | 麻豆国产精品va在线观看不卡 | 国产喷水在线 | 在线亚洲人成电影网站色www | 国产亚洲久一区二区 | 欧美视屏一区二区 | 97香蕉超级碰碰久久免费软件 | 亚洲第一成网站 | 91在线视频导航 | 人人澡视频 | 日韩欧美视频免费在线观看 | 97超碰国产精品女人人人爽 | 日本三级在线观看中文字 | 日日夜夜精品免费视频 | 久久综合亚洲鲁鲁五月久久 | 97超碰超碰久久福利超碰 | 超碰97免费观看 | 91视频久久久久 | 91九色在线观看视频 | 在线激情影院一区 | 91成人精品一区在线播放69 | 91精品国产自产在线观看永久 | 在线观看亚洲电影 | 丁香六月伊人 | 亚洲精品456在线播放乱码 | 97狠狠干| 在线精品播放 | 免费99| 日本中文字幕一二区观 | 激情综合站 | 久久久久免费精品国产 | 最新成人av | 日韩欧美一区二区三区免费观看 | 久久成人一区二区 | 国产亚洲日本 | www.夜夜爽 | 色噜噜在线观看视频 | 免费观看的av网站 | av 一区二区三区四区 | 在线观看视频国产 | 最近中文字幕大全 | 一区 在线 影院 | 视频福利在线观看 | 美女视频免费精品 | 久久久久久国产精品免费 | 天堂视频中文在线 | 五月综合在线观看 | 人人干人人艹 | 夜色在线资源 | 免费在线观看av网站 | 国产精品每日更新 | 欧美亚洲精品在线观看 | 狠狠色丁香婷婷综合最新地址 | 国内成人av | 五月天婷婷在线播放 | 亚洲电影图片小说 | 精品99999| 成人av在线网址 | 亚洲国产影院av久久久久 | 国产精品99久久久久人中文网介绍 | 精品综合久久久 | 亚洲人av免费网站 | 成人久久18免费网站图片 | 天堂在线成人 | 色综合久 | 精品毛片久久久久久 | 免费a v在线| 久久久伦理 | 日本成人a| 亚洲欧美国产精品va在线观看 | av先锋中文字幕 | 天天操天天色天天 | 在线成人中文字幕 | 久久国产精品免费看 | 成人中文字幕av | 成人黄色小说在线观看 | 五月天天av| 日日夜夜网 | 久久超级碰 | 久久精品视频一 | 色99色 | 99久久久国产精品免费观看 | av.com在线| 国产爽妇网 | 精品视频久久久久久 | 国产欧美最新羞羞视频在线观看 | 国产视频1| 日韩精品国产一区 | 久草久草在线观看 | 综合天天 | 欧女人精69xxxxxx | 高清视频一区二区三区 | 五月婷婷久 | 久久综合中文字幕 | 国产成人免费高清 | 国产视频69 | 中文字幕.av.在线 | 久久99视频精品 | 色国产在线 | 日韩欧美电影在线观看 | 男女激情网址 | 精品欧美乱码久久久久久 | 久久99亚洲精品久久久久 | 在线看日韩av | 99热精品国产一区二区在线观看 | 久久av网 | 69国产盗摄一区二区三区五区 | 国产日韩精品在线 | www.香蕉视频在线观看 | 狠狠色丁香婷婷综合欧美 | 久久综合影音 | 国产字幕在线观看 | 天天操网站 | 天天插天天干天天操 | 久久字幕 | 国产98色在线 | 日韩 | 日韩网站一区 | 国产一区二区电影在线观看 | 99精品视频在线看 | 久久午夜免费视频 | av免费试看 | 在线国产99 | 亚洲黄a | 国产精品欧美精品 | 亚洲一区二区三区精品在线观看 | 97国产超碰在线 | 国产精品成人av在线 | 人人澡超碰碰97碰碰碰软件 | 日韩,精品电影 | 日韩在线观看一区二区 | 色天天天 | 精品久久美女 | 在线视频 影院 | 国产黄大片在线观看 | 国产经典 欧美精品 | 精品免费视频123区 午夜久久成人 | 欧美成人久久 | 亚洲欧美激情插 | 96国产精品 | 久久久久久久av麻豆果冻 | 欧美一级高清片 | 最新av网址在线 | 色在线亚洲 | 麻豆极品 | 久久天天拍| 最新国产在线观看 | 成人久久毛片 | 亚洲第一成网站 | 夜夜夜夜爽 | 美女av在线免费 | 中文字幕a∨在线乱码免费看 | 国产又粗又猛又黄又爽视频 | 九草在线观看 | 精品国产欧美一区二区三区不卡 | 免费亚洲一区二区 | 91在线视频观看 | 狠狠色丁香久久婷婷综合_中 | 国产又粗又猛又黄又爽的视频 | 狠狠色网| 久久综合成人 | 999国产在线| 国产精品手机在线播放 | 成人黄色大片在线免费观看 | 国产亚洲精品久久19p | 国产精品久久久久久婷婷天堂 | 日韩久久久久久久 | 美女福利视频 | 成人av资源网站 | 免费观看久久 | se婷婷 | 色干综合 | 一区三区在线欧 | 亚洲国产美女久久久久 | 91热爆视频 | 成人免费视频播放 | 天天操天天干天天爽 | 久久精品国产v日韩v亚洲 | www日韩高清 | 久久国色夜色精品国产 | 精品久久久国产 | 天天操天天操天天操 | 欧美性生活免费看 | caobi视频| 日本不卡123 | 九九久久成人 | 美女免费av| 亚洲另类视频在线观看 | av短片在线观看 | 99视频免费 | 亚洲精品国产精品国 | 精品久久久影院 | 精品国产一二三四区 | 亚洲国产视频a | 日本久久综合网 | 久久精品一二三区白丝高潮 | 欧美一区二区三区免费看 | av日韩中文| 久久九九国产视频 | 成人四虎影院 | 色香com.| 欧美成人免费在线 | 日日噜噜噜噜夜夜爽亚洲精品 | 中文字幕亚洲综合久久五月天色无吗'' | 色婷婷激情综合 | 久精品视频免费观看2 | 国产精品久久久久久久久久久久 | 国产精品自拍在线 | 国产又粗又猛又黄视频 | 日韩欧美一区二区三区在线 | 中文字幕一区二区三区四区 | 精品一区二区6 | 中文字幕一二三区 | 欧美a级成人淫片免费看 | 欧美怡红院视频 | 日韩高清一区二区 | 成人av网页 | 久插视频| 午夜黄色| 日韩在线观看视频中文字幕 | 国产精品黄色影片导航在线观看 | 91精品免费视频 | 一区二区三区久久精品 | 91在线视频网址 | 国产黄色av | 国产亚洲精品xxoo | 日本视频精品 | 在线 成人 | 日韩高清无线码2023 | 国产玖玖精品视频 | 中文字幕一区二区三区四区久久 | 嫩模bbw搡bbbb搡bbbb | 精品国产一区在线观看 | 激情五月开心 | 日韩欧美在线高清 | 福利久久| 99久久9 | 97国产情侣爱久久免费观看 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 亚洲国产成人久久综合 | 国产精品久久久久久久久久免费 | 免费av在线播放 | 午夜精品影院 | 麻豆传媒一区二区 | 午夜资源站 | 国内综合精品午夜久久资源 | 国产成人久久av | 亚洲精品午夜久久久久久久久久久 | 国产精品理论片在线观看 | 日本特黄一级片 | 色 免费观看 | 三级a毛片 | 99精品欧美一区二区蜜桃免费 | 成人a毛片 | 久草在线国产 | 91精彩视频 | 成人免费xxx在线观看 | 日本性久久 | 黄色成人影视 | 免费成人av电影 | 日本黄色免费电影网站 | 久久精品5| 色夜影院 | 亚洲精品国产免费 | 国产成人精品一区二区在线观看 | 亚洲精品一区二区精华 | 黄色免费视频在线观看 | 久久久国产影视 | 一区二区中文字幕在线观看 | 99久精品 | 蜜桃传媒一区二区 | 日韩视频欧美视频 | 午夜久久视频 | 日本视频不卡 | 中文字幕激情 | 国产日韩在线视频 | 三级av网站 | 中文字幕丝袜一区二区 | 日韩欧美专区 | 久久亚洲欧美日韩精品专区 | 色91在线 | 中文字幕在 | 国产成人av片 | 天天五月天色 | 亚洲精品国偷拍自产在线观看蜜桃 | 免费a视频在线 | 国产视频不卡一区 | 国产一区视频在线播放 | 免费一级片观看 | 中文日韩在线视频 | 国产精品99久久久久久人免费 | 人人插人人玩 | 国产成人精品一区二三区 | 国产色在线观看 | 成人aaa毛片| 在线观看91久久久久久 | 日韩av视屏在线观看 | 久久99久久99精品免视看婷婷 | 久久理伦片 | 亚洲香蕉在线观看 | 黄色91免费观看 | 一本之道乱码区 | 在线国产激情视频 | a黄色大片 | 97超碰免费在线观看 | 精品国产精品久久 | 色干综合 | 欧洲一区二区三区精品 | 国产黄视频在线观看 | 婷婷av在线 | 久久久精品二区 | 狠狠久久 | 国产免费观看视频 | 日韩中文在线字幕 | 婷婷丁香狠狠爱 | 天天干,天天射,天天操,天天摸 | 欧美一级片在线观看视频 | 亚洲欧洲一区二区在线观看 | 欧美日韩a视频 | 天天做天天干 | 最近最新mv字幕免费观看 | 亚洲精品2区 | 婷婷综合激情 | 五月婷婷激情五月 | 九月婷婷色 | 91亚洲精品久久久久图片蜜桃 | 中文字幕在线观看视频一区二区三区 | 免费观看高清 | 亚洲激情综合 | 久久久精品福利视频 | 精品国产一区二区久久 | 夜色成人网 | 狠狠操欧美 | 98福利在线 | 欧美乱熟臀69xxxxxx | 久草视频在线播放 | 在线观看黄 | 亚洲精品99久久久久久 | 国产精品伦一区二区三区视频 | 五月天六月婷 | 在线观看视频你懂的 | 中文字幕电影高清在线观看 | 久久在线观看 | 又爽又黄在线观看 | 日本三级久久久 | 欧美精品黑人性xxxx | 97夜夜澡人人双人人人喊 | 日韩免费不卡av | 国产精品99久久久久人中文网介绍 | 九九热国产视频 | 亚洲有 在线 | 91精品国产一区 | 国产精品自产拍 | www看片网站 | 天天干人人干 | 国产一二区免费视频 | 狠狠色丁香婷婷 | 视频一区久久 | 69久久99精品久久久久婷婷 | 中文区中文字幕免费看 | 一区二区三区 中文字幕 | 久久亚洲欧美日韩精品专区 | 日韩一区二区三区免费电影 | 探花国产在线 | 麻豆激情电影 | 二区中文字幕 | 99人久久精品视频最新地址 | 天天色天天爱天天射综合 | 99视频99 | 人人超在线公开视频 | 亚洲首页| 在线观看激情av | 亚洲一级片在线观看 | 天天色成人网 | 亚洲第五色综合网 | 国产成人久久av免费高清密臂 | 亚洲天堂在线观看完整版 | av资源中文字幕 | 久久久五月婷婷 | 欧美一区二区三区在线 | 免费在线精品视频 | 中文字幕影片免费在线观看 | 国产精品手机视频 | 亚洲国产精品影院 | 久久成人免费 | 在线视频 日韩 | 亚洲japanese制服美女 | 免费高清在线观看成人 | 91尤物在线播放 | 国产精品久久久电影 | 国产一区精品在线 | 91在线公开视频 | 狠狠狠色丁香婷婷综合久久88 | 日韩av免费一区二区 | 免费黄在线观看 | 看污网站| 深爱五月激情网 | 成年人视频在线免费播放 | 综合久久婷婷 | 草久视频在线 | 日韩深夜在线观看 | 欧美午夜视频在线 | 激情网色| 深夜成人av| 久久久久久久久久久久av | 天天综合区 | 欧美亚洲久久 | 日韩天天操 | 国产伦理久久 | 日本免费一二三区 | 国模精品在线 | 2023av在线 | 中文字幕有码在线播放 | 一区二区影视 | 欧美午夜理伦三级在线观看 | 国产福利免费在线观看 | 欧美日韩性视频 | 中文字幕精品一区二区精品 | 99精品国产一区二区三区麻豆 | 久久久久久久久爱 | 成人在线视频免费看 | 99精品欧美一区二区三区黑人哦 | 黄色av免费在线 | 99热99热| 日韩视频图片 | 久久免费视频网 | 中文字幕资源在线 | 亚洲视频网站在线观看 | 欧美色图一区 | 国产美女主播精品一区二区三区 | 国产中出在线观看 | 久久电影日韩 | 99免费在线 | 中文字幕中文字幕在线中文字幕三区 | 69国产成人综合久久精品欧美 | 成人视屏免费看 | 免费在线观看av网站 | 国产视频欧美视频 | 久热色超碰 | 久艹在线免费观看 | 国产一区二区三区免费观看视频 | 国产美女免费 | a级片在线播放 | 亚洲综合在线发布 | 91精品国产成人 | 国产在线精品区 | 超碰人在线| 在线你懂的视频 | 欧美极度另类 |