久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

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

如何用VUE和Canvas實現雷霆戰機打字類小游戲

瀏覽:71日期:2022-09-30 16:53:45

今天就來實現一個雷霆戰機打字游戲,玩法很簡單,每一個“敵人”都是一些英文單詞,鍵盤正確打出單詞的字母,飛機就會發射一個個子彈消滅“敵人”,每次需要擊斃當前“敵人”后才能擊斃下一個,一個比手速和單詞熟練度的游戲。

首先來看看最終效果圖:

如何用VUE和Canvas實現雷霆戰機打字類小游戲

emmmmmmmmmmmmm,界面UI做的很簡單,先實現基本功能,再考慮高大上的UI吧。

首先依舊是來分析界面組成:

(1)固定在畫面底部中間的飛機;

(2)從畫面上方隨機產生的敵人(單詞);

(3)從飛機頭部發射出去,直奔敵人而去的子彈;

(4)游戲結束后的分數顯示。

這次的游戲和之前的比,運動的部分貌似更多且更復雜了。在flappy bird中,雖然管道是運動的,但是小鳥的x坐標和管道的間隔、寬度始終不變,比較容易計算邊界;在彈球消磚塊游戲中,木板和磚塊都是相對簡單或者固定的坐標,只用判定彈球的邊界和磚塊的觸碰面積就行。在雷霆戰機消單詞游戲中,無論是降落的目標單詞,還是飛出去的子彈,都有著各自的運動軌跡,但是子彈又要追尋著目標而去,所以存在著一個實時計算軌道的操作。

萬丈高樓平地起,說了那么多,那就從最簡單的開始著手吧!

1、固定在畫面底部中間的飛機

這個很簡單沒啥好說的,這里默認飛機寬度高度為40像素單位,然后將飛機畫在畫面的底部中間:

drawPlane() { let _this = this; _this.ctx.save(); _this.ctx.drawImage(_this.planeImg,_this.clientWidth / 2 - 20,_this.clientHeight - 20 - 40,40,40 ); _this.ctx.restore();},2、從畫面上方隨機產生的敵人

這里默認設置每次在畫面中最多只出現3個單詞靶子,靶子的y軸移動速度為1.3,靶子的半徑大小為10:

const _MAX_TARGET = 3; // 畫面中一次最多出現的目標const _TARGET_CONFIG = { // 靶子的固定參數 speed: 1.3, radius: 10};

然后我們一開始要隨機在詞庫數組里取出_MAX_TARGET個不重復的單詞,并把剩下的詞放進循環詞庫this.wordsPool中去:

generateWord(number) { // 從池子里隨機挑選一個詞,不與已顯示的詞重復 let arr = []; for (let i = 0; i < number; i++) {let random = Math.floor(Math.random() * this.wordsPool.length);arr.push(this.wordsPool[random]);this.wordsPool.splice(random, 1); } return arr;},generateTarget() { // 隨機生成目標 let _this = this; let length = _this.targetArr.length; if (length < _MAX_TARGET) {let txtArr = _this.generateWord(_MAX_TARGET - length);for (let i = 0; i < _MAX_TARGET - length; i++) { _this.targetArr.push({ x: _this.getRandomInt( _TARGET_CONFIG.radius, _this.clientWidth - _TARGET_CONFIG.radius ), y: _TARGET_CONFIG.radius * 2, txt: txtArr[i], typeIndex: -1, hitIndex: -1, dx: (_TARGET_CONFIG.speed * Math.random().toFixed(1)) / 2, dy: _TARGET_CONFIG.speed * Math.random().toFixed(1), rotate: 0 });} }}

可以看出,this.targetArr是存放目標對象的數組:

一個初始的目標有隨機分布在畫面寬度的x;

y軸值為直徑;

txt記錄靶子代表的單詞;

typeIndex記錄“轟炸”這個單詞時正在敲擊的字符索引下標(用來分離已敲擊字符和未敲擊字符);

hitIndex記錄“轟炸”這個單詞時子彈轟炸的索引下標(因為子彈真正轟炸掉目標是在打完單詞之后,畢竟子彈有飛行時間,所以通過hitIndex來判斷子彈什么時候被擊碎消失);

dx是靶子每幀在x軸偏移距離;

dy是靶子每幀在y軸偏移距離;

rotate設置靶子自轉角度。

好了,生成了3個靶子,我們就讓靶子先從上往下動起來吧:

drawTarget() { // 逐幀畫目標 let _this = this; _this.targetArr.forEach((item, index) => {_this.ctx.save();_this.ctx.translate(item.x, item.y); //設置旋轉的中心點_this.ctx.beginPath();_this.ctx.font = '14px Arial';if ( index === _this.currentIndex || item.typeIndex === item.txt.length - 1) { _this.drawText( item.txt.substring(0, item.typeIndex + 1), -item.txt.length * 3, _TARGET_CONFIG.radius * 2, 'gray' ); let width = _this.ctx.measureText( item.txt.substring(0, item.typeIndex + 1) ).width; // 獲取已敲擊文字寬度 _this.drawText( item.txt.substring(item.typeIndex + 1, item.txt.length), -item.txt.length * 3 + width, _TARGET_CONFIG.radius * 2, 'red' );} else { _this.drawText( item.txt, -item.txt.length * 3, _TARGET_CONFIG.radius * 2, 'yellow' );} _this.ctx.closePath();_this.ctx.rotate((item.rotate * Math.PI) / 180);_this.ctx.drawImage( _this.targetImg, -1 * _TARGET_CONFIG.radius, -1 * _TARGET_CONFIG.radius, _TARGET_CONFIG.radius * 2, _TARGET_CONFIG.radius * 2);_this.ctx.restore();item.y += item.dy;item.x += item.dx;if (item.x < 0 || item.x > _this.clientWidth) { item.dx *= -1;}if (item.y > _this.clientHeight - _TARGET_CONFIG.radius * 2) { // 碰到底部了 _this.gameOver = true;}// 旋轉item.rotate++; });}

這一步畫靶子沒有什么特別的,隨機得增加dx和dy,在碰到左右邊緣時反彈。主要一點就是單詞的繪制,通過typeIndex將單詞一分為二,敲擊過的字符置為灰色,然后通過measureText獲取到敲擊字符的寬度從而設置未敲擊字符的x軸偏移量,將未敲擊的字符設置為紅色,提示玩家這個單詞是正在攻擊中的目標。

3、從飛機頭部發射出去,直奔敵人而去的子彈

子彈是這個游戲的關鍵部分,在繪制子彈的時候要考慮哪些方面呢?

(1)目標一直是運動的,發射出去的子彈要一直“追蹤”目標,所以路徑是動態變化的;

(2)一個目標需要被若干個子彈消滅掉,所以什么時候子彈才從畫面中抹去;

(3)當一個目標單詞被敲擊完了后,下一批子彈就要朝向下一個目標射擊,所以子彈的路徑是單獨的;

(4)如何繪制出子彈的拖尾效果;

(5)如果鎖定正在敲擊的目標單詞,使玩家敲完當前單詞才能去擊破下一個單詞

這里先設置幾個變量:

bulletArr: [], // 存放子彈對象

currentIndex: -1  //當前鎖定的目標在targetArr中的索引

首先我們先來寫一下鍵盤按下時要觸發的函數:

handleKeyPress(key) { // 鍵盤按下,判斷當前目標 let _this = this; if (_this.currentIndex === -1) {// 當前沒有在射擊的目標let index = _this.targetArr.findIndex(item => { return item.txt.indexOf(key) === 0;});if (index !== -1) { _this.currentIndex = index; _this.targetArr[index].typeIndex = 0; _this.createBullet(index);} } else {// 已有目標正在被射擊if ( key === _this.targetArr[_this.currentIndex].txt.split('')[ _this.targetArr[_this.currentIndex].typeIndex + 1 ]) { // 獲取到目標對象 _this.targetArr[_this.currentIndex].typeIndex++; _this.createBullet(_this.currentIndex); if ( _this.targetArr[_this.currentIndex].typeIndex === _this.targetArr[_this.currentIndex].txt.length - 1 ) { // 這個目標已經別射擊完畢 _this.currentIndex = -1; }} }},// 發射一個子彈 createBullet(index) { let _this = this; this.bulletArr.push({dx: 1,dy: 4,x: _this.clientWidth / 2,y: _this.clientHeight - 60,targetIndex: index });}

這個函數做的事情很明確,拿到當前鍵盤按下的字符,如果currentIndex ===-1,證明沒有正在被攻擊的靶子,所以就去靶子數組里看,哪個單詞的首字母等于該字符,則設置currentIndex為該單詞的索引,并發射一個子彈;如果已經有正在被攻擊的靶子,則看還未敲擊的單詞的第一個字符是否符合,若符合,則增加該靶子對象的typeIndex,并發射一個子彈,若當前靶子已敲擊完畢,則重置currentIndex為-1。

接下來就是畫子彈咯:

drawBullet() { // 逐幀畫子彈 let _this = this; // 判斷子彈是否已經擊中目標 if (_this.bulletArr.length === 0) {return; } _this.bulletArr = _this.bulletArr.filter(_this.firedTarget); _this.bulletArr.forEach(item => {let targetX = _this.targetArr[item.targetIndex].x;let targetY = _this.targetArr[item.targetIndex].y;let k = (_this.clientHeight - 60 - targetY) / (_this.clientWidth / 2 - targetX); // 飛機頭和目標的斜率let b = targetY - k * targetX; // 常量bitem.y = item.y - bullet.dy; // y軸偏移一個單位item.x = (item.y - b) / k;for (let i = 0; i < 15; i++) { // 畫出拖尾效果 _this.ctx.beginPath(); _this.ctx.arc( (item.y + i * 1.8 - b) / k, item.y + i * 1.8, 4 - 0.2 * i, 0, 2 * Math.PI ); _this.ctx.fillStyle = `rgba(193,255,255,${1 - 0.08 * i})`; _this.ctx.fill(); _this.ctx.closePath();} });},firedTarget(item) { // 判斷是否擊中目標 let _this = this; if (item.x > _this.targetArr[item.targetIndex].x - _TARGET_CONFIG.radius &&item.x < _this.targetArr[item.targetIndex].x + _TARGET_CONFIG.radius &&item.y > _this.targetArr[item.targetIndex].y - _TARGET_CONFIG.radius &&item.y < _this.targetArr[item.targetIndex].y + _TARGET_CONFIG.radius ) {// 子彈擊中了目標let arrIndex = item.targetIndex;_this.targetArr[arrIndex].hitIndex++;if ( _this.targetArr[arrIndex].txt.length - 1 === _this.targetArr[arrIndex].hitIndex) { // 所有子彈全部擊中了目標 let word = _this.targetArr[arrIndex].txt; _this.targetArr[arrIndex] = { // 生成新的目標 x: _this.getRandomInt( _TARGET_CONFIG.radius, _this.clientWidth - _TARGET_CONFIG.radius ), y: _TARGET_CONFIG.radius * 2, txt: _this.generateWord(1)[0], typeIndex: -1, hitIndex: -1, dx: (_TARGET_CONFIG.speed * Math.random().toFixed(1)) / 2, dy: _TARGET_CONFIG.speed * Math.random().toFixed(1), rotate: 0 }; _this.wordsPool.push(word); // 被擊中的目標詞重回池子里 _this.score++;}return false; } else {return true; }}

其實也很簡單,我們在子彈對象中用targetIndex來記錄該子彈所攻擊的目標索引,然后就是一個y = kx+b的解方程得到飛機頭部(子彈出發點)和靶子的軌道函數,計算出每一幀下每個子彈的移動坐標,就可以畫出子彈了;

拖尾效果就是沿軌道y軸增長方向畫出若干個透明度和半徑逐漸變小的圓,就能實現拖尾效果了;

在firedTarget()函數中,用來過濾出已擊中靶子的子彈,為了不影響還在被攻擊的其他靶子在targetArr中的索引,不用splice刪除,而是直接重置被消滅靶子的值,從wordPool中選出新的詞,并把當前擊碎的詞重新丟回池子里,從而保證畫面中不會出現重復的靶子。

如何用VUE和Canvas實現雷霆戰機打字類小游戲

4、游戲結束后的得分文字效果

游戲結束就是有目標靶子觸碰到了底部就結束了。

這里其實是個彩蛋了,怎么樣可以用canvas畫出這種閃爍且有光暈的文字呢?切換顏色并且疊buff就行了,不是,疊輪廓stroke就行了

drawGameOver() { let _this = this; //保存上下文對象的狀態 _this.ctx.save(); _this.ctx.font = '34px Arial'; _this.ctx.strokeStyle = _this.colors[0]; _this.ctx.lineWidth = 2; //光暈 _this.ctx.shadowColor = '#FFFFE0'; let txt = '游戲結束,得分:' + _this.score; let width = _this.ctx.measureText(txt).width; for (let i = 60; i > 3; i -= 2) {_this.ctx.shadowBlur = i;_this.ctx.strokeText(txt, _this.clientWidth / 2 - width / 2, 300); } _this.ctx.restore(); _this.colors.reverse();}

好了好了,做到這里就是個還算完整的小游戲了,只是UI略顯粗糙,如果想做到真正雷霆戰機那么酷炫帶爆炸的效果那還需要很多素材和canvas的繪制。

canvas很強大很好玩,只要腦洞夠大,這張畫布上你想畫啥就可以畫啥~

老規矩,po上vue的完整代碼供大家參考學習:

<template> <div class='type-game'> <canvas height='600'></canvas> </div></template> <script>const _MAX_TARGET = 3; // 畫面中一次最多出現的目標const _TARGET_CONFIG = { // 靶子的固定參數 speed: 1.3, radius: 10};const _DICTIONARY = ['apple', 'orange', 'blue', 'green', 'red', 'current'];export default { name: 'TypeGame', data() { return { ctx: null, clientWidth: 0, clientHeight: 0, bulletArr: [], // 屏幕中的子彈 targetArr: [], // 存放當前目標 targetImg: null, planeImg: null, currentIndex: -1, wordsPool: [], score: 0, gameOver: false, colors: ['#FFFF00', '#FF6666'] }; }, mounted() { let _this = this; _this.wordsPool = _DICTIONARY.concat([]); let container = document.getElementById('type'); _this.clientWidth = container.width; _this.clientHeight = container.height; _this.ctx = container.getContext('2d'); _this.targetImg = new Image(); _this.targetImg.src = require('@/assets/img/target.png'); _this.planeImg = new Image(); _this.planeImg.src = require('@/assets/img/plane.png'); document.onkeydown = function(e) { let key = window.event.keyCode; if (key >= 65 && key <= 90) {_this.handleKeyPress(String.fromCharCode(key).toLowerCase()); } }; _this.targetImg.onload = function() { _this.generateTarget(); (function animloop() {if (!_this.gameOver) { _this.drawAll();} else { _this.drawGameOver();}window.requestAnimationFrame(animloop); })(); }; }, methods: { drawGameOver() { let _this = this; //保存上下文對象的狀態 _this.ctx.save(); _this.ctx.font = '34px Arial'; _this.ctx.strokeStyle = _this.colors[0]; _this.ctx.lineWidth = 2; //光暈 _this.ctx.shadowColor = '#FFFFE0'; let txt = '游戲結束,得分:' + _this.score; let width = _this.ctx.measureText(txt).width; for (let i = 60; i > 3; i -= 2) {_this.ctx.shadowBlur = i;_this.ctx.strokeText(txt, _this.clientWidth / 2 - width / 2, 300); } _this.ctx.restore(); _this.colors.reverse(); }, drawAll() { let _this = this; _this.ctx.clearRect(0, 0, _this.clientWidth, _this.clientHeight); _this.drawPlane(0); _this.drawBullet(); _this.drawTarget(); _this.drawScore(); }, drawPlane() { let _this = this; _this.ctx.save(); _this.ctx.drawImage(_this.planeImg,_this.clientWidth / 2 - 20,_this.clientHeight - 20 - 40,40,40 ); _this.ctx.restore(); }, generateWord(number) { // 從池子里隨機挑選一個詞,不與已顯示的詞重復 let arr = []; for (let i = 0; i < number; i++) {let random = Math.floor(Math.random() * this.wordsPool.length);arr.push(this.wordsPool[random]);this.wordsPool.splice(random, 1); } return arr; }, generateTarget() { // 隨機生成目標 let _this = this; let length = _this.targetArr.length; if (length < _MAX_TARGET) {let txtArr = _this.generateWord(_MAX_TARGET - length);for (let i = 0; i < _MAX_TARGET - length; i++) { _this.targetArr.push({ x: _this.getRandomInt( _TARGET_CONFIG.radius, _this.clientWidth - _TARGET_CONFIG.radius ), y: _TARGET_CONFIG.radius * 2, txt: txtArr[i], typeIndex: -1, hitIndex: -1, dx: (_TARGET_CONFIG.speed * Math.random().toFixed(1)) / 2, dy: _TARGET_CONFIG.speed * Math.random().toFixed(1), rotate: 0 });} } }, getRandomInt(n, m) { return Math.floor(Math.random() * (m - n + 1)) + n; }, drawText(txt, x, y, color) { let _this = this; _this.ctx.fillStyle = color; _this.ctx.fillText(txt, x, y); }, drawScore() { // 分數 this.drawText('分數:' + this.score, 10, this.clientHeight - 10, '#fff'); }, drawTarget() { // 逐幀畫目標 let _this = this; _this.targetArr.forEach((item, index) => {_this.ctx.save();_this.ctx.translate(item.x, item.y); //設置旋轉的中心點_this.ctx.beginPath();_this.ctx.font = '14px Arial';if ( index === _this.currentIndex || item.typeIndex === item.txt.length - 1) { _this.drawText( item.txt.substring(0, item.typeIndex + 1), -item.txt.length * 3, _TARGET_CONFIG.radius * 2, 'gray' ); let width = _this.ctx.measureText( item.txt.substring(0, item.typeIndex + 1) ).width; // 獲取已敲擊文字寬度 _this.drawText( item.txt.substring(item.typeIndex + 1, item.txt.length), -item.txt.length * 3 + width, _TARGET_CONFIG.radius * 2, 'red' );} else { _this.drawText( item.txt, -item.txt.length * 3, _TARGET_CONFIG.radius * 2, 'yellow' );} _this.ctx.closePath();_this.ctx.rotate((item.rotate * Math.PI) / 180);_this.ctx.drawImage( _this.targetImg, -1 * _TARGET_CONFIG.radius, -1 * _TARGET_CONFIG.radius, _TARGET_CONFIG.radius * 2, _TARGET_CONFIG.radius * 2);_this.ctx.restore();item.y += item.dy;item.x += item.dx;if (item.x < 0 || item.x > _this.clientWidth) { item.dx *= -1;}if (item.y > _this.clientHeight - _TARGET_CONFIG.radius * 2) { // 碰到底部了 _this.gameOver = true;}// 旋轉item.rotate++; }); }, handleKeyPress(key) { // 鍵盤按下,判斷當前目標 let _this = this; if (_this.currentIndex === -1) {// 當前沒有在射擊的目標let index = _this.targetArr.findIndex(item => { return item.txt.indexOf(key) === 0;});if (index !== -1) { _this.currentIndex = index; _this.targetArr[index].typeIndex = 0; _this.createBullet(index);} } else {// 已有目標正在被射擊if ( key === _this.targetArr[_this.currentIndex].txt.split('')[ _this.targetArr[_this.currentIndex].typeIndex + 1 ]) { // 獲取到目標對象 _this.targetArr[_this.currentIndex].typeIndex++; _this.createBullet(_this.currentIndex); if ( _this.targetArr[_this.currentIndex].typeIndex === _this.targetArr[_this.currentIndex].txt.length - 1 ) { // 這個目標已經別射擊完畢 _this.currentIndex = -1; }} } }, // 發射一個子彈 createBullet(index) { let _this = this; this.bulletArr.push({dx: 1,dy: 4,x: _this.clientWidth / 2,y: _this.clientHeight - 60,targetIndex: index }); }, firedTarget(item) { // 判斷是否擊中目標 let _this = this; if (item.x > _this.targetArr[item.targetIndex].x - _TARGET_CONFIG.radius &&item.x < _this.targetArr[item.targetIndex].x + _TARGET_CONFIG.radius &&item.y > _this.targetArr[item.targetIndex].y - _TARGET_CONFIG.radius &&item.y < _this.targetArr[item.targetIndex].y + _TARGET_CONFIG.radius ) {// 子彈擊中了目標let arrIndex = item.targetIndex;_this.targetArr[arrIndex].hitIndex++;if ( _this.targetArr[arrIndex].txt.length - 1 === _this.targetArr[arrIndex].hitIndex) { // 所有子彈全部擊中了目標 let word = _this.targetArr[arrIndex].txt; _this.targetArr[arrIndex] = { // 生成新的目標 x: _this.getRandomInt( _TARGET_CONFIG.radius, _this.clientWidth - _TARGET_CONFIG.radius ), y: _TARGET_CONFIG.radius * 2, txt: _this.generateWord(1)[0], typeIndex: -1, hitIndex: -1, dx: (_TARGET_CONFIG.speed * Math.random().toFixed(1)) / 2, dy: _TARGET_CONFIG.speed * Math.random().toFixed(1), rotate: 0 }; _this.wordsPool.push(word); // 被擊中的目標詞重回池子里 _this.score++;}return false; } else {return true; } }, drawBullet() { // 逐幀畫子彈 let _this = this; // 判斷子彈是否已經擊中目標 if (_this.bulletArr.length === 0) {return; } _this.bulletArr = _this.bulletArr.filter(_this.firedTarget); _this.bulletArr.forEach(item => {let targetX = _this.targetArr[item.targetIndex].x;let targetY = _this.targetArr[item.targetIndex].y;let k = (_this.clientHeight - 60 - targetY) / (_this.clientWidth / 2 - targetX); // 飛機頭和目標的斜率let b = targetY - k * targetX; // 常量bitem.y = item.y - 4; // y軸偏移一個單位item.x = (item.y - b) / k;for (let i = 0; i < 15; i++) { // 畫出拖尾效果 _this.ctx.beginPath(); _this.ctx.arc( (item.y + i * 1.8 - b) / k, item.y + i * 1.8, 4 - 0.2 * i, 0, 2 * Math.PI ); _this.ctx.fillStyle = `rgba(193,255,255,${1 - 0.08 * i})`; _this.ctx.fill(); _this.ctx.closePath();} }); } }};</script> <!-- Add 'scoped' attribute to limit CSS to this component only --><style scoped lang='scss'>.type-game { #type { background: #2a4546; }}</style>

以上就是如何用VUE和Canvas實現雷霆戰機打字類小游戲的詳細內容,更多關于VUE雷霆戰機小游戲的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
主站蜘蛛池模板: 精品成人一区 | 国产精品乱码一二三区的特点 | 成人情趣视频 | 伊人网在线免费观看 | 日本天堂一区二区 | 亚洲二区在线 | a视频在线观看免费 | 久久99这里只有精品 | 精品在线一区二区 | 精品少妇一区二区三区日产乱码 | 人人干美女 | 黄色一级免费大片 | 国产拍拍视频 | 男人天堂网av | 精品福利在线视频 | 亚欧洲精品视频在线观看 | 国产精品日本一区二区不卡视频 | 欧美一a一片一级一片 | 亚洲精品久久久一区二区三区 | 成人国产精品色哟哟 | 国产精品久久久久久久久久久久久久 | 99爱在线观看 | 亚洲八区 | 午夜久久乐| 亚洲一区二区三区在线免费观看 | 亚洲国产高清视频 | 亚洲免费色| 一区二区在线视频免费观看 | 日韩精品www | 亚洲一区视频在线 | 国产九九精品视频 | 毛片在线免费播放 | 龙珠z中文版普通话 | 亚洲h在线观看 | 日本不卡一区二区 | 一级片大全 | 精品久久久久久亚洲综合网站 | 奇米av | 一区二区三区视频免费看 | 国产精品久久久久久久午夜片 | 91精品国产aⅴ | 免费视频二区 | 岛国av免费看 | 伊人激情av一区二区三区 | 欧美自拍三区 | 日韩小视频在线播放 | 欧洲另类交 | 91免费电影| 亚洲精美视频 | 91麻豆精品国产91久久久久久久久 | 国产乱码精品一区二区三区爽爽爽 | 高清视频一区二区三区 | 亚洲视频在线播放 | 精品日韩一区二区三区 | 精品国产一区二区三区免费 | 四虎永久| 国产精品久久九九 | 日本久久久久久久久 | 欧美日韩精品一区二区三区 | 一级黄色录像在线观看 | 男女精品视频 | 国产在线观看高清 | 国产精品视频播放 | 欧美福利一区 | 色婷婷久久| 国产精品一区二区三区四区 | 一色桃子av一区二区免费 | 久久久久久亚洲精品 | www日本高清| 中文字字幕在线观看 | 欧美精品一区二区三区四区在线 | 97色在线观看免费视频 | 精品国产一区二区三区在线观看 | 亚洲福利精品视频 | 国产午夜久久 | 欧美日韩一区在线观看 | 一区二区网站 | 国产亚洲一区二区精品 | 亚洲一区二区三区免费在线观看 | 国产精品无| 久久白虎 | 国产精品成人一区二区三区夜夜夜 | 欧美日韩亚洲二区 | 午夜视频在线免费观看 | 干狠狠| 国产高清一区二区 | 欧美一区二区精品 | av最新在线 | 国产精品美女视频 | 成人v片 | 国产精品久久久久久av公交车 | 国产在线观看一区二区 | av一区二区在线观看 | 亚洲国产高清在线 | 在线视频一区二区三区 | 色吟av| 久久中文字幕一区 | 日韩欧美二区 | 亚洲欧美一区二区三区在线 | 久久精品久久久久久久久久久久久 | 日本在线一二 | 成人欧美一区二区三区在线播放 | 一二三区不卡视频 | 久久久国产精品入口麻豆 | 亚洲综合一区二区 | 日韩视频免费在线播放 | 亚洲免费在线 | 欧美日韩一区二区电影 | 精品国产91久久久久久久 | 亚洲人在线 | 日本videos18高清hd下 | 亚洲久久久 | 亚洲午夜在线 | 国产精品久久久久久久久久久小说 | 欧美一级在线 | 欧美成人影院在线 | a免费在线| 日韩精品中文字幕一区二区三区 | 亚洲人成人一区二区在线观看 | 怡红院免费在线视频 | 欧美精品导航 | 91九色网站 | 一区不卡 | 国产伦精品一区二区三区在线 | 精品一区二区在线观看 | 日本黄色的视频 | 久久91精品 | 亚洲乱码一区二区三区在线观看 | 91午夜精品一区二区三区 | 久草青青 | 成人在线观看免费 | 日韩成人影院在线观看 | 午夜视频在线观看网址 | 国产女人爽到高潮免费视频 | 国产一区二区三区免费 | 中文字幕在线看 | 另类天堂| 婷婷视频在线 | 国产欧美在线视频 | 久久999免费视频 | 亚洲国产精品久久久久久 | 成人夜晚看av | 婷婷天堂| 国产视频久久 | 欧美,日韩,国产精品免费观看 | 狠狠色狠狠色合久久伊人 | 欧美一级免费观看 | 一区二区三区日韩 | 日本久久久亚洲精品 | 国产精品亲子伦av一区二区三区 | 亚洲欧美综合 | 综合久久网 | 2021最新热播中文字幕-第1页-看片视频 青青青久草 | 日韩欧美在线一区 | 成人h动漫在线看 | av一区二区三区四区 | 亚洲精彩视频 | 国产精品高清在线 | 91在线看片 | 一级做a| 夸克满天星在线观看 | 人人玩人人添人人澡97 | 欧美日韩在线电影 | 91人人爽人人爽人人精88v | 国产福利一区二区三区四区 | 日本色网址 | 免费在线观看毛片网站 | 日韩精品视频久久 | 一区二区不卡 | 黄色免费一级 | 久热久热 | 成人av网站免费观看 | 午夜影院免费观看 | av毛片免费 | 中文字幕视频免费观看 | 久久男人天堂 | www.日韩在线观看 | 精品免费av | 亚洲视频在线播放 | 国产一级片| 日韩色综合 | 亚洲国产成人久久综合一区,久久久国产99 | 天天草狠狠干 | 中文字幕一区在线观看视频 | 亚洲人成网亚洲欧洲无码 | 久久久久成人精品 | 日韩在线观看中文字幕 | 精品国产一区二区三区久久久蜜臀 | 国产精品片aa在线观看 | 亚洲性在线 | 成人欧美 | 国产精品久久久久久久久久免费看 | 99re在线播放视频 | 亚洲a网 | v亚洲 | 国产综合精品一区二区三区 | 日韩综合一区 | 精品久久久久久久 | 成人av网站免费观看 | 成人羞羞在线观看网站 | 欧美国产精品一区二区 | 日韩一区在线观看视频 | 美女天堂网 | 日韩欧美高清视频 | 色综久久 | 狠狠ri | 一级毛片免费一级 | 999国产在线 | 91在线中文 | 免费黄色欧美 | 亚洲国产一区二区三区在线观看 | 综合婷婷| 日日夜夜爽 | 久久免费在线观看 | 亚洲天堂一区二区 | 青青草视频网站 | 91在线视频 | 国产精品成人一区二区三区夜夜夜 | 久热久热 | 操视频网站| 男人的天堂免费 | 久久精品亚洲一区 | 亚洲电影免费 | 亚洲国产午夜 | 亚洲人免费视频 | 天天干天天去 | 91原创视频在线观看 | 国产区久久 | a中文在线 | 性色av一区二区三区 | 理伦影院 | 操老逼 | 青青草久久爱 | 亚洲综合欧美 | 91精品国产91久久久久久吃药 | 成人在线视频网站 | 国精产品一区一区三区免费完 | 亚洲免费在线视频 | 91久久精品一区二区二区 | 亚洲成人av在线 | 欧美一区二区三区电影 | 午夜精品久久久久久久男人的天堂 | 国产97人人超碰caoprom | av男人的天堂网 | 国内精品一区二区 | 免费v片 | 黄色一级在线观看 | 天天澡天天狠天天天做 | 精品久久久久久一区二区 | 亚洲小视频 | 2020亚洲视频| www.嫩草| 国产自产才c区 | 久久久噜噜噜www成人网 | 日本在线免费电影 | 久草在线观看福利视频 | 黄a在线看 | 天天干天天操 | 黄理论视频 | 久久九九 | 91xx在线观看| 久久青草av | 91久久精品| 国产精久久 | 日韩成人不卡 | 国产成人精品网站 | 中文字幕av一区二区 | 999这里只有精品 | 亚洲精品乱码久久久久久蜜桃不爽 | 色综合一区二区三区 | 日韩欧美国产一区二区 | 日本一区二区三区在线视频 | 亚洲毛片在线观看 | 婷婷av网站 | 国产亚洲综合一区二区 | 欧美色综合 | 色噜噜狠狠狠综合曰曰曰88av | 91精品综合久久久久久五月天 | 毛片国产| 97色在线观看免费视频 | 中文字幕在线观看亚洲 | 97久久久国产精品 | 国产精品美女久久久久久免费 | 日韩一区在线视频 | 亚洲成人免费网站 | 成人精品久久 | 亚洲午夜视频在线观看 | 欧美一区在线视频 | 在线成人免费 | 午夜日韩 | 亚洲精品福利在线观看 | 黄视频在线播放 | 国产精品免费视频观看 | 亚洲精品国产电影 | 天天天插 | 免费观看毛片 | 视频网站免费观看 | 欧美日韩精品一区二区三区 | 亚洲欧美日韩天堂 | 欧美一区不卡 | 91精品国产色综合久久不卡98口 | 欧美日韩在线观看中文字幕 | 日韩一区二区观看 | 精品一区二区三区在线观看 | 成人性生交大片免费看中文带字幕 | 国产精品一区二区久久久久 | a久久| 国产成人久久精品一区二区三区 | 中文字幕av一区 | aa级毛片毛片免费观看久 | 久久午夜电影 | 国产精品久久天天躁 | 高清av一区 | 国产成人精品久久 | 日韩高清在线 | 成人福利在线观看 | 国产精品美乳一区二区免费 | 99精品视频一区二区三区 | 欧美精品第一页 | www.44181com| 日韩城人网站 | 999久久久国产精品 免费视频一区 | 五月激情婷婷六月 | 成人免费小视频 | 亚洲高清免费视频 | 亚洲精品一区二区三区四区高清 | 国产精品久久久久久久久免费丝袜 | 婷婷亚洲五月 | 欧美亚洲一区二区三区 | 国产区视频在线观看 | 一区二区三区亚洲精品国 | 成人欧美一区二区三区在线播放 | 一区二区国产精品 | 91精品国产综合久久国产大片 | 免费观看黄色一级大片 | 日本不卡精品 | 国产精品久久久久久久久久 | 国产精品久久视频 | 精品国产一区二区三区成人影院 | 日本激情网 | 国产91在线播放精品91 | 国产中文视频 | 一级黄色录象片 | 欧美视频区 | 免费一二二区视频 | 日韩第一区 | 婷婷综合激情 | 日本欧美国产 | 一区免费看 | 成人免费视频视频在线观看 免费 | 成人在线免费观看 | 亚洲视频中文字幕 | 免费亚洲一区二区 | 91在线观看免费 | 国产精品久久av | 久久久久久久久久久久福利 | 一区二区三区免费 | 亚洲国产成人av好男人在线观看 | 日韩有码在线观看 | 欧美片网站免费 | 日韩av免费在线观看 | 日韩成人高清视频 | 91看片淫黄大片一级在线观看 | 日日视频| 国产成人久久精品麻豆二区 | 久久久国产视频 | 久久精品国产99 | 国产精品毛片一区二区在线看 | 黄色av免费看 | 久章操 | 日本黄色一级电影 | 中文字幕日韩欧美一区二区三区 | hsck成人网 | 欧美xxxx在线 | 国产日韩精品一区二区在线观看播放 | 色综合久久久久 | 亚洲视频在线观看一区二区三区 | 手机久久看片 | 国产成人精品a视频一区www | 不卡的一区二区 | 国产精品国产三级国产aⅴ 羞羞的视频在线 | 欧美色欧美亚洲另类七区 | 国产精品久久精品 | 北条麻妃一区二区免费播放 | 黄网免费| 黄色一级在线观看 | 成人毛片久久 | 999精品在线| 欧美一级片在线 | 成人精品高清 | 精品xxxx户外露出视频 | 日韩精品在线视频观看 | 伊人啪啪 | 午夜精品久久久久久久星辰影院 | av官网| 天堂免费在线 | 亚洲一区二区在线免费观看 | 久久中文字幕一区二区 | 成人精品一区 | 欧美不卡视频一区发布 | 91免费观看| www.日韩系列 | 久久久艹 | 欧美日韩一区二区三区在线观看 | 四虎影视| 操碰97| 亚洲狠狠爱一区二区三区 | 日韩免费在线观看视频 | 岛国一区 | 男女视频免费 | 午夜免费小视频 | 久久一二区 | 亚洲国产精品一区二区久久 | 欧美亚洲视频在线观看 | 久久精品在线 | 日日干,天天干 | 久久精品黄 | 一区二区三区亚洲视频 | 久久av资源 | 欧美视频在线观看不卡 | 国产在线视频一区二区 | 亚洲一区二区三区国产 | 日韩精品视频在线 | 亚洲成人免费 | 成人欧美一区二区三区在线播放 | 北条麻妃99精品青青久久 | 亚洲欧美成人影院 | 在线 亚洲 欧美 | 欧美一区二区三区爽大粗免费 | 国产精品免费观看 | 国产精品九九久久99视频 | 欧美黄视频 | 毛片在线免费播放 | 成人亚洲| 欧美精品色 | 日韩在线一区二区 | 欧美日韩在线综合 | 欧洲成人午夜免费大片 | 国产一区二区精品久久 | 91社区影院 | 国产日韩欧美在线 | 日本成人黄色网址 | 久久久香蕉 | 91精品麻豆日日躁夜夜躁 | 亚洲国产高清在线 | 国产 亚洲 网红 主播 | 成人激情视频在线播放 | 欧美日韩中文字幕在线 | a级在线 | 国产精品91网站 | 伊人久麻豆社区 | av不卡电影在线观看 | 国产综合视频在线观看 | 黄网站色大毛片 | 一级篇 | 成年人免费网站 | 97超碰在线免费 | 欧美精品一区在线 | 欧一区二区| 黄色成人免费看 | 人干人人| 伊人免费观看视频 | 午夜激情视频在线观看 | 国产女人高潮视频在线观看 | av毛片免费 | 日韩国产 | 久久香蕉国产 | 黄色直接看 | 在线中文日韩 | 久久综合久久综合久久 | 免费成人毛片 | 成人在线播放 | 久久精品一区 | 暖暖视频日韩欧美在线观看 | 久久av网 | 狠狠操狠狠干 | 精品亚洲一区二区三区四区五区 | 国产在线a | 日本中文字幕电影 | 高清一区二区三区 | 欧美不卡视频一区发布 | 亚洲国产精品免费 | 性一交一乱一透一a级 | 成人亚洲天堂 | 99热精品视| 中文字幕成人 | 国产高清在线精品 | 精品一区二区三区在线观看 | 国产日产精品一区二区三区四区 | 久久精品久久综合 | 999在线观看视频 | 一二三区字幕免费观看av | 99爱视频| 国产免费一区二区 | 欧美14一18处毛片 | 成年无码av片在线 | 亚洲国产精品va在线看黑人 | 青青草网| 亚洲成人av一区二区三区 | 日本在线观看 | 欧美性久久 | 欧美日韩国产一区二区三区不卡 | 三级在线免费 | 国产在线观看一区二区三区 | 干干干操操操 | 91丁香婷婷综合久久欧美 | 日本精品中文字幕 | 深夜成人小视频 | 久久久国产精品视频 | 久久久久久91| 成人欧美一区二区三区在线观看 | 久久精品这里热有精品 | 成人av免费在线观看 | 欧美日韩一区二区三 | 精品无码三级在线观看视频 | 涩涩片影院 | 91精品久久久久久久久久入口 | 一本一本久久a久久精品综合妖精 | 日韩福利 | 久久久久国产 | 超碰天堂| 亚洲日韩欧美一区二区在线 | 日韩国产 | 国产精品国产精品国产 | 欧美日韩精品一区二区三区蜜桃 | 日韩一区在线视频 | 久日精品 | 亚洲精品一区久久久久久 | 久久aⅴ乱码一区二区三区 91综合网 | 日韩在线观看 | 亚洲视频在线播放 | 国产一区二区视频在线 | 精品国产第一国产综合精品 | 亚洲一区成人 | 久久精品一区二区三区四区 | 国产精品久久久一区二区 | 久久久涩 | 欧美久久久精品 | 黄色电影在线免费观看 | 欧美成人精品在线观看 | aⅴ色国产 欧美 | 精品日韩欧美一区二区在线播放 | 中文字幕在线观看1 | 性一级录像片片视频免费看 | 日韩视频精品在线 | 日本在线一区二区 | 国产日韩欧美一区二区在线观看 | 精品久久香蕉国产线看观看亚洲 | 久草免费在线 | 日韩在线欧美 | 丁香五月网久久综合 | a免费观看 | 日韩第一区| 国产色在线 | 热re99久久精品国产99热 | 99视频网站 | 久久加勒比| 久久久久香蕉视频 | 亚洲视频在线观看网站 | 亚洲视频自拍 | 免费黄色毛片视频 | 亚洲一区二区中文字幕 | 亚洲a网 | 在线观看第一页 | 午夜午夜精品一区二区三区文 | 国产精品一区二区三区在线 | 看欧美黄色录像 | 综合婷婷 | 中文字幕日本视频 | 日韩一区二区在线观看 | 欧美成人综合 | 亚洲一区欧美一区 | 四虎影院最新地址 | 成年人网站在线免费观看 | 粉色午夜视频 | 日韩精品专区 | 国产欧美一区二区三区在线看 | 国产精品视频一区二区三区 | 天天插天天干 | 久久国产精品影视 | 私人毛片免费高清视频 | 欧美偷偷操 | 成人黄色电影小说 | 国产91麻豆视频 | 亚洲欧美精品 | 久久毛片 | www.fefe66.com| 久久99深爱久久99精品 | 色视频网站免费看 | 久久久香蕉 | www.五月天婷婷 | 亚洲精品7777xxxx青睐 | 国产精品成人免费视频 | 色综合久久一区二区三区 | 欧美2区 | 亚洲视频免费观看 | av片免费看 | 久草资源在线视频 | 亚洲精品一区二区三区蜜桃久 | 免费v片| 欧美男人的天堂 | 久久久久久久国产精品 | 欧美成人精品一区二区三区 | 午夜草逼 | 在线视频 91 | 日本一区二区三区四区视频 | 成人亚洲一区二区 | 亚洲理论电影在线观看 | 午夜影院男女 | 浴室洗澡偷拍一区二区 | av网站在线播放 | 精品第一页| 亚洲精品视频大全 | 亚洲成人免费av | 久久99精品久久久久久久青青日本 |