精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

跟著小白一起學鴻蒙—一起學做Tetris(下)

系統 OpenHarmony
現在我們需要設置高度后增加一個Row的布局,并增加兩個Button控件,以下就是基礎的Hap的page文件:index.ets。

??想了解更多關于開源的內容,請訪問:???

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

簡介

接著《#跟著小白一起學鴻蒙# [番外]一起學做Tetris(上)》我們完善了頁面,增加了左右按鍵和之前方塊顯示,方塊消除。

#盲盒+碼# #跟著小白一起學鴻蒙# [番外]一起學做Tetris(下)-開源基礎軟件社區

開發

1、按鍵增加

之前我們布局一直是只有個Canvas控件,現在我們需要設置高度后增加一個Row的布局,并增加兩個Button控件,以下就是基礎的Hap的page文件:index.ets。

build() {
Column() {
Column() {
Canvas(this.context)
.width('100%')
.height('100%')
.onClick((ev: ClickEvent) => {
console.info("click!!")
this.doClick()
})
.onTouch((ev) => {
console.info("touch:"+ev.type.toString())
console.info("touch x:"+ev.touches[0].screenX.toString())
console.info("touch y:"+ev.touches[0].screenY.toString())
})
.onReady(() =>{
this.context.imageSmoothingEnabled = false
this.randomType()
this.drawall()
})
}
.height('92%')
.width('100%')
Row() {
Button() { //按鈕控件
Text('左')
.fontSize(20)
.fontWeight(FontWeight.Bold)
}.type(ButtonType.Capsule)
.width('20%')
.height('6%')
.backgroundColor('#0D9FFB')
.onClick(() => { //點擊事件
if (this.left > 0) {
this.moveAction -= 1
}
})
Button() { //按鈕控件
Text('右')
.fontSize(20)
.fontWeight(FontWeight.Bold)
}.type(ButtonType.Capsule)
.width('20%')
.height('6%')
.backgroundColor('#0D9FFB')
.onClick(() => { //點擊事件
if (this.rightX < 240) {
this.moveAction += 1
}
})
}
}
.width('100%')
.height('100%')
.backgroundColor("#cccccc")
}

2、游戲完善的說明

之前我們的游戲只有布局,方塊顯示和變形,在完善后我們增加了積累方塊的顯示,消除,計分,游戲結束判斷等。

(1)積累方塊顯示

drawBlockmap() {
let bs = this.blockSize
this.context.fillStyle = 'rgb(250,0,0)'
for (let i=0;i<23;i++) {
for (let j=0;j<9;j++) {
//是否有方塊
if (this.blockmap[i][j] == 1) {
let y = i * this.blockSize
let x = j * this.blockSize
this.context.fillRect(x, y, bs, bs)
this.context.rect(x, y, bs, bs)
console.info("drawBlockmap:"+x.toString()+":"+y.toString())
}
}
this.context.stroke()
console.info("drawBlockmap:"+this.storeBlock.length.toString())
}
}

因為都是畫布畫的,為了重繪已經存在的方塊,我們應用二維數組blockmap表示,值為1則有方塊,數組索引則表示繪制坐標位置:

(2)判斷是否到底還是到頂

checkBlockmap() {
if (this.storeBlock.length == 0) {
if (this.slotBottomY >= 660) {
return 1
}
} else {
let coords = this.curBlockShap
let startx = this.slotStartX + this.moveAction * this.blockSize
let starty = this.slotStartY + this.step * this.blockSize
for (let i=0;i<4;i++) {
let x = startx + coords[i][0]*this.blockSize
let y = starty + coords[i][1]*this.blockSize + this.blockSize
for (let k=0;k<22;k++) {
for (let l=0;l<9;l++) {
if (this.blockmap[k][l] == 1) {
let blocky = k * this.blockSize
let blockx = l * this.blockSize
//判斷是否到底
if ((x == blockx && y == blocky) || y > 660) {
//判斷是否到頂
if (y == 210) {
this.context.drawImage( this.gameoverImg,this.startX,this.startY,300,90)
//到頂回2
return 2
}
//到底回1
return 1
}
}
}
}
}
}
return 0
}

