黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

Android 實現抖音小游戲潛艇大挑戰的思路詳解

瀏覽:103日期:2022-06-07 14:06:52

《潛水艇大挑戰》是抖音上的一款小游戲,以面部識別來驅動潛艇通過障礙物,最近特別火爆,相信很多人都玩過。

Android 實現抖音小游戲潛艇大挑戰的思路詳解

一時興起自己用Android自定義View也擼了一個,發現只要有好的創意,不用高深的技術照樣可以開發出好玩的應用。開發過程現拿出來與大家分享一下。

項目地址:

https://github.com/vitaviva/ugame

基本思路

整個游戲視圖可以分成三層:

camera(相機):處理相機的preview以及人臉識別 background(后景):處理障礙物相關邏輯 foreground(前景):處理潛艇相關

Android 實現抖音小游戲潛艇大挑戰的思路詳解

代碼也是按上面三個層面組織的,游戲界面的布局可以簡單理解為三層視圖的疊加,然后在各層視圖中完成相關工作

<FrameLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:tools='http://schemas.android.com/tools' android:layout_width='match_parent' android:layout_height='match_parent'> <!-- 相機 --> <TextureView android:layout_width='match_parent' android:layout_height='match_parent'/> <!-- 后景 --> <com.my.ugame.bg.BackgroundView android:layout_width='match_parent' android:layout_height='match_parent'/> <!-- 前景 --> <com.my.ugame.fg.ForegroundView android:layout_width='match_parent' android:layout_height='match_parent'/></Framelayout>

開發中會涉及以下技術的使用,沒有高精尖、都是大路貨:

相機:使用Camera2完成相機的預覽和人臉識別 自定義View:定義并控制障礙物和潛艇 屬性動畫:控制障礙物和潛艇的移動及各種動效

少??攏?瓤炊?鰨∠旅娼檣芨韃糠執?氳氖迪幀?/p>

后景(Background)Bar

首先定義障礙物基類Bar,主要負責是將bitmap資源繪制到指定區域。由于障礙物從屏幕右側定時刷新時的高度隨機,所以其繪制區域的x、y、w、h需要動態設置

/** * 障礙物基類 */sealed class Bar(context: Context) { protected open val bmp = context.getDrawable(R.mipmap.bar)!!.toBitmap() protected abstract val srcRect: Rect private lateinit var dstRect: Rect private val paint = Paint() var h = 0F set(value) { field = value dstRect = Rect(0, 0, w.toInt(), h.toInt()) } var w = 0F set(value) { field = value dstRect = Rect(0, 0, w.toInt(), h.toInt()) } var x = 0F set(value) { view.x = value field = value } val y get() = view.y internal val view by lazy { BarView(context) { it?.apply { drawBitmap( bmp, srcRect, dstRect, paint ) } } }}internal class BarView(context: Context?, private val block: (Canvas?) -> Unit) : View(context) { override fun onDraw(canvas: Canvas?) { block((canvas)) }}

障礙物分為上方和下方兩種,由于使用了同一張資源,所以繪制時要區別對待,因此定義了兩個子類:UpBar和DnBar

/** * 屏幕上方障礙物 */class UpBar(context: Context, container: ViewGroup) : Bar(context) { private val _srcRect by lazy(LazyThreadSafetyMode.NONE) { Rect(0, (bmp.height * (1 - (h / container.height))).toInt(), bmp.width, bmp.height) } override val srcRect: Rect get() = _srcRect}

下方障礙物的資源旋轉180度后繪制

/** * 屏幕下方障礙物 */class DnBar(context: Context, container: ViewGroup) : Bar(context) { override val bmp = super.bmp.let { Bitmap.createBitmap( it, 0, 0, it.width, it.height, Matrix().apply { postRotate(-180F) }, true ) } private val _srcRect by lazy(LazyThreadSafetyMode.NONE) { Rect(0, 0, bmp.width, (bmp.height * (h / container.height)).toInt()) } override val srcRect: Rect get() = _srcRect}

BackgroundView

接下來創建后景的容器BackgroundView,容器用來定時地創建、并移動障礙物。通過列表barsList管理當前所有的障礙物,onLayout中,將障礙物分別布局到屏幕上方和下方

