成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

瘋狂iOS講義之瘋狂打飛機(1)

移動開發 iOS
本次我們將帶領大家手動完成一個簡單但功能完整的打飛機游戲,實現飛機飛行、飛機碰撞、發射子彈、敵機發射大子彈、背景音樂、子彈音效、分數統計、菜單管理等功能。

本次我們將帶領大家手動完成一個簡單但功能完整的打飛機游戲,實現飛機飛行、飛機碰撞、發射子彈、敵機發射大子彈、背景音樂、子彈音效、分數統計、菜單管理等功能。它雖然不會為你贏得什么獎項,但是可以總結前面所學的所有知識,幫助大家更好地掌握cocos2d基本對象的使用,同時體驗cocos2d的強大以及易用性。

一、開始前的準備工作

首先打開Xcode,使用cocos2d iOS模板新建一個項目,命名為“AirfightGame”,然后選擇一個目錄,單擊“Create”按鈕。為cocos2d項目的源代碼添加-fno-objc-arc選項讓項目支持ARC。

接下來,將所需要的資源文件,包括圖片和聲音拖到項目的“Resources”組。在游戲開發當中,通常都會使用精靈表單來優化游戲性能,在這個小游戲當中,雖然這種性能優化并不會有特別明顯的效果,但是建議大家以后開發游戲時都使用精靈表單來提高游戲性能。使用Zwoptex將所有圖片制作成精靈表單,生成對應的airfightSheet.png和airfightSheet.plist文件,并將這兩個文件拖到項目的“Resources”組。

二、添加游戲菜單項功能

現在,我們來為游戲添加一個菜單設置功能,在這里可以完成開始游戲、游戲設置、退出游戲等操作。步驟如下。

① 選擇“AirfightGame”組并單擊右鍵,選擇“New File”,在左邊欄中選擇“cocos2d v2.x”模板,在右邊的模板類中選擇“CCNode class”模板類,“Subclass of”選擇“CCLayer”,然后單擊“Next”按鈕。命名為“MenuLayer”,然后單擊“Create”按鈕。

MenuLayer繼承自CCLayer,提供一個類方法scene供CCDirector對象調用。該類的作用是顯示一個菜單場景,讓用戶選擇。

打開MenuLayer.m文件,實現代碼如下。

程序清單:codes/13/13.14/AirfightGame/AirfightGame/MenuLayer.m

  1. -(id) init 
  2.     { 
  3.         if( (self=[super init]) ) { 
  4.             CGSize winSize = [[CCDirector sharedDirector] winSize]; 
  5.             // 創建“開始游戲”標簽,當觸碰該標簽時,調用startGame:方法 
  6.             CCMenuItemFont* startItem = [CCMenuItemFont itemWithString:@"開始游戲" 
  7.                 target:self selector:@selector(startGame:)]; 
  8.             startItem.position=ccp(winSize.width/2, winSize.height*0.6); 
  9.             // 創建“游戲設置”標簽,當觸碰該標簽時,調用setting:方法 
  10.             CCMenuItemFont* settingItem = [CCMenuItemFont itemWithString:@"游戲設置" 
  11.                 target:self selector:@selector(setting:)]; 
  12.             // 設置“游戲設置”標簽位置 
  13.             settingItem.position=ccp(winSize.width/2, winSize.height*0.4); 
  14.             // 創建控制菜單,并將兩個標簽添加進去 
  15.             CCMenu* menu = [CCMenu menuWithItems:startItem,settingItem, nil]; 
  16.             menu.position = CGPointZero; 
  17.             [self addChild:menu]; 
  18.         } 
  19.         return self; 
  20.     } 

init方法比較簡單,創建了兩個CCMenuItemFont,選擇標簽時會調用對應的startGame:和setting:方法,并將它們添加到CCMenu當中,再將CCMenu添加為當前層的子節點。

添加startGame:setting:兩個方法,實現代碼如下(程序清單同上):

  1. -(void) startGame:(id)sender{ 
  2.         // 切換到PreloadLayer場景 
  3.         CCTransitionSlideInL* transitionScene = [CCTransitionSlideInL 
  4.             transitionWithDuration:2.0 scene:[PreloadLayer scene]]; 
  5.         [[CCDirector sharedDirector] replaceScene:transitionScene]; 
  6.     } 