先判斷是否到底,到底的同時判斷是否到頂,如果到頂了就是滿了,如果只是到底則表明游戲可以繼續 。

(3)到底積累方塊

stackBlock() {
let block = []
let coords = this.curBlockShap
let startx = this.slotStartX + this.moveAction * this.blockSize
let starty = this.slotStartY + this.step * this.blockSize
for (let i=0;i<4;i++) {
let x = startx + coords[i][0]*this.blockSize
let y = starty + coords[i][1]*this.blockSize
console.info("stackBlock x:"+x.toString()+"y:"+y.toString())
let indexX = x/this.blockSize
let indexY = y/this.blockSize
this.blockmap[indexY][indexX] = 1
console.info("stackBlock:"+indexX+":"+indexY)
block.push([x,y])
}
this.storeBlock.push(block)

console.info("stackBlock:"+this.storeBlock.length.toString())
}

如果到底了,就用坐標計算出 索引,然后在blockmap里標識為1,說明此處有方塊,這樣方便后面的繪制的顯示。

(4)清除方塊

cleanBlockmap() {
//檢查是否一行滿了
let needMove = 0
for (let i=22;i>=0;i--) {
let linecnt = 0
for (let j = 8;j >= 0; j--) {
//是否有方塊
if (this.blockmap[i][j] == 1) {
linecnt += 1
}
}
if (linecnt == 9) {
//此行都是方塊,消除,計分
for (let j = 8;j >= 0; j--) {
this.blockmap[i][j] = 0
}
needMove += 1
this.score += 1
} else if (needMove > 0) {
for (let j = 8;j >= 0; j--) {
this.blockmap[i+needMove][j] = this.blockmap[i][j]
this.blockmap[i][j] = 0
}
}
}
}

二維數組的好處就是方便每行計數清除,然后從底向上再逐層替換。

(5)繪制每一步

drawStep() {
this.context.clearRect(0,0,this.context.width,this.context.height)
this.step += 1
this.drawBox()
this.drawBlockmap()
this.cleanBlockmap()
this.drawSideBlock()
this.drawBoxBlock()
this.drawScore()
let stepType = this.checkBlockmap()
if ( stepType == 1) {
this.stackBlock()
this.step = 0
this.randomType()
} else if (stepType == 2) {
this.state= 2
this.context.drawImage( this.gameoverImg,this.startX,this.startY,300,90)
}
}

繪制每一步其實就是重繪界面,包括如果游戲結束顯示game over。

3、游戲邏輯

簡單的小游戲主體游戲邏輯為:等待開始,開始,結束流程圖如下:

graph LR
timer開始 --> 方塊下落
timer開始 --> click[點擊]
click[點擊] --> 方塊變形
方塊下落 --> |落到底| 能消除 --> 計分 --> 堆積
方塊下落 --> |落到底| 不能消除 --> 堆積
堆積 --> |堆積到頂| 滿了 --> 游戲結束
堆積 --> |堆積到頂| 未滿 --> 方塊下落
doClick() {
if (this.state == 0) {
this.direction += 1
} else if (this.state == 2) {
this.state = 0
this.score = 0
this.storeBlock = []
this.initMap()
}
}

游戲結束后需要重新初始化內部數據。

4、完整邏輯