/** * 后景容器類 */class BackgroundView(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) { internal val barsList = mutableListOf<Bars>() override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { barsList.flatMap { listOf(it.up, it.down) }.forEach { val w = it.view.measuredWidth val h = it.view.measuredHeight when (it) { is UpBar -> it.view.layout(0, 0, w, h) else -> it.view.layout(0, height - h, w, height) } } }

提供兩個方法start和stop,控制游戲的開始和結束:

游戲結束時,要求所有障礙物停止移動。 游戲開始后會通過Timer,定時刷新障礙物

/** * 游戲結束,停止所有障礙物的移動 */ @UiThread fun stop() { _timer.cancel() _anims.forEach { it.cancel() } _anims.clear() } /** * 定時刷新障礙物: * 1. 創建 * 2. 添加到視圖 * 3. 移動 */ @UiThread fun start() { _clearBars() Timer().also { _timer = it }.schedule(object : TimerTask() { override fun run() { post { _createBars(context, barsList.lastOrNull()).let { _addBars(it) _moveBars(it) } } } }, FIRST_APPEAR_DELAY_MILLIS, BAR_APPEAR_INTERVAL_MILLIS ) } /** * 游戲重啟時,清空障礙物 */ private fun _clearBars() { barsList.clear() removeAllViews() }

刷新障礙物

障礙物的刷新經歷三個步驟:

創建:上下兩個為一組創建障礙物 添加:將對象添加到barsList,同時將View添加到容器 移動:通過屬性動畫從右側移動到左側,并在移出屏幕后刪除

創建障礙物時會為其設置隨機高度,隨機不能太過,要以前一個障礙物為基礎進行適當調整,保證隨機的同時兼具連貫性

/** * 創建障礙物(上下兩個為一組) */ private fun _createBars(context: Context, pre: Bars?) = run { val up = UpBar(context, this).apply { h = pre?.let { val step = when { it.up.h >= height - _gap - _step -> -_step it.up.h <= _step -> _step _random.nextBoolean() -> _step else -> -_step } it.up.h + step } ?: _barHeight w = _barWidth } val down = DnBar(context, this).apply { h = height - up.h - _gap w = _barWidth } Bars(up, down) } /** * 添加到屏幕 */ private fun _addBars(bars: Bars) { barsList.add(bars) bars.asArray().forEach { addView( it.view, ViewGroup.LayoutParams( it.w.toInt(), it.h.toInt() ) ) } } /** * 使用屬性動畫移動障礙物 */ private fun _moveBars(bars: Bars) { _anims.add( ValueAnimator.ofFloat(width.toFloat(), -_barWidth) .apply { addUpdateListener { bars.asArray().forEach { bar -> bar.x = it.animatedValue as Float if (bar.x + bar.w <= 0) { post { removeView(bar.view) } } } } duration = BAR_MOVE_DURATION_MILLIS interpolator = LinearInterpolator() start() }) }}

前景(Foreground)

Boat

定會潛艇類Boat,創建自定義View,并提供方法移動到指定坐標

/** * 潛艇類 */class Boat(context: Context) { internal val view by lazy { BoatView(context) } val h get() = view.height.toFloat() val w get() = view.width.toFloat() val x get() = view.x val y get() = view.y /** * 移動到指定坐標 */ fun moveTo(x: Int, y: Int) { view.smoothMoveTo(x, y) }}

BoatView

自定義View中完成以下幾個事情

通過兩個資源定時切換,實現探照燈閃爍的效果 通過OverScroller讓移動過程更加順滑 通過一個Rotation Animation,讓潛艇在移動時可以調轉角度,更加靈動