startGame:方法非常簡單,當用戶選擇“開始游戲”標簽時,場景切換到PreloadLayer,在下一節中將重點介紹PreloadLayer(程序清單同上)。

  1. -(void) setting:(id)sender{ 
  2.         // 切換到SettingLayer場景 
  3.         CCTransitionSlideInL* transitionScene = [CCTransitionSlideInL 
  4.             transitionWithDuration:2.0 scene:[SettingLayer scene]]; 
  5.         [[CCDirector sharedDirector] replaceScene:transitionScene]; 
  6.     } 

當用戶選擇“游戲設置”標簽時,場景切換到SettingLayer,進行游戲設置。

同上面的步驟一樣,使用“cocos2d v2.x”模板創建一個類并命名為“SettingLayer”,繼承自CCLayer。該類的實現代碼如下。

程序清單:codes/13/13.14/AirfightGame/AirfightGame/SettingLayer.m

  1. -(id) init 
  2.     { 
  3.         if( (self=[super init]) ) { 
  4.             CGSize winSize = [[CCDirector sharedDirector] winSize]; 
  5.             // 提示菜單項 
  6.             CCMenuItemFont* musicItem = [CCMenuItemFont itemWithString:@"背景音樂:"]; 
  7.             musicItem.position = ccp(winSize.width*0.4, winSize.height*0.6); 
  8.             // 創建“開”和“關”菜單項 
  9.             CCMenuItemFont* musicOn = [CCMenuItemFont itemWithString:@"開"]; 
  10.             CCMenuItemFont* musicOff = [CCMenuItemFont itemWithString:@"關"]; 
  11.             // CCMenuItemToggle,默認顯示“開”。開=0,關=1 
  12.             CCMenuItemToggle* musicToggle = [CCMenuItemToggle itemWithTarget:self 
  13.                 selector:@selector(change:) items:musicOff,musicOn, nil]; 
  14.             musicToggle.position = ccp(winSize.width*0.6, winSize.height*0.6); 
  15.             // 創建“返回主菜單“菜單項 
  16.             CCMenuItemFont* returnItem = [CCMenuItemFont itemWithString:@"返回主菜單" 
  17.                 target:self selector:@selector(backToMainLayer:)]; 
  18.             returnItem.position = ccp(winSize.width/2, winSize.height*0.4); 
  19.             // 創建控制菜單,并將3個標簽添加進去 
  20.             CCMenu* menu = [CCMenu menuWithItems:musicItem,musicToggle,returnItem, nil]; 
  21.             menu.position = CGPointZero; 
  22.             [self addChild:menu]; 
  23.             // NSUserDefaults用戶首選項可以用來保存用戶在操作應用的過程中設置的首選項。 
  24.             NSUserDefaults* userDef = [NSUserDefaults standardUserDefaults]; 
  25.             // 如果Bool為No,則顯示1=關 
  26.             if(![userDef boolForKey:@"music"]){ 
  27.                 musicToggle.selectedIndex = 1; 
  28.             } 
  29.         } 
  30.         return self; 
  31.     } 
  32.     -(void) change:(id)sender{ 
  33.         // 判斷mute(靜音)屬性,根據屬性狀態進行切換 
  34.         if([CDAudioManager sharedManager].mute == TRUE){ 
  35.             [CDAudioManager sharedManager].mute = FALSE; 
  36.         }else
  37.             [CDAudioManager sharedManager].mute = TRUE; 
  38.         } 
  39.         NSUserDefaults* userDef = [NSUserDefaults standardUserDefaults]; 
  40.         CCMenuItemToggle* tooggle = (CCMenuItemToggle*)sender; 
  41.         // 關=1,設置Bool為NO 
  42.         if(tooggle.selectedIndex == 1){ 
  43.             [userDef setBool:NO forKey:@"music"]; 
  44.         }else
  45.             [userDef setBool:YES forKey:@"music"]; 
  46.         } 
  47.     } 
  48.     // 定義一個CCTransitionSlideInL場景切換效果,并使用CCDirector單例對象來切換場景 
  49.     -(void) backToMainLayer:(id)sender{ 
  50.         CCTransitionSlideInL* transitionScene = 
  51.             [CCTransitionSlideInL transitionWithDuration:2.0 scene:[MenuLayer scene]]; 
  52.         [[CCDirector sharedDirector] replaceScene:transitionScene]; 
  53.     } 

SettingLayer類代碼在13.13.2節中已經詳細介紹過,這里不再贅述。

修改IntroLayer.m文件

IntroLayer默認加載HelloWorldLayer,但此時我們不再使用HelloWorldLayer作為應用的第一個場景,而是使用MenuLayer作為應用的第一個場景,因此需要修改IntroLayer,將IntroLayer改為加載MenuLayer場景修改如下。