@Entry
@Component
struct Index {
@State message: string = 'Hello World'
private settings: RenderingContextSettings = new RenderingContextSettings(true);
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
private gameoverImg:ImageBitmap = new ImageBitmap("common/images/gameover.png")
private blockType: number = 0
private blockSize: number = 30
private blockShapBasic = [
[[0,0],[0,1],[0,2],[0,3]],
[[0,0],[0,1],[0,2],[1,2]],
[[0,0],[0,1],[1,1],[0,2]],
[[0,0],[0,1],[1,1],[1,2]],
[[0,0],[0,1],[1,0],[1,1]],
]
private blockShap = [
[[0,0],[0,1],[0,2],[0,3]],
[[0,0],[0,1],[0,2],[1,2]],
[[0,0],[0,1],[1,1],[0,2]],
[[0,0],[0,1],[1,1],[1,2]],
[[0,0],[0,1],[1,0],[1,1]],
]
private blockmap = [];
private curBlockShap = []
private storeBlock = []
private sideStartX = 300;
private sideStartY = 150;
private startX = 20
private startY = 300

private slotStartX = 120;
private slotStartY = 150;
private slotBottomY = 150;
private xleft = 0;
private rightX = 0;

private score = 0;
private step = 0;
private direction = 0;
private moveAction = 0;
private state = 0;

aboutToDisappear() {
}

aboutToAppear() {
this.initMap()
this.sleep(1000)
}

initMap() {
for (let i=0;i<23;i++) {
let item = []
for (let j=0;j<9;j++) {
item.push(0)
}
this.blockmap.push(item)
}
}

async sleep(ms: number) {
return new Promise((r) => {
setInterval(() => {
// console.log(this.message)
if (this.state == 0) {
this.drawStep()
}
}, ms)
})
}

doClick() {
if (this.state == 0) {
this.direction += 1
} else if (this.state == 2) {
this.state = 0
this.score = 0
this.storeBlock = []
this.initMap()
}
}

drawBox() {
this.context.lineWidth = 4
this.context.beginPath()
this.context.lineCap = 'butt'
this.context.moveTo(0, 100)
this.context.lineTo(270, 100)
this.context.moveTo(270, 100)
this.context.lineTo(270, 690)
this.context.moveTo(0, 690)
this.context.lineTo(270, 690)
}

setDirection() {
this.curBlockShap = this.blockShap[this.blockType]
if (this.direction > 0) {
for (let i=0;i<4;i++) {
let x = this.curBlockShap[i][0]
this.curBlockShap[i][0] = this.curBlockShap[i][1]
this.curBlockShap[i][1] = x
}
this.direction = 0
}
}

drawSideBlock() {
this.context.fillStyle = 'rgb(250,0,0)'
let bs = this.blockSize
let coords = this.blockShapBasic[this.blockType]
for (let i=0;i<4;i++) {
let x = this.sideStartX + coords[i][0]*this.blockSize
let y = this.sideStartY + coords[i][1]*this.blockSize
this.context.fillRect(x, y, bs, bs)
this.context.rect(x, y, bs, bs)
// console.info("x,y"+x.toString()+":"+y.toString())
}
this.context.stroke()
}

drawBoxBlock() {
let min = 690
let max = 0
this.setDirection()
this.context.fillStyle = 'rgb(250,0,0)'
let bs = this.blockSize
let coords = this.curBlockShap
let startx = this.slotStartX + this.moveAction * this.blockSize
let starty = this.slotStartY + this.step * this.blockSize
for (let i=0;i<4;i++) {
let x = startx + coords[i][0]*this.blockSize
let y = starty + coords[i][1]*this.blockSize
min = min > x ? x:min
max = max < x ? x:max
this.context.fillRect(x, y, bs, bs)
this.context.rect(x, y, bs, bs)
// console.info("x,y"+x.toString()+":"+y.toString())
this.slotBottomY = y
this.xleft = min
this.rightX = max
}
this.context.stroke()
// console.info("min,max"+min.toString()+":"+max.toString())
}

stackBlock() {
let block = []
let coords = this.curBlockShap
let startx = this.slotStartX + this.moveAction * this.blockSize
let starty = this.slotStartY + this.step * this.blockSize
for (let i=0;i<4;i++) {
let x = startx + coords[i][0]*this.blockSize
let y = starty + coords[i][1]*this.blockSize
console.info("stackBlock x:"+x.toString()+"y:"+y.toString())
let indexX = x/this.blockSize
let indexY = y/this.blockSize
this.blockmap[indexY][indexX] = 1
console.info("stackBlock:"+indexX+":"+indexY)
block.push([x,y])
}
this.storeBlock.push(block)

console.info("stackBlock:"+this.storeBlock.length.toString())
}

checkBlockmap() {
if (this.storeBlock.length == 0) {
if (this.slotBottomY >= 660) {
return 1
}
} else {
let coords = this.curBlockShap
let startx = this.slotStartX + this.moveAction * this.blockSize
let starty = this.slotStartY + this.step * this.blockSize
for (let i=0;i<4;i++) {
let x = startx + coords[i][0]*this.blockSize
let y = starty + coords[i][1]*this.blockSize + this.blockSize
for (let k=0;k<22;k++) {
for (let l=0;l<9;l++) {
if (this.blockmap[k][l] == 1) {
let blocky = k * this.blockSize
let blockx = l * this.blockSize
//判斷是否到底
if ((x == blockx && y == blocky) || y > 660) {
//判斷是否到頂
if (y == 210) {
this.context.drawImage( this.gameoverImg,this.startX,this.startY,300,90)
//到頂回2
return 2
}
//到底回1
return 1
}
}
}
}
}
}
return 0
}

cleanBlockmap() {
//檢查是否一行滿了
let needMove = 0
for (let i=22;i>=0;i--) {
let linecnt = 0
for (let j = 8;j >= 0; j--) {
//是否有方塊
if (this.blockmap[i][j] == 1) {
linecnt += 1
}
}
if (linecnt == 9) {
//此行都是方塊,消除,計分
for (let j = 8;j >= 0; j--) {
this.blockmap[i][j] = 0
}
needMove += 1
this.score += 1
} else if (needMove > 0) {
for (let j = 8;j >= 0; j--) {
this.blockmap[i+needMove][j] = this.blockmap[i][j]
this.blockmap[i][j] = 0
}
}
}
}

drawBlockmap() {
let bs = this.blockSize
this.context.fillStyle = 'rgb(250,0,0)'
for (let i=0;i<23;i++) {
for (let j=0;j<9;j++) {
//是否有方塊
if (this.blockmap[i][j] == 1) {
let y = i * this.blockSize
let x = j * this.blockSize
this.context.fillRect(x, y, bs, bs)
this.context.rect(x, y, bs, bs)
console.info("drawBlockmap:"+x.toString()+":"+y.toString())
}
}
this.context.stroke()
console.info("drawBlockmap:"+this.storeBlock.length.toString())
}
}

drawScore() {
this.context.fillStyle = 'rgb(0,0,0)'
this.context.font = '80px sans-serif'
this.context.fillText("Score:"+this.score.toString(), 20, 140)
}

randomType() {
this.blockType = Math.floor(Math.random()*5)
console.info("blocktype:"+this.blockType.toString())
}

drawStep() {
this.context.clearRect(0,0,this.context.width,this.context.height)
this.step += 1
this.drawBox()
this.drawBlockmap()
this.cleanBlockmap()
this.drawSideBlock()
this.drawBoxBlock()
this.drawScore()
let stepType = this.checkBlockmap()
if ( stepType == 1) {
this.stackBlock()
this.step = 0
this.randomType()
} else if (stepType == 2) {
this.state= 2
this.context.drawImage( this.gameoverImg,this.startX,this.startY,300,90)
}
}

drawall() {
this.drawBox()
this.drawSideBlock()
this.drawBoxBlock()
this.drawScore()
}

build() {
Column() {
Column() {
Canvas(this.context)
.width('100%')
.height('100%')
.onClick((ev: ClickEvent) => {
console.info("click!!")
this.doClick()
})
.onTouch((ev) => {
console.info("touch:"+ev.type.toString())
console.info("touch x:"+ev.touches[0].screenX.toString())
console.info("touch y:"+ev.touches[0].screenY.toString())
})

.onReady(() =>{
this.context.imageSmoothingEnabled = false
this.randomType()
this.drawall()
})
}
.height('92%')
.width('100%')
Row() {
Button() { //按鈕控件
Text('左')
.fontSize(20)
.fontWeight(FontWeight.Bold)
}.type(ButtonType.Capsule)
.width('20%')
.height('6%')
.backgroundColor('#0D9FFB')
.onClick(() => { //點擊事件
if (this.xleft > 0) {
this.moveAction -= 1
}
})
Button() { //按鈕控件
Text('右')
.fontSize(20)
.fontWeight(FontWeight.Bold)
}.type(ButtonType.Capsule)
.width('20%')
.height('6%')
.backgroundColor('#0D9FFB')
.onClick(() => { //點擊事件
if (this.rightX < 240) {
this.moveAction += 1
}
})
}

}
.width('100%')
.height('100%')
.backgroundColor("#cccccc")
}
}

遺留問題:

  1. 有bug,方塊變形不完整。
  2. 可實現網絡對戰(分布式對戰)。

總結

本文主要介紹了小游戲的開發,畫布功能的使用,游戲邏輯,分布式。

??想了解更多關于開源的內容,請訪問:???

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??。

責任編輯:jianghua 來源: 51CTO開源基礎軟件社區
相關推薦

2022-11-29 16:35:02

Tetris鴻蒙

2022-11-14 17:01:34

游戲開發畫布功能

2023-03-30 09:32:27

2023-02-27 16:30:32

鴻蒙開源協議分析

2023-03-30 09:19:54

SELinux安全子系統

2022-08-19 19:02:20

開源鴻蒙操作系統

2023-04-04 09:24:11

鴻蒙HiDumper

2022-10-10 14:47:04

藍牙應用鴻蒙

2023-01-03 15:09:10

鴻蒙常用工具

2022-12-06 15:39:16

鴻蒙主干代碼

2023-03-15 16:19:03

BinderIPC工具

2022-11-24 14:34:41

Hap程序鴻蒙

2022-10-20 16:40:16

JS應用控制LED鴻蒙

2022-10-09 15:05:50

NAPI框架鴻蒙

2022-09-28 13:57:41

鴻蒙開源

2023-04-06 09:18:52

鴻蒙AVPlayerAVRecorder

2023-02-24 16:02:45

WebSocket網絡通訊協議

2022-11-28 15:42:39

分布式軟總線鴻蒙

2022-12-09 15:34:38

2022-12-05 15:02:14

鴻蒙用戶鑒權
點贊
收藏

51CTO技術棧公眾號

丁香花在线影院观看在线播放| 中文字幕久久精品| 男人c女人视频| av天堂一区二区三区| 国产精品激情电影| 精品国产成人在线影院| 成年人视频观看| 国产一二三区在线| 另类小说一区二区三区| 免费99精品国产自在在线| 美女被爆操网站| 黄视频网站在线观看| 久久亚洲精华国产精华液 | 97婷婷涩涩精品一区| 久久精品老司机| 欧美国产大片| 国产精品久久夜| 99精彩视频在线观看免费| 日韩三级在线观看视频| 99精品在免费线中文字幕网站一区| 精品久久香蕉国产线看观看gif| 欧美中文娱乐网| 亚洲天堂中文在线| 影音先锋在线一区| 中文字幕在线看视频国产欧美| 日本中文字幕影院| 怡红院在线观看| 久久只精品国产| 95av在线视频| 中文字幕在线天堂| 国产精品va| 亚洲全黄一级网站| 久久久久久无码精品人妻一区二区| 在线观看v片| 亚洲欧美区自拍先锋| 久久久精彩视频| 国产又粗又长又黄| 免费亚洲一区| 久久99久久99精品免观看粉嫩| 亚洲av无码一区二区三区人| 午夜电影一区| 欧美日韩另类国产亚洲欧美一级| 男人插女人视频在线观看| 国产剧情在线观看| av在线综合网| 91美女片黄在线观| 99成人精品视频| 国产欧美二区| 欧美日本黄视频| 欧美日韩国产一二三区| 亚洲精品进入| 欧美videos大乳护士334| 尤物网站在线看| 亚洲久草在线| 这里只有精品免费| 激情图片中文字幕| 国产电影一区二区| 日韩一区二区三区视频在线| 午夜影院免费观看视频| 欧美特黄不卡| 精品盗摄一区二区三区| 中文字幕免费高清视频| 欧美性生活一级片| 日韩av在线高清| 成人网站免费观看| 国产一卡不卡| 色综合伊人色综合网| jizz日本在线播放| 天天综合国产| 九九热这里只有精品免费看| 欧美日韩精品在线观看视频| 国产精品啊v在线| 午夜精品视频在线| 亚洲午夜18毛片在线看| 久久久久久久波多野高潮日日| 国产极品jizzhd欧美| 午夜久久久久久久久久影院| 日韩黄色免费网站| 国产日韩亚洲欧美| a天堂在线视频| 成人午夜伦理影院| 欧美 日韩 国产在线| 国产系列电影在线播放网址| 国产精品久久久久婷婷二区次| 91制片厂免费观看| 7777kkk亚洲综合欧美网站| 欧美午夜女人视频在线| 奇米影视四色在线| av日韩在线播放| 亚洲欧美激情视频| 中文字幕av播放| 国产精品呻吟| 91亚洲精品久久久| 五月天久久久久久| 中文字幕亚洲视频| 99久久国产综合精品五月天喷水| 午夜精品成人av| 欧美一级夜夜爽| 亚洲第一香蕉网| 1024精品久久久久久久久| 久久久久久一区二区三区 | 成视频免费观看在线看| 婷婷综合久久一区二区三区| 一个色综合久久| 牛牛视频精品一区二区不卡| 少妇av一区二区三区| 97超碰人人干| 国产精品一色哟哟哟| 欧美高清视频一区| 怡红院红怡院欧美aⅴ怡春院| 欧美性色xo影院| 深夜福利网站在线观看| 国产一区二区三区日韩精品 | 51精品免费网站| 国产美女诱惑一区二区| 91沈先生在线观看| 久久精品蜜桃| 亚洲成人精品影院| 亚洲一区二区三区四区精品| 精品久久久久久久| 96精品视频在线| 国产青青草视频| 国产亚洲午夜高清国产拍精品 | 免费视频91蜜桃| 亚洲电影成人| 成人免费福利在线| 成人三级黄色免费网站| 欧美日韩在线影院| 日本精品一二三区| 欧美一区二区三区久久精品茉莉花| 国产成人av网址| 亚洲 欧美 激情 另类| 亚洲综合一区在线| 色欲无码人妻久久精品| 99久久夜色精品国产亚洲96| 国产精品美女av| 国产天堂素人系列在线视频| 精品女厕一区二区三区| 在线xxxxx| 狠狠久久婷婷| 99久久99久久| 日本孕妇大胆孕交无码| 日韩欧美激情在线| 欧美黄色aaa| 精品亚洲成a人| 一区二区三区四区五区视频 | 婷婷亚洲五月| 国产免费亚洲高清| 色网站免费在线观看| 欧美体内she精视频| 日本人亚洲人jjzzjjz| 日韩avvvv在线播放| 日韩一区国产在线观看| 91成人抖音| 中文精品99久久国产香蕉| 国产女优在线播放| 国产精品国产三级国产普通话蜜臀 | 成人激情黄色网| 免费黄色电影在线观看| 91精品国产综合久久久久久久久久| 波多野结衣欲乱| 久久精品国产99国产精品| 日日噜噜噜夜夜爽爽| 99久久这里有精品| 欧美肥婆姓交大片| 殴美一级特黄aaaaaa| 激情成人中文字幕| 亚洲国产天堂av| 麻豆久久久久久久| 日韩 欧美 自拍| 99精品在免费线中文字幕网站一区 | 久久久91麻豆精品国产一区| 最近免费中文字幕视频2019| 国产一区二区自拍视频| 中文字幕不卡的av| 国产一级片中文字幕| 悠悠资源网久久精品| 欧美激情论坛| 欧美xxxx网站| 欧美日韩国产999| 午夜影院免费体验区| 日韩欧美在线国产| 日韩激情小视频| 成人国产免费视频| 日韩免费高清在线| 欧美1区视频| 久久久久欧美| 成人国产精品久久| 91精品国产电影| av中文在线| 精品电影一区二区| 久久这里只有精品9| 亚洲卡通动漫在线| 久久久精品人妻无码专区| 韩国成人在线视频| 日韩国产欧美亚洲| 天天揉久久久久亚洲精品| 国产欧美综合精品一区二区| 自拍偷自拍亚洲精品被多人伦好爽| 久久精品夜夜夜夜夜久久| 五十路在线视频| 欧美精品1区2区3区| 日韩精品1区2区| 亚洲欧美二区三区| 我和岳m愉情xxxⅹ视频| 国产激情一区二区三区四区| 亚洲一区二区蜜桃| 日韩午夜av在线| 国产免费一区二区三区四在线播放| 清纯唯美亚洲经典中文字幕| 91在线免费观看网站| 高潮一区二区| 欧美激情亚洲激情| 日本黄色片在线观看| 日韩精品免费观看| 亚洲手机在线观看| 色先锋久久av资源部| 久久久久久天堂| 中文字幕一区二区三区av| 欧美做受xxxxxⅹ性视频| 丁香五精品蜜臀久久久久99网站 | 国产精品中文字幕欧美| 女性隐私黄www网站视频| 欧美日韩一区二区国产| 亚洲欧美国产不卡| 香蕉视频一区二区三区| 国产精品我不卡| 欧美中文高清| 成人精品视频99在线观看免费| 欧亚一区二区| 日本精品视频在线观看| 黄色污网站在线观看| 色综合色综合网色综合| 激情成人四房播| www.久久色.com| 1024国产在线| 在线日韩第一页| 久久精品蜜桃| 亚洲香蕉成人av网站在线观看| 完全免费av在线播放| 亚洲缚视频在线观看| 99热这里只有精品5| 欧美日韩国产另类不卡| 亚洲午夜无码久久久久| 欧美在线视频全部完| 一级黄色在线观看| 欧美视频中文字幕| 国产成人av免费| 欧美日韩一区二区在线观看视频| 成人一二三四区| 欧美视频自拍偷拍| 91高潮大合集爽到抽搐| 91精品欧美一区二区三区综合在 | 涩涩涩视频在线观看| 91精品国产91久久久久久最新 | 四虎精品在永久在线观看| 亚洲国产精品va在线看黑人动漫| 天天操天天操天天| 日韩av在线免费观看一区| 三级在线播放| 永久555www成人免费| 午夜视频成人| 不卡中文字幕av| 青青青国内视频在线观看软件| 欧美激情喷水视频| 日韩激情电影免费看| 热99精品里视频精品| 少妇精品视频一区二区免费看| 国产精品久久久久久亚洲调教 | 日韩av毛片在线观看| 亚洲视频一区二区免费在线观看 | 久久在线播放| 欧美xxxx吸乳| 亚洲大胆在线| 成人免费xxxxx在线视频| 久久成人精品无人区| 一区二区三区人妻| 91亚洲精品久久久蜜桃网站| 日本一级免费视频| 亚洲视频一区二区在线| 精品一区免费观看| 日本高清不卡视频| 国产又大又黄的视频| 亚洲第一精品自拍| 第一视频专区在线| 欧美人交a欧美精品| 日韩欧美一中文字暮专区| 国产精品久久久999| 婷婷视频一区二区三区| 欧美日韩系列| 女人天堂亚洲aⅴ在线观看| 99999精品视频| 国产在线国偷精品免费看| 黄色网址在线视频| 国产精品剧情在线亚洲| 日本午夜精品理论片a级app发布| 在线观看91视频| 蜜桃在线一区二区| 在线视频国产日韩| 不卡av免费观看| 国产日韩欧美在线视频观看| 日韩精品免费一区二区夜夜嗨| 一区二区av| 午夜一区在线| wwwxxxx在线观看| 欧美国产精品久久| www.av麻豆| 日韩一区二区三区免费看 | 国产极品模特精品一二| 亚洲欧洲精品一区二区三区波多野1战4| 国产精品99一区二区| mm131国产精品| 久久久99久久精品欧美| 久久亚洲精品大全| 884aa四虎影成人精品一区| 国产永久免费高清在线观看视频| 欧美精品videosex性欧美| 日韩免费在线电影| 日本视频精品一区| 亚洲美女色禁图| 中文字幕乱妇无码av在线| 中文字幕免费不卡| 午夜婷婷在线观看| 亚洲国产精品字幕| 美女网站视频在线| 亚洲精品免费av| 日韩欧美在线中字| 久久久久久久少妇| 久久综合色综合88| 日韩美女一级片| 日韩精品最新网址| 激情在线小视频| 成人欧美一区二区三区黑人孕妇 | www.一区二区.com| 韩国理伦片一区二区三区在线播放| 亚洲自拍偷拍图| 色婷婷av一区二区| 欧美孕妇性xxxⅹ精品hd| 性欧美视频videos6一9| 999在线精品| 日韩黄色片在线| 国产999精品久久久久久绿帽| 杨钰莹一级淫片aaaaaa播放| 欧美日韩成人综合在线一区二区| 国产在线91| 国产精品高潮呻吟久久av无限 | 亚洲社区在线观看| 电影一区二区三| 日韩亚洲一区在线播放| 蜜桃av噜噜一区二区三区小说| 阿v天堂2014| 欧美日韩你懂得| 黄色av网站在线播放| 91在线|亚洲| 亚洲午夜精品久久久久久app| 成人做爰www看视频软件| 亚洲成av人片一区二区三区| 天堂网在线播放| 日本久久亚洲电影| 精品国产精品| 在线黄色免费看| 亚洲男人的天堂在线观看| 国产wwwxxx| 亚洲91av视频| 国产精品一区高清| 视频二区在线播放| 一区二区三区四区激情 | 欧洲美女精品免费观看视频| 手机成人av在线| 国产精品1区二区.| 久久国产精品系列| 国产一区二区三区中文 | 国产精品一区二区a| 国产精品亚洲综合色区韩国| 亚洲一区二区自偷自拍| 欧美高清性hdvideosex| 国产蜜臀av在线播放| 久久波多野结衣| 免费欧美日韩国产三级电影| 国产黄色的视频| 日韩激情在线视频| 成人午夜一级| 2021国产视频| 91在线视频观看| 91中文字幕在线播放| 久久久视频精品| 精品亚洲成人| 无码人妻一区二区三区一| 一本一道综合狠狠老| 青青影院在线观看| 国产在线观看一区| 蜜臀久久99精品久久久画质超高清| 欧美成人精品一区二区免费看片 | 欧美ab在线视频| 国产精品亚洲无码| 日韩一区和二区| 怡红院成人在线| 欧美做暖暖视频| 中文字幕av一区 二区| 日本精品久久久久|