internal class BoatView(context: Context?) : AppCompatImageView(context) { private val _scroller by lazy { OverScroller(context) } private val _res = arrayOf( R.mipmap.boat_000, R.mipmap.boat_002 ) private var _rotationAnimator: ObjectAnimator? = null private var _cnt = 0 set(value) { field = if (value > 1) 0 else value } init { scaleType = ScaleType.FIT_CENTER _startFlashing() } private fun _startFlashing() { postDelayed({ setImageResource(_res[_cnt++]) _startFlashing() }, 500) } override fun computeScroll() { super.computeScroll() if (_scroller.computeScrollOffset()) { x = _scroller.currX.toFloat() y = _scroller.currY.toFloat() // Keep on drawing until the animation has finished. postInvalidateOnAnimation() } } /** * 移動更加順換 */ internal fun smoothMoveTo(x: Int, y: Int) { if (!_scroller.isFinished) _scroller.abortAnimation() _rotationAnimator?.let { if (it.isRunning) it.cancel() } val curX = this.x.toInt() val curY = this.y.toInt() val dx = (x - curX) val dy = (y - curY) _scroller.startScroll(curX, curY, dx, dy, 250) _rotationAnimator = ObjectAnimator.ofFloat( this, 'rotation', rotation, Math.toDegrees(atan((dy / 100.toDouble()))).toFloat() ).apply { duration = 100 start() } postInvalidateOnAnimation() }}

ForegroundView

通過boat成員持有潛艇對象,并對其進行控制 實現CameraHelper.FaceDetectListener根據人臉識別的回調,移動潛艇到指定位置 游戲開始時,創建潛艇并做開場動畫

/** * 前景容器類 */class ForegroundView(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs), CameraHelper.FaceDetectListener { private var _isStop: Boolean = false internal var boat: Boat? = null /** * 游戲停止,潛艇不再移動 */ @MainThread fun stop() { _isStop = true } /** * 接受人臉識別的回調,移動位置 */ override fun onFaceDetect(faces: Array<Face>, facesRect: ArrayList<RectF>) { if (_isStop) return if (facesRect.isNotEmpty()) { boat?.run { val face = facesRect.first() val x = (face.left - _widthOffset).toInt() val y = (face.top + _heightOffset).toInt() moveTo(x, y) } _face = facesRect.first() } }}

開場動畫

游戲開始時,將潛艇通過動畫移動到起始位置,即y軸的二分之一處

/** * 游戲開始時通過動畫進入 */ @MainThread fun start() { _isStop = false if (boat == null) { boat = Boat(context).also { post { addView(it.view, _width, _width) AnimatorSet().apply { play( ObjectAnimator.ofFloat( it.view, 'y', 0F, this@ForegroundView.height / 2f ) ).with( ObjectAnimator.ofFloat(it.view, 'rotation', 0F, 360F) ) doOnEnd { _ -> it.view.rotation = 0F } duration = 1000 }.start() } } } }

相機(Camera)

相機部分主要有TextureView和CameraHelper組成。TextureView提供給Camera承載preview;工具類CameraHelper主要完成以下功能:

開啟相機:通過CameraManger代開攝像頭 攝像頭切換:切換前后置攝像頭, 預覽:獲取Camera提供的可預覽尺寸,并適配TextureView顯示 人臉識別:檢測人臉位置,進行TestureView上的坐標變換

相機硬件提供的可預覽尺寸與屏幕實際尺寸(即TextureView尺寸)可能不一致,所以需要在相機初始化時,選取最合適的PreviewSize,避免TextureView上發生畫面拉伸等異常

class CameraHelper(val mActivity: Activity, private val mTextureView: TextureView) { private lateinit var mCameraManager: CameraManager private var mCameraDevice: CameraDevice? = null private var mCameraCaptureSession: CameraCaptureSession? = null private var canExchangeCamera = false //是否可以切換攝像頭 private var mFaceDetectMatrix = Matrix() //人臉檢測坐標轉換矩陣 private var mFacesRect = ArrayList<RectF>() //保存人臉坐標信息 private var mFaceDetectListener: FaceDetectListener? = null //人臉檢測回調 private lateinit var mPreviewSize: Size /** * 初始化 */ private fun initCameraInfo() { mCameraManager = mActivity.getSystemService(Context.CAMERA_SERVICE) as CameraManager val cameraIdList = mCameraManager.cameraIdList if (cameraIdList.isEmpty()) { mActivity.toast('沒有可用相機') return } //獲取攝像頭方向 mCameraSensorOrientation = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)!! //獲取StreamConfigurationMap,它是管理攝像頭支持的所有輸出格式和尺寸 val configurationMap = mCameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)!! val previewSize = configurationMap.getOutputSizes(SurfaceTexture::class.java) //預覽尺寸 // 當屏幕為垂直的時候需要把寬高值進行調換,保證寬大于高 mPreviewSize = getBestSize( mTextureView.height, mTextureView.width, previewSize.toList() ) //根據preview的size設置TextureView mTextureView.surfaceTexture.setDefaultBufferSize(mPreviewSize.width, mPreviewSize.height) mTextureView.setAspectRatio(mPreviewSize.height, mPreviewSize.width) }

選取preview尺寸的原則與TextureView的長寬比盡量一致,且面積盡量接近。

private fun getBestSize( targetWidth: Int, targetHeight: Int, sizeList: List<Size> ): Size { val bigEnough = ArrayList<Size>() //比指定寬高大的Size列表 val notBigEnough = ArrayList<Size>() //比指定寬高小的Size列表 for (size in sizeList) { //寬高比 == 目標值寬高比 if (size.width == size.height * targetWidth / targetHeight ) { if (size.width >= targetWidth && size.height >= targetHeight) bigEnough.add(size) else notBigEnough.add(size) } } //選擇bigEnough中最小的值 或 notBigEnough中最大的值 return when { bigEnough.size > 0 -> Collections.min(bigEnough, CompareSizesByArea()) notBigEnough.size > 0 -> Collections.max(notBigEnough, CompareSizesByArea()) else -> sizeList[0] }initFaceDetect() }

initFaceDetect()用來進行人臉的Matrix初始化,后文介紹

人臉識別

為相機預覽,創建一個CameraCaptureSession對象,會話通過CameraCaptureSession.CaptureCallback返回TotalCaptureResult,通過參數可以讓其中包括人臉識別的相關信息

/** * 創建預覽會話 */ private fun createCaptureSession(cameraDevice: CameraDevice) { // 為相機預覽,創建一個CameraCaptureSession對象 cameraDevice.createCaptureSession( arrayListOf(surface), object : CameraCaptureSession.StateCallback() { override fun onConfigured(session: CameraCaptureSession) { mCameraCaptureSession = session session.setRepeatingRequest( captureRequestBuilder.build(), mCaptureCallBack, mCameraHandler ) } }, mCameraHandler ) } private val mCaptureCallBack = object : CameraCaptureSession.CaptureCallback() { override fun onCaptureCompleted( session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult ) { super.onCaptureCompleted(session, request, result) if (mFaceDetectMode != CaptureRequest.STATISTICS_FACE_DETECT_MODE_OFF) handleFaces(result) } }

通過mFaceDetectMatrix對人臉信息進行矩陣變化,確定人臉坐標以使其準確應用到TextureView。

/** * 處理人臉信息 */ private fun handleFaces(result: TotalCaptureResult) { val faces = result.get(CaptureResult.STATISTICS_FACES)!! mFacesRect.clear() for (face in faces) { val bounds = face.bounds val left = bounds.left val top = bounds.top val right = bounds.right val bottom = bounds.bottom val rawFaceRect = RectF(left.toFloat(), top.toFloat(), right.toFloat(), bottom.toFloat()) mFaceDetectMatrix.mapRect(rawFaceRect) var resultFaceRect = if (mCameraFacing == CaptureRequest.LENS_FACING_FRONT) { rawFaceRect } else { RectF( rawFaceRect.left, rawFaceRect.top - mPreviewSize.width, rawFaceRect.right, rawFaceRect.bottom - mPreviewSize.width ) } mFacesRect.add(resultFaceRect) } mActivity.runOnUiThread { mFaceDetectListener?.onFaceDetect(faces, mFacesRect) } }

最后,在UI線程將包含人臉坐標的Rect通過回調傳出:

mActivity.runOnUiThread { mFaceDetectListener?.onFaceDetect(faces, mFacesRect) }

FaceDetectMatrix

mFaceDetectMatrix是在獲取PreviewSize之后創建的

/** * 初始化人臉檢測相關信息 */ private fun initFaceDetect() { val faceDetectModes = mCameraCharacteristics.get(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES) //人臉檢測的模式 mFaceDetectMode = when { faceDetectModes!!.contains(CaptureRequest.STATISTICS_FACE_DETECT_MODE_FULL) -> CaptureRequest.STATISTICS_FACE_DETECT_MODE_FULL faceDetectModes!!.contains(CaptureRequest.STATISTICS_FACE_DETECT_MODE_SIMPLE) -> CaptureRequest.STATISTICS_FACE_DETECT_MODE_FULL else -> CaptureRequest.STATISTICS_FACE_DETECT_MODE_OFF } if (mFaceDetectMode == CaptureRequest.STATISTICS_FACE_DETECT_MODE_OFF) { mActivity.toast('相機硬件不支持人臉檢測') return } val activeArraySizeRect = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE)!! //獲取成像區域 val scaledWidth = mPreviewSize.width / activeArraySizeRect.width().toFloat() val scaledHeight = mPreviewSize.height / activeArraySizeRect.height().toFloat() val mirror = mCameraFacing == CameraCharacteristics.LENS_FACING_FRONT mFaceDetectMatrix.setRotate(mCameraSensorOrientation.toFloat()) mFaceDetectMatrix.postScale(if (mirror) -scaledHeight else scaledHeight, scaledWidth)// 注意交換width和height的位置! mFaceDetectMatrix.postTranslate( mPreviewSize.height.toFloat(), mPreviewSize.width.toFloat() ) }

控制類(GameController)

三大視圖層組裝完畢,最后需要一個總控類,對游戲進行邏輯控制

GameController

主要完成以下工作:

控制游戲的開啟/停止 計算游戲的當前得分 檢測潛艇的碰撞 對外(Activity或者Fragment等)提供游戲狀態監聽的接口

游戲開始時進行相機的初始化,創建GameHelper類并建立setFaceDetectListener回調到ForegroundView

class GameController( private val activity: AppCompatActivity, private val textureView: AutoFitTextureView, private val bg: BackgroundView, private val fg: ForegroundView) { private var camera2HelperFace: CameraHelper? = null /** * 相機初始化 */ private fun initCamera() { cameraHelper ?: run { cameraHelper = CameraHelper(activity, textureView).apply { setFaceDetectListener(object : CameraHelper.FaceDetectListener { override fun onFaceDetect(faces: Array<Face>, facesRect: ArrayList<RectF>) { if (facesRect.isNotEmpty()) { fg.onFaceDetect(faces, facesRect) } } }) } } }

游戲狀態

定義GameState,對外提供狀態的監聽。目前支持三種狀態

Start:游戲開始 Over:游戲結束 Score:游戲得分

sealed class GameState(open val score: Long) { object Start : GameState(0) data class Over(override val score: Long) : GameState(score) data class Score(override val score: Long) : GameState(score)}

可以在stop、start的時候,更新狀態

/** * 游戲狀態 */ private val _state = MutableLiveData<GameState>() internal val gameState: LiveData<GameState> get() = _state /** * 游戲停止 */ fun stop() { bg.stop() fg.stop() _state.value = GameState.Over(_score) _score = 0L } /** * 游戲再開 */ fun start() { initCamera() fg.start() bg.start() _state.value = GameState.Start handler.postDelayed({ startScoring() }, FIRST_APPEAR_DELAY_MILLIS) }

計算得分

游戲啟動時通過startScoring開始計算得分并通過GameState上報。目前的規則設置很簡單,存活時間即游戲得分

/** * 開始計分 */ private fun startScoring() { handler.postDelayed( { fg.boat?.run { bg.barsList.flatMap { listOf(it.up, it.down) } .forEach { bar -> if (isCollision( bar.x, bar.y, bar.w, bar.h, this.x, this.y, this.w, this.h ) ) { stop() return@postDelayed } } } _score++ _state.value = GameState.Score(_score) startScoring() }, 100 ) }

檢測碰撞

isCollision根據潛艇和障礙物當前位置,計算是否發生了碰撞,發生碰撞則GameOver

/** * 碰撞檢測 */ private fun isCollision( x1: Float, y1: Float, w1: Float, h1: Float, x2: Float, y2: Float, w2: Float, h2: Float ): Boolean { if (x1 > x2 + w2 || x1 + w1 < x2 || y1 > y2 + h2 || y1 + h1 < y2) { return false } return true }

Activity

Activity的工作簡單:

權限申請:動態申請Camera權限 監聽游戲狀態:創建GameController,并監聽GameState狀態

private fun startGame() { PermissionUtils.checkPermission(this, Runnable { gameController.start() gameController.gameState.observe(this, Observer { when (it) { is GameState.Start -> score.text = 'DANGERnAHEAD' is GameState.Score -> score.text = '${it.score / 10f} m' is GameState.Over -> AlertDialog.Builder(this) .setMessage('游戲結束!成功推進 ${it.score / 10f} 米! ') .setNegativeButton('結束游戲') { _: DialogInterface, _: Int -> finish() }.setCancelable(false) .setPositiveButton('再來一把') { _: DialogInterface, _: Int -> gameController.start() }.show() } }) }) }

最后

Android 實現抖音小游戲潛艇大挑戰的思路詳解

項目結構很清晰,用到的大都是常規技術,即使是新入坑Android的同學看起來也不費力。在現有基礎上還可以通過添加BGM、增加障礙物種類等,進一步提高游戲性。喜歡的話留個star鼓勵一下作者吧 ^^https://github.com/vitaviva/ugame

到此這篇關于Android 實現抖音小游戲潛艇大挑戰的思路詳解的文章就介紹到這了,更多相關android 抖音游戲潛艇大挑戰內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: 抖音
相關文章:
主站蜘蛛池模板: av中出| 亚洲精品乱码久久久久久v 精品国产a∨无码一区二区三区 | 亚洲一区网站 | 国产片性视频免费播放 | baoyu168成人免费视频 | 精品免费久久久久久久 | 伊人久久久久久久久久久 | 一本无码久本草在线中文字幕dvd | 国产乱码日产乱码精品精 | 成人国内精品久久久久影院成.人国产9 | 欧美激情一区二区 | 51久久精品夜色国产麻豆 | 无码专区一va亚洲v专区在线 | 日韩一区二区三区视频在线 | 无码人妻品一区二区三区精99 | 夜夜动漫| 中文字幕人成乱码在线观看 | 风流老熟女一区二区三区 | 小泽玛利亚一区二区三区视频 | 91精品老司机久久一区啪 | 99色| 又爽又黄禁片1000视频vr | 精品在线免费观看视频 | 欧美三级欧美一级 | 午夜影院在线播放 | 成人中文字幕+乱码+中文字幕 | 使劲插视频 | 久久精品网站免费观看 | 加勒比无码一区二区三区 | 久久久免费精品 | 亚洲熟妇av一区二区三区 | 中文字幕 欧美 日韩 | 黑人蹂躏少妇在线播放 | 一区二区在线免费观看视频 | 青青草国产成人av片免费 | 黄色一级一片 | 色播网址| 成年人国产网站 | 四川骚妇无套内射舔了更爽 | 色综合视频在线观看 | 欧美成人无尺码免费视频软件 | 免费在线看黄网址 | 亚洲日韩av无码一区二区三区人 | 人妻换人妻a片爽麻豆 | 欧美xxxx黑人xyx性爽 | 波多野结衣乳巨码无在线观看 | 久久免费av | 天堂va久久久噜噜噜久久va | 免费国产a级片 | 亚洲欧洲成人精品久久一码二码 | 日本亚洲精品一区二区三 | 亚洲精品国产偷自在线观看 | 狠狠色噜噜狠狠狠888米奇视频 | 国产又黄又猛又粗又爽 | 日欧137片内射在线视频播放 | 久久久久人妻一区精品 | 欧美成人看片黄a免费看 | 日本久操视频 | 妺妺窝人体色www在线下载 | 无码人妻毛片丰满熟妇区毛片 | 小龙女娇喘呻吟啊快点 | 成人做受视频试看60秒 | 在线视频区| a一级黄色片 | 国产免费视频一区二区裸体 | 婷婷射 | 特级做a爰片毛片免费看无码 | 污污视频网站免费观看 | 日本人乱人乱亲乱色视频观看 | 色噜噜狠狠色综合中国 | 亚洲欧美色图片 | 顶级嫩模啪啪呻吟不断好爽小说 | 国产精品久久久久久久竹霞 | 9l视频自拍九色9l视频九色 | 68精品久久久久久欧美 | 日韩成人免费在线观看 | 性猛交ⅹxxx乱大交大片 | 黑人操日本女人视频 | 国产主播中文字幕 | 伊人久久精品视频 | 操操操网站| 五月综合在线 | 欧美日韩人成综合在线播放 | 污动漫网站| 丰满少妇人妻无码 | 国产一区二区视频在线播放 | 亚洲国产精品日本无码网站 | 69xx国产 | 天堂а√中文在线官网 | 懂色av一区二区三区在线播放 | 夜夜高潮夜夜爽高清完整版1 | 免费jizzjizz在线播放 | 色婷婷久久久swag精品 | 亚洲国产成人久久综合一区,久久久国产99 | wwwav在线播放 | 成年人在线免费观看 | 色偷偷亚洲男人本色 | 午夜小视频免费观看 | 人人做人人爽 | 无遮挡啪啪摇乳动态图gif | 国产精品欧美一区二区三区喷水 | fee性满足he牲bbw | 一区二区三区在线播放视频 | 99色婷婷| 亚洲成人动漫在线观看 | 亚洲精品视频在线 | 免费成人一级片 | 蜜桃视频一区二区三区 | 国产伦子系列沙发午睡 | 国产精品久久久久久欧美2021 | 国产综合精品在线 | 国内一级黄色 | 在线免费播放av | cekc老妇女cea0 | 麻豆视频在线播放 | 欧美a一级| 日韩视频无码中字免费观 | 91久久国产婷婷一区二区 | 国产一级淫片a直接免费看 国产一级淫片免费放大片 国产一级影院 | 欧美亚洲大片 | 丁香色欲久久久久久综合网 | 无码毛片aaa在线 | 亚洲国产综合av | 偷看少妇自慰xxxx | 嫩草精品福利视频在线观看 | 噼里啪啦免费看 | 中国黄色片视频 | 挺进美女教师的蜜桃肥臀视频 | 欧美性xxxxx极品少妇偷拍 | 国产亚洲天堂 | 国产在线播 | 国产一区日韩二区欧美三区 | 亚洲国产精品无码专区影院 | a毛看片免费观看视频 | 欧洲美女黑人粗性暴交 | 天天插美女 | 亚洲乱码国产乱码精品精在线网站 | 麻豆视频精品 | 亚洲精品国产精品乱码视色 | 在线不卡日本 | 国产伦孑沙发午休精品 | 国产一级做a爰片毛片 | 日本久久久久久久做爰片日本 | 伊人久久大香线蕉综合网站 | 成人福利网 | 福利在线一区 | 国产伦理一区 | www.亚洲人 | 免费在线观看小视频 | 国产美女裸身网站免费观看视频 | 国产高清无密码一区二区三区 | 小香蕉av | 青青青爽久久午夜综合久久午夜 | 国产视频一区二区三区四区五区 | 亚洲jlzzjizz少妇 | 国产精品久久免费观看spa | 日韩视频专区 | 92精品国产成人观看免费 | 久久久久久毛片免费播放 | 久热中文字幕 | 国产又猛又黄又爽三男一女 | 日韩视频一区在线观看 | 欧美日韩不卡视频合集 | 欧美大胸大乳人奶波霸 | 国产一级片av | 老牛精品亚洲成av人片 | 中文字幕三区 | 精品久久久久久久久久久久久久久久久 | 国产精品一区亚洲二区日本三区 | a一级免费视频 | 欧美一区免费 | 欧美一区二区三区粗大 | 美女的隐私免费看 | jizz免费视频 | 欧美日韩a v| 99久久无码一区人妻a黑 | 亚洲午夜精品a片久久www慈禧 | 秋霞一区二区 | 人乳喂奶hd播放 | 亚洲国产精品久久久久久无码 | 国产美女精品aⅴ在线播放 国产美女精品人人做人人爽 | 伊人久久五月天 | 91精品国产欧美一区二区成人 | 亚洲午夜成人片 | 成年人免费在线观看网站 | 欧美日韩一区二区综合 | 高潮毛片无遮挡高清视频播放 | 99国产一区二区 | 攵女h高h1v1深与浅 | 欧美深度肠交惨叫 | 婷婷色中文字幕综合在线 | 一级淫片在线观看 | 免费无码成人片 | 亚洲区小说区激情区图片区 | 国产视频一区二区在线观看 | 午夜在线观看影院 | 成人免费看片又大又黄 | 欧美一区亚洲二区 | 国产免费又爽又色又粗视频 | 久久久受www免费人成 | 欧美成人乱码一区二区三区 | 久久精品国产2020 | 国产精品久久伊人 | 亚洲国内自拍 | 久久999 | 亚洲欧美日韩中文久久 | 亚洲福利av | 黄色操人 | 天堂av日韩| 五月丁香综合缴情六月小说 | 亚洲免费中文字幕 | 亚洲精品久久久蜜桃动漫 | 四虎少妇做爰免费视频网站四 | vvv国产在线观看一区二区 | 亚洲精品中文字幕制 | 偷拍视频一区 | 黄色大片一级片 | 99re热精品视频 | 另类视频在线观看+1080p | 国产精品夜夜嗨视频免费视频 | 人妻少妇精品无码专区 | 永久黄网站色视频免费观看w | 国产精品美女www | 一本一本久久a久久精品综合妖精 | 国产一区黄色 | 97久久久| 国产丝袜一区二区在线 | 成人免费看片入口 | 久久久久女人 | 日韩久久高清 | 黄色国产一区 | 每日更新在线观看av | 国产变态口味重另类 | 大尺度舌吻呻吟声 | 国产精品对白刺激久久久 | 国内福利视频 | 舐め犯し波多野结衣在线观看 | 精品久久久久成人码免费动漫 | 高h肉放荡爽全文寂寞少妇 高h肉各种姿势g短篇np视频 | 日本最新免费二区三区 | 日韩免费不卡视频 | 久久夜色精品国产噜噜av | 欧美专区中文字幕 | 亚洲爽爽网 | 国产又色又爽又黄又免费文章 | 久久久久久久久久久大尺度免费视频 | www.婷婷亚洲基地 | 美女航空毛片在线播放 | 少妇粗大进出白浆嘿嘿视频 | 深夜成人福利 | 成人在线视频免费 | 亚洲艹逼视频 | 伊人色综合久久天天网 | 色网站在线观看视频 | 91久久视频 | 你懂的在线观看网址 | 婷婷丁香狼人久久大香线蕉 | 国产一级免费在线 | 黄色日批| 每日av在线| 久久精品色 | 欧美日韩a v| gg国产精品国内免费观看 | 可以在线观看的黄色 | 伊人久久大香线 | 日日干夜夜艹 | 日本视频在线观看免费 | 国产偷国产偷精品高清尤物 | 喷水白丝蜜臀av久久av | 91香蕉视频在线 | 黄色小视频免费网站 | 我爱avav色av爱avav亚洲 | 人人爽人人片人人片av | 真人与拘做受免费视频 | 欧美日韩国产一区二区三区不卡 | www日本在线播放 | 911精品| 国产情侣自拍小视频 | 成品片a免人视频 | 国产男女在线 | 国产黄色片在线观看 | 色眯眯视频 | 欧美亚洲激情 | 风流少妇按摩来高潮 | wwwxxx在线观看 | 特一级黄色片 | 国产精品免费入口 | 青草成人 | 尤物yw午夜国产精品视频 | 午夜少妇性高湖久久久久 | 日本性网站 | 国产精品一线二线 | 日日操夜夜骑 | 色哟哟在线网站 | 亚洲一区二区三区四区五区午夜 | 天天躁日日躁狠狠的躁天龙影院 | 久久97精品久久久久久久不卡 | av小说免费在线观看 | 色久网| yw尤物av无码国产在线观看 | 欧美偷拍视频 | 亚洲成人av中文字幕 | www.久久久.com| 国产原创一区二区 | 国产又粗又猛又大爽又黄 | 国产欧美日韩精品a在线观看 | 全程穿着长靴做爰在线观看 | 国产精品一区二区 尿失禁 又污又爽又黄的网站 | 91av蜜桃| 黄色一区二区三区视频 | 久久伊人蜜桃av一区二区 | 日日夜夜天天 | 操一操日一日 | 极品尤物魔鬼身材啪啪仙踪林 | 91夫妻视频 | 免费大片黄在线观看视频网站 | 亚洲综合性网 | 欧州一区二区三区 | 亚洲一级免费在线观看 | 老女人伦理中文字幕 | 亚洲暴爽av天天爽日日碰 | 欧美最猛性xxxxx免费 | 亚洲区和欧洲区一二三四 | 日韩一级二级视频 | 国产妇女乱一性一交 | 性大毛片视频 | 亚洲欧美日韩一级 | 第一章婶婶的性事 | 国内精品久久久久久久久久久久 | 亚洲国产精久久久久久久 | 日韩精品一二三四区 | 欧美乱大交aaaa片if | 天天爽夜夜爽人人爽曰 | 国产精品无码电影在线观看 | 激情六月天婷婷 | 人妻少妇偷人精品视频 | 日韩中文av | 国产精品久久久久久久妇女 | www.白浆| 欧产日产国产精品98 | 欧美日韩一区二区在线播放 | 国产主播第一页 | 日本午夜精华 | 精品一区二区三区免费视频 | 亚洲影视在线 | 国产大片aaa | 91亚洲精品国产成人 | av网址网站 | 蜜桃av噜噜一区二区三区麻豆 | 亚洲最大国产成人综合网站 | 欧美日韩免费高清一区色橹橹 | 美女黄色在线观看 | 亚洲第一成网站 | 狠狠色丁香婷婷综合欧美 | 国产第6页| 男女乱淫真视频免费播放 | 91精品国产乱码久久蜜臀 | 欧性猛交ⅹxxx乱大交 | 美女屁股无遮挡 | 午夜在线视频免费观看 | 成人无码视频 | www国产精品内射老熟女 | 91成熟丰满女人少妇 | 成年性生交大片免费看 | 国产精品久久久久久久久夜色 | 日本一区二区三区精品 | 欧美成人乱码一区二区三区 | 国产九九九九九 | 狠狠插综合 | 亚洲精品久久久久久动漫器材一区 | 欧美中文字幕无线码视频 | av涩涩涩 | 色噜噜狠狠一区二区三区 | 91不戴套国语对白在线观看 | 什么网站可以看毛片 | 日批视频在线看 | 国产免费人成xvideos视频 | 婷婷丁香激情五月 | 欧美精品h | 亚洲日韩色图 | 亚洲综合在线视频 | 国产精品久久久福利 | 美女的尿囗网站免费 | 亚洲aa视频 | 另类专区欧美 | 亚洲九区| 国产精品一级二级 | 麻豆 国产| xxxx亚洲| 亚洲 小说 欧美 激情 另类 | 久久99热这里只有精品 | 美欧一级片 | 91porny在线| 成人福利在线观看 | 成年人网站黄色 | 国精产品999一区二区三区有 | 日日干综合 | 亚洲激情四射 | 日本丰满少妇高潮呻吟 | 91丝袜放荡丝袜脚交 | 国产寡妇xxxxxxxx性开放 | 中文av一区 | 美女乱淫免费视频网站 | 国产美女裸身网站免费观看视频 | 国产男人搡女人免费视频 | 日本特黄特色大片免费视频老年人 | 曰本女人与公拘交酡 | 青青草国产成人99久久 | 日韩精品在线视频免费观看 | 无套内内射视频网站 | 一女三黑人理论片在线 | 久久久久久黄 | 好会夹宝h1v1 | 亚洲在av极品无码天堂手机版 | 中国亚州女人69内射少妇 | 国产亚洲一区二区在线观看 | 国产精品91久久 | 欧美一级免费黄色片 | 女邻居丰满的奶水 | 一区二区三区四区在线播放 | 欧美女同网站 | 在线观看午夜福利院视频 | 性讥渴的黄蓉与老汉 | av在线免费播放网站 | 久久精品亚洲精品国产欧美kt∨ | 一级美女大片 | 亚洲欧美日韩综合久久久 | 国产91美女视频 | 最新黄色av网址 | 亚洲精品激情视频 | 韩国一级淫一片免费放 | 欧美猛交ⅹxxx乱大交视频 | 少妇野外性xx老女人野外性xx | 久久久久久久久久国产精品 | 亚洲日韩小电影在线观看 | 日日干夜夜干 | 国产区在线视频 | 91无毒不卡 | 国产精品九九九九九 | 日本欧美久久久久免费播放网 | 深夜视频在线观看免费 | 又黄又爽又色视频免费 | 少妇与子乱毛片 | 女女女女bbbb日韩毛片 | 91丨九色丨露脸 | 性免费视频 | 国产对白叫床清晰在线播放 | 久久久久国色av免费看图片 | 丁香六月欧美 | 51妺嘿嘿午夜福利 | 99国产欧美精品久久久蜜芽 | 公妇乱淫1~6集全观看不了啦 | 午夜美女网站 | 欧美乱轮视频 | 成人丝袜激情一区二区 | 婷婷久久亚洲 | 蜜臀av午夜一区二区三区 | 国产午夜精品久久久久久久久久 | 成人免费黄色网址 | 亚洲国产欧美一区二区三区丁香婷 | 久久无码人妻一区二区三区 | 99热精品免费| 日本性网站 | 日韩三级一区二区三区 | 亚洲精品一二三区久久伦理中文 | 老色批永久免费网站www | 成年视频免费高清在线看 | 亚洲国产精品成人天堂 | 国产超91 | 中文有码在线 | 久草在线手机视频 | 日韩亚洲欧美在线 | 欧美日韩国产免费一区二区三区 | av男人的天堂在线观看国产 | 女同重口另类在线观看 | 国产欧美一区二区三区网站 | 欧美大片视频在线观看 | 国产一区二区三区成人久久片老牛 | 亚洲天堂资源在线 | 国产目拍亚洲精品区一区 | 欧美人与禽zozzo视频 | 超高清日韩aⅴ大片美女图片 | 青青青青青草 | 亚洲人成人网站在线观看 | 欧美黄色免费大片 | www.亚洲天堂| 髙清国产性猛交xxxand | 欧美综合在线观看视频 | 乌克兰性生交视频 | 催眠淫辱の教室3在线观看 村上凉子在线播放av88 | 中国三级视频 | 国产精品27p | 国产91精品一区 | 国产精品久久久久久久久久免费看 | ,亚洲人成毛片在线播放 | 天天av天天翘天天综合网 | aa级黄色片 | 视频一区二区三区免费 | 中文字幕国产在线观看 | 免费看成人欧美片爱潮app | 中文字幕无码人妻aaa片 | 精品一区久久 | 中国农民工hd自拍xxxx | 日本免费一区二区三区最新vr | а√最新版在线天堂8 | 国产人妻精品区一区二区三区 | 伊人88| 国产精品久久久久久69 | 拔插拔插海外华人免费视频 | av伦理在线 | 91久久精品国产91久久 | 欧美一级艳片视频免费观看 | 免费看色 | 日韩精品区一区二区三vr | 婷婷日| 久久婷婷五月综合色精品 | 日本在线一级片 | 网站黄在线 | 妺妺窝人体色www在线观看 | 黄色福利在线观看 | 99爱99| 国产99在线 | 国产女优在线播放 | 成人无号精品一区二区三区 | 亚洲精品日韩av | 黄色网页免费在线观看 | 色播国产 | 日韩精品一卡2卡3卡4卡乱码的功能 | av天天堂| av小四郎在线最新地址 | 亚洲日本va午夜蜜芽在线电影 | 亚洲一区二区三区日本久久九 | 久久五月精品中文字幕 | 性插插视频 | 国产精品视频久久久 | 男女互操视频网站 | 欧美国产精品一区二区三区 | 性xxxx18免费观看视频 | 青青青爽视频在线观看 | 久久亚洲一区 | 国产亚洲精品久久久久久牛牛 | 精品少妇一区 | 99国产精品久久久久久久 | 奇米影视777四色 | 少妇精品一区二区三区在线观看 | 欧美激情videos hd| 少妇性做爰xxxⅹ性视频 | 精品久久久久久中文字幕 | 精品视频无码一区二区三区 | 日本a级老少配 | 欧美激情乱人伦 | 91网站在线看 | 国精产品一区一区三区mba下载 | 中文无套内谢少妇视频 | 秋霞网av | 人妻无码中文字幕免费视频蜜桃 | 久久在线视频精品 | 成人国产一区二区三区 | 中文字幕第九页 | 叼嘿视频91 | 91看片在线观看 | 特级毛片在线 | 女同一区二区 | 国产精品成人免费精品自在线观看 | 人妻无码久久精品人妻 | 国产成人三级在线视频 | 精品国产一区二区三区四区vr | 日韩在线观看视频一区二区三区 | 中文成人无码精品久久久不卡 | 一区二区三区不卡视频 | 亚洲精品456在线播放牛牛影院 | 久久久久久久久久网站 | 欧美另类在线观看 | 欧美日韩免费一区 | 日日婷婷夜日日天干 | 99热这里只有精品7 99热这里只有精品8 | 国产精品传媒在线观看 | 日韩欧美在线综合网另类 | 男女三级视频 | 午夜男女无遮挡拍拍视频 | 性中国videossexo另类 | 最新国产在线视频 | 国产亚洲视频在线播放香蕉 | 色香五月| 国产无 | 精品人妻码一区二区三区 | av免费提供 | 亚洲天堂免费av | 红色假期黑色婚礼2 | 内射女校花一区二区三区 | 精品99久久久久久 | 亚洲中文字幕无码不卡电影 | 性一交一乱一色一视频 | 欧美日韩亚洲国产精品 | 97精品在线视频 | 日本亚洲9999aⅴ | 国产尤物精品自在拍视频首页 | 亚洲精品网站在线观看 | 无码无套少妇毛多69xxx | 丰满少妇被猛烈进入高清播放 | 黑人狂躁日本妞一区二区三区 | 欧美日韩一区二区成人午夜电影 | 欧美乱论视频 | 在线视频一区少妇露脸福利在线 | 欧美亚韩一区二区三区 | 日韩欧美在线观看视频 | 中文欧美日韩 | 99久热在线精品996热是什么 | 欧洲精品在线观看 | 精品福利影院 | 日韩成人中文字幕 | 亚洲欧洲精品视频 | 日本乱子伦xxxx | 日女人毛片 | 亚洲综合av色婷婷 |