IntroLayer.m文件的頂部添加所包含的頭文件:

  1. #import "MenuLayer.h" 

修改-(void) makeTransition:(ccTime)dt方法,將該方法改成下面的代碼。

程序清單:codes/13/13.14/AirfightGame/AirfightGame/IntroLayer.m

  1. -(void) makeTransition:(ccTime)dt 
  2.     { 
  3.         [[CCDirector sharedDirector] replaceScene: 
  4.             [CCTransitionFade transitionWithDuration:1.0 
  5.             scene:[MenuLayer scene] withColor:ccWHITE]]; 
  6.     } 

 

編譯并運行游戲,運行時模擬器顯示效果如圖13.58所示。

三、預加載游戲資源

在真實項目當中,在游戲開始前,都會預先加載游戲所需要的圖片、背景音樂、音效等資源,這里介紹如何制作一個PreloadLayer來預加載游戲資源。

1. 創建PreloadLayer

選擇“AirfightGame”組并單擊右鍵,選擇“New File”,在左邊欄中選擇“cocos2d v2.x”模板,在右邊的模板類中選擇“CCNode class”模板類,“Subclass of”選擇“CCLayer”,然后單擊“Next”按鈕。命名為“PreloadLayer”,然后單擊“Create”按鈕。

PreloadLayer繼承自CCLayer,提供一個類方法sceneCCDirector對象調用。該類的作用是預加載游戲資源,在加載過程中會顯示一個進度條,進度條全部顯示完成代表加載完畢,加載完畢后顯示游戲主場景。

首先打開PreloadLayer.m文件,先在文件上方定義一個私有的Category。實現代碼如下。

程序清單:codes/13/13.14/AirfightGame/AirfightGame/PreloadLayer.m

  1. /** 
  2.      定義一個私有的Category,為了不讓API暴露給客戶端 
  3.      將一些類內部所使用的方法和變量放在私有的擴展里面,而不是直接聲明在頭文件當中 
  4.      */ 
  5.     @interface PreloadLayer () 
  6.     - (void) loadMusics:(NSArray *) musicFiles;  // 加載背景音樂 
  7.     - (void) loadSounds:(NSArray *) soundClips;  // 加載游戲音效 
  8.     - (void) loadSpriteSheets:(NSArray *) spriteSheets;  // 加載精靈表單 
  9.     - (void) loadingComplete;  // 資源全部加載完成,切換到另一個游戲場景 
  10.     - (void) progressUpdate;  // 更新游戲進度條,計算何時加載完成 
  11.     @end;

這里定義了一系列的load方法,每個方法接收一個NSArray數組作為參數。這些參數代表一些具體資源的文件名,參數值會從一個配置文件中讀取出來,該配置文件在之后的代碼實現時會給出。

然后定義3個變量,其中sourceCount用來保存游戲需要加載的資源總數;progress用于顯示進度條,CCProgressTimer 類是cocos2d中對進度條的一個封裝,用來實現各種進度條功能,非常方便,之后我們還會使用該類來實現游戲的自定義血條量;progressInterval代表進度條更新的次數。實現代碼如下

  1. @implementation PreloadLayer 
  2.     // 用來保存游戲需要加載的資源總數 
  3.     int sourceCount; 
  4.     // 顯示進度條的成員變量 
  5.     CCProgressTimer* progress; 
  6.     // 代表進度條更新的次數 
  7.     float progressInterval; 

2. PreloadLayer的具體實現

創建一個preloadResources.plist文件,該文件用于保存項目需要的所有資源文件,文件內容如圖13.59所示。


可以看出,加載的音效是b0.mp3,精靈表單是airfightSheet.plist,背景音樂是s3.wav

PreloadLayer.m文件中添加代碼。實現代碼如下。

程序清單:codes/13/13.14/AirfightGame/AirfightGame/PreloadLayer.m

  1. + (CCScene *) scene 
  2. 002 { 
  3. 003     CCScene* scene = [CCScene node]; 
  4. 004     PreloadLayer* layer = [PreloadLayer node]; 
  5. 005     [scene addChild:layer]; 
  6. 006     return scene; 
  7. 007 } 
  8. 008 - (id) init{ 
  9. 009     if((self = [super init])){ 
  10. 010         // 獲取屏幕大小 
  11. 011         CGSize winSize = [[CCDirector sharedDirector] winSize]; 
  12. 012         // 創建一個進度條精靈 
  13. 013         CCSprite* barSprite = [CCSprite spriteWithFile:@"progressbar.png"]; 
  14. 014         // 初始化一個CCProgressTimer進度條對象 
  15. 015         progress = [CCProgressTimer progressWithSprite:barSprite]; 
  16. 016         // setPercentage:0.0f,表示并未加載任何資源,表現在屏幕上就是什么也看不見 
  17. 017         [progress setPercentage:0.0f]; 
  18. 018         // 由于圖片大小關系,把scale設置成0.5,即縮小一半 
  19. 019         progress.scale = 0.5; 
  20. 020         // 設置進度條動畫的起始位置,默認在圖片的中點 
  21. 021         // 如果想要顯示從左到右的一個動畫效果,必須改成(0,y) 
  22. 022         progress.midpoint = ccp(0,0.5); 
  23. 023         // barChangeRate表示是否改變水平或者垂直方向的比例,設置成1表示改變,0表示不改變 
  24. 024         progress.barChangeRate = ccp(1,0); 
  25. 025         // 本例制作一個從左至右的水平進度條,所以midpoint應該是(0,0.5) 
  26. 026         // 因為x方向需要改變,而y方向不需要改變,所以barChangeRate = ccp(1, 0) 
  27. 027         // kCCProgressTimerTypeBar表示為條形進度條 
  28. 028         progress.type = kCCProgressTimerTypeBar; 
  29. 029         // 設置position在中心點 
  30. 030         [progress setPosition:ccp(winSize.width/2,winSize.height/2)]; 
  31. 031         // 將進度條添加為當前層的子節點 
  32. 032         [self addChild:progress]; 
  33. 033     } 
  34. 034     return self; 
  35. 035 } 
  36. 036 - (void) onEnterTransitionDidFinish{ 
  37. 037     [super onEnterTransitionDidFinish]; 
  38. 038     // 加載preloadResources.plist配置文件 
  39. 039     NSString* path = [[CCFileUtils sharedFileUtils] 
  40. 040         fullPathFromRelativePath:@"preloadResources.plist"]; 
  41. 041     // 讀取配置文件中的游戲資源名稱列表,返回一個NSDictionary對象 
  42. 042     NSDictionary* resources = [NSDictionary dictionaryWithContentsOfFile:path]; 
  43. 043     // 通過key值取出每種不同類型資源的數組 
  44. 044     NSArray *spriteSheets = [resources objectForKey:@"SpriteSheets"]; 
  45. 045     NSArray *sounds = [resources objectForKey:@"Sounds"]; 
  46. 046     NSArray *musics = [resources objectForKey:@"Musics"]; 
  47. 047     // 調用數組的count方法得到總共需要加載的資源數量 
  48. 048     sourceCount = [spriteSheets count]  + [sounds count] + [musics count]; 
  49. 049     // 設置進度條更新次數=100/需要加載的資源數量 
  50. 050     progressInterval = 100.0 / (float) sourceCount; 
  51. 051     // 調用performSelectorOnMainThread在主線程上依次加載每種類型的游戲資源 
  52. 052     // waitUntilDone的值為YES能保證所有的資源按照序列依次加載 
  53. 053     if(sounds){ 
  54. 054         [self performSelectorOnMainThread:@selector(loadSounds:) 
  55. 055             withObject:sounds waitUntilDone:YES]; 
  56. 056     } 
  57. 057     if(spriteSheets){ 
  58. 058         [self performSelectorOnMainThread:@selector(loadSpriteSheets:) 
  59. 059             withObject:spriteSheets waitUntilDone:YES]; 
  60. 060     } 
  61. 061     if(musics){ 
  62. 062         [self performSelectorOnMainThread:@selector(loadMusic:) 
  63. 063             withObject:musics waitUntilDone:YES]; 
  64. 064     } 
  65. 065 } 
  66. 066 // 加載背景音樂 
  67. 067 - (void) loadMusics:(NSArray *)musicFiles{ 
  68. 068     for (NSString *music in musicFiles) { 
  69. 069         [[SimpleAudioEngine sharedEngine] preloadBackgroundMusic:music]; 
  70. 070         [self progressUpdate]; 
  71. 071     } 
  72. 072 } 
  73. 073 // 加載聲音 
  74. 074 - (void) loadSounds:(NSArray *)soundClips{ 
  75. 075     for (NSString *soundClip in soundClips) { 
  76. 076         [[SimpleAudioEngine sharedEngine] preloadEffect:soundClip]; 
  77. 077         [self progressUpdate]; 
  78. 078     } 
  79. 079 } 
  80. 080 // 加載精靈表單 
  81. 081 - (void) loadSpriteSheets:(NSArray *)spriteSheets{ 
  82. 082     for (NSString *spriteSheet in spriteSheets) { 
  83. 083         // 該方法會加載與該plist文件名稱相同但后綴為.png的紋理圖片 
  84. 084         // 把該plist的所有spriteFrame信息讀取出來 
  85. 085         // 在之后的代碼中可以通過spriteFrameWithName獲取相應的精靈幀 
  86. 086         // 本例中airfightSheet.plist對應airfightSheet.png 
  87. 087         [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: spriteSheet]; 
  88. 088         [self progressUpdate]; 
  89. 089     } 
  90. 090 } 
  91. 091 - (void) progressUpdate{ 
  92. 092     // 每次調用該方法說明加載一個資源,自減更新資源總數 
  93. 093     if (--sourceCount) { 
  94. 094         [progress setPercentage:100.0f-(progressInterval * sourceCount)]; 
  95. 095     }else
  96. 096         // CCProgressFromTo動作用于以漸進的方式顯示圖片 
  97. 097         // actionWithDuration表示持續0.5秒,from表示進度條百分百從開始一直到100 
  98. 098         CCProgressFromTo *ac = [CCProgressFromTo actionWithDuration:0.5 
  99. 099             from:progress.percentage to:100]; 
  100. 100         // 當資源全部加載完畢時調用loadingComplete方法 
  101. 101         CCCallBlock *callback = [CCCallBlock actionWithBlock:^() { 
  102. 102             [self loadingComplete]; 
  103. 103         }]; 
  104. 104         // CCSequence組合動作 
  105. 105         id action = [CCSequence actions:ac.callback.nil]; 
  106. 106         // 進度條執行動作 
  107. 107         [progress runAction:action]; 
  108. 108     } 
  109. 109 } 
  110. 110 // 延遲2秒之后運行一個場景切換特效跳轉到游戲主場景,即HelloWorldLayer 
  111. 111 - (void) loadingComplete{ 
  112. 112     CCDelayTime *delay = [CCDelayTime actionWithDuration:2.0f]; 
  113. 113     CCCallBlock *callblock = [CCCallBlock actionWithBlock:^(void) { 
  114. 114         [[CCDirector sharedDirector] replaceScene: 
  115. 115         [CCTransitionFade transitionWithDuration:1.0f scene:[HelloWorldLayer scene]]]; 
  116. 116     }]; 
  117. 117     CCSequence *sequence = [CCSequence actions:delay.callblock.nil]; 
  118. 118     [self runAction:sequence]; 
  119. 119 } 
  120. 120 @end 

下面依次解釋以上代碼中的每一個方法。

Ø +(CCScene *) scene方法很簡單,和前面的一樣,首先創建了一個scene場景,然后創建了一個PreloadLayer層,將PreloadLayer層作為scene場景的子節點,最后返回scene場景。

Ø init方法首先獲取屏幕窗口大小,然后創建了一個進度條。這里使用progressbar.png圖片初始化一個精靈,再通過該精靈初始化一個CCProgressTimer對象,設置setPercentage屬性為0,表示當前未加載任何資源,表現在屏幕上就是什么也看不見。由于圖片大小關系,把scale設置成0.5,即縮小一半。

接下來設置CCProgressTimer對象最重要的3個參數。

q Ø midpoint:表示進度條動畫的起始位置,默認在圖片的中點,如果想要顯示從左到右的一個動畫效果,則必須改成(0,y)

q Ø barChangeRate:表示是否改變水平或者垂直方向的比例,設置成1表示改變,0表示不改變。本例制作一個從左至右的水平進度條,所以midpoint應該是(0,0.5)。因為x方向需要改變,而y方向不需要改變,所以設置barChangeRateccp(1,0)

q Ø type:設置為kCCProgressTimerTypeBar,表示條形進度條。

關于CCProgressTimer類的使用可以參考官方文檔,讀者也可以找到cocos2d的示例項目cocos2d-tests-ios.xcodeproj,并運行ActionProgressTest這個TARGET。感興趣的讀者也可以仔細分析該項目中的ActionProgressTest.m源文件(位于項目的tests目錄下)來掌握不同progress的用法示例。

最后設置CCProgressTimer對象的位置,并添加為當前層的子節點。

onEnterTransitionDidFinish方法加載配置文件preloadResources.plist,讀取配置文件中的游戲資源名稱列表并存儲在不同的數組中。首先使用CCFileUtil獲得plist文件的具體路徑,調用NSDictionarydictionaryWithContentsOfFile方法把該文件轉換成一個字典對象。然后通過字典的key值取出不同類型資源的數組,調用每個數組的count方法累加得到總共需要加載的資源總數量,使用100除以資源總數量獲得進度條需要更新次數用于之后計算進度條顯示的百分比。最后將數組作為參數調用performSelectorOnMainThread: withObject: waitUntilDone:方法在主線程中依次加載每種類型的游戲資源,將waitUntilDone的值設置為“YES”能保證所有的資源按照序列依次加載。

loadMusics:loadSounds:方法比較簡單,通過循環遍歷數組,預加載背景音樂和音效,加載完后調用progressUpdate方法更新進度條。

這里需要注意的是loadSpriteSheets:方法,該方法循環遍歷數組,數組的每個元素是一個plist文件名稱,調用CCSpriteFrameCacheaddSpriteFramesWithFile時,該方法會加載與該plist文件名稱相同但后綴為.png的紋理圖片(本例中airfightSheet.plist對應airfightSheet.png),把該plist的所有spriteFrame信息讀取出來,之后在項目當中就可以通過spriteFrameWithName獲取相應的精靈幀了。

progressUpdate方法比較簡單,每次被調用時自減更新資源總數變量,修改進度條的百分比。當資源全部加載完畢時調用loadingComplete方法。

loadingComplete方法被調用說明資源加載完畢,延遲2秒后運行一個場景切換特效跳轉到游戲主場景HelloWorldLayer

編譯并運行游戲,選擇“開始游戲”菜單項,模擬器首先會顯示一個進度條,進度條全部顯示完畢切換到HelloWorldLayer顯示經典的Hello World畫面。恭喜你!資源文件加載成功,進度條功能實現。運行時模擬器顯示效果如圖13.60所示。

————本文節選自《瘋狂ios講義(下)》

責任編輯:閆佳明 來源: oschina
相關推薦

2010-03-18 16:45:00

云計算

2012-12-11 09:37:03

開源硬件開源軟件

2012-07-24 09:18:39

編程程序員

2013-06-09 10:51:35

2011-04-27 10:57:29

高性能web開發

2020-05-25 20:59:49

CDN云計算服務器

2022-09-05 08:04:16

mergeconcat?pandas

2015-02-13 10:20:15

微信

2013-08-28 13:51:19

2013-08-06 09:57:13

2015-09-28 14:30:41

聯想

2019-03-12 17:17:44

華為云

2022-02-12 17:19:04

元宇宙Meta數字經濟

2022-06-01 07:10:43

遞歸字典極限

2010-10-14 12:00:28

2015-10-08 09:17:47

創業浮躁

2013-05-20 09:51:00

計算機書籍書籍封面語言書籍

2020-07-03 07:46:22

CPUOS內存

2013-12-18 16:43:16

順序多核

2011-09-26 09:18:16

Android專利
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲二区视频 | 久久久久久久一级 | 国产高清视频一区二区 | 国产精品99久久久久久动医院 | 国产成人精品免高潮在线观看 | 亚洲欧美久久 | 国产成人精品一区二区三区网站观看 | 成人精品影院 | 一区二区视频在线 | 久久久精品亚洲 | 毛片在线看看 | 丁香六月伊人 | 五月槐花香 | 日韩av电影在线观看 | 男人天堂国产 | 美女在线一区二区 | 天堂久久一区 | 欧美日韩精品专区 | 中文字幕日韩欧美一区二区三区 | 久久久av | 久久久999免费视频 999久久久久久久久6666 | 成人亚洲视频 | 性高朝久久久久久久3小时 av一区二区三区四区 | 精品国产91乱码一区二区三区 | 黄网免费看 | 国产精品国产精品国产专区不片 | 国产精品久久777777 | 羞羞视频在线观看网站 | 欧美精品一区二区三区在线四季 | 亚洲欧洲精品在线 | 中文在线一区 | 国产在线一区二区三区 | 成人h电影在线观看 | 免费在线观看av | 亚洲欧美视频 | a级免费观看视频 | 久久99精品久久久久久 | 日韩中文在线视频 | 日韩成人在线观看 | 国产精品久久久久久久久久妇女 | 91色在线视频 |