99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Qt/C++寶可夢小游戲?qū)崙?zhàn):從工程配置到戰(zhàn)斗系統(tǒng)

Qt/C++寶可夢小游戲?qū)崙?zhàn):從工程配置到戰(zhàn)斗系統(tǒng) 簡介一套基于Qt框架的C 2D角色扮演游戲源碼模仿《寶可夢》的核心玩法適合Qt/C入門開發(fā)者學(xué)習(xí)圖形界面與游戲邏輯設(shè)計(jì)也可作為課程設(shè)計(jì)與期末項(xiàng)目的參考模板。游戲覆蓋2D俯視角地圖、角色移動與碰撞檢測、屬性相克、技能與進(jìn)化系統(tǒng)、回合制戰(zhàn)斗及玩家背包管理等完整模塊代碼分層合理便于按模塊拆解學(xué)習(xí)。資源包共20個(gè)文件以9個(gè)cpp源文件和8個(gè)頭文件為主輔以TMX地圖、Qt工程文件pro及資源文件qrc壓縮包整體約19KB。渲染部分采用QGraphicsView/QGraphicsScene實(shí)現(xiàn)支持TMX地圖加載戰(zhàn)斗邏輯和寶可夢培養(yǎng)系統(tǒng)均有完整實(shí)現(xiàn)。已有103人學(xué)習(xí)下載適合游戲開發(fā)入門者對照源碼理解場景管理、事件處理與數(shù)據(jù)組織方式后續(xù)還可擴(kuò)展更多寶可夢種類、地圖場景與劇情任務(wù)。1. 用Qt/C做寶可夢小游戲?yàn)槭裁催@個(gè)組合適合練手也適合面試“基于QTC開發(fā)的寶可夢小游戲”說白了就是用 Qt Widgets 搭一個(gè)帶地圖行走、回合制對戰(zhàn)、存檔讀檔的桌面游戲。我上個(gè)月幫一個(gè)學(xué)弟改過類似的工程最大的感受是這類項(xiàng)目的價(jià)值不在“做出個(gè)游戲”而在于把 C 的類設(shè)計(jì)、狀態(tài)機(jī)、隨機(jī)數(shù)、界面解耦全部串了起來。剛學(xué)完 C 語法、想找一個(gè)能寫進(jìn)簡歷的完整項(xiàng)目的開發(fā)者這個(gè)方向比刷一百道算法題實(shí)在。下面這套方案以 Qt 5.15.2 MinGW 64 位環(huán)境為準(zhǔn)換到 Qt 6.5 后絕大部分代碼不用動只有少數(shù)字符串轉(zhuǎn)數(shù)字的接口位置有調(diào)整。2. 搭起游戲骨架Qt 工程配置與場景循環(huán)的實(shí)現(xiàn)2.1 新建 Qt Widgets 工程pro 文件關(guān)鍵配置與 Widgets / QML 選型在 Qt Creator 里新建項(xiàng)目時(shí)選 “Qt Widgets Application”這一步別選錯(cuò)。很多教程喜歡推 Qt Quick / QML但 QML 那套更適合移動端和高動態(tài)界面做寶可夢小游戲反而要額外學(xué) QML 語法調(diào)試鏈路也更長。Qt Widgets 的模式更直接一個(gè)界面是一個(gè) QWidget 子類用代碼或 Designer 往上擺控件信號槽把鼠標(biāo)點(diǎn)擊連接到 C 邏輯。對剛接觸 Qt 的 C 開發(fā)者這是最不容易中途放棄的路子。創(chuàng)建完成后.pro 文件里最關(guān)鍵的幾行長這樣QT core gui widgets greaterThan(QT_MAJOR_VERSION, 4): QT widgets TARGET PokemonQt TEMPLATE app CONFIG c17 SOURCES \ main.cpp \ GameWindow.cpp \ BattleController.cpp \ Pokemon.cpp HEADERS \ GameWindow.h \ BattleController.h \ Pokemon.h RESOURCES \ resources.qrcTARGET決定生成的可執(zhí)行文件名建議用英文中文名在發(fā)布打包時(shí)會在路徑處理環(huán)節(jié)莫名翻車。CONFIG c17允許你用auto、std::make_unique、結(jié)構(gòu)化綁定這些現(xiàn)代特性如果項(xiàng)目里只用 QString 和 int寫成 c11 也夠。RESOURCES是 Qt 資源系統(tǒng)入口把精靈圖、音頻、關(guān)卡地圖統(tǒng)一打進(jìn)一個(gè)二進(jìn)制資源運(yùn)行時(shí)完全不依賴外部圖片路徑。選型對比Qt WidgetsQt Quick / QML上手成本低C 開發(fā)者直接上手中需額外學(xué) QML 語法適合場景桌面對話框、地圖、回合制移動端、動效豐富的界面本項(xiàng)目的推薦度推薦不推薦main.cpp 是整個(gè)程序唯一的入口做的事就三件#include QApplication #include GameWindow.h int main(int argc, char *argv[]) { QApplication app(argc, argv); GameWindow window; window.show(); return app.exec(); }QApplication是所有 Qt Widgets 程序的地基負(fù)責(zé)事件循環(huán)、鍵盤焦點(diǎn)和窗口系統(tǒng)交互。window.show()只調(diào)用一次游戲畫面的刷新不靠反復(fù) show而靠內(nèi)部的繪制事件機(jī)制。app.exec()會阻塞在這里直到退出信號觸發(fā)返回。這個(gè)結(jié)構(gòu)所有 Qt Widgets 程序都一樣建議記牢后面寫單元測試入口時(shí)也能復(fù)用。2.2 用 QGraphicsView 做地圖與碰撞比 QPainter 省一半事第一次寫 Qt 游戲的人第一反應(yīng)是在 QWidget 的paintEvent里畫地圖塊、畫行走角色用 QPainter 一行行畫。我硬畫過一張 20×15 的地圖結(jié)論是移動一步要update()全量重繪地圖塊一多就明顯掉幀碰撞檢測全靠手動維護(hù)坐標(biāo)集合代碼很快就亂成一大坨 if 嵌套。更穩(wěn)的做法是 Qt 自帶的圖形框架QGraphicsScene管理場景里的對象QGraphicsView負(fù)責(zé)顯示和滾動地圖塊、NPC、玩家精靈各自是QGraphicsItem子類。移動角色只調(diào)setPos()碰撞判斷用scene()-items()查目標(biāo)位置是否有不可通過物體。這個(gè)架構(gòu)對大量圖元支持很好性能比全量重繪高一個(gè)量級。定義一個(gè)簡單的地圖場景頭文件#ifndef MAPSCENE_H #define MAPSCENE_H #include QGraphicsScene #include QVector class MapScene : public QGraphicsScene { Q_OBJECT public: explicit MapScene(QObject *parent nullptr); void loadMap(const QString csvPath); bool canMoveTo(int row, int col) const; private: int m_rows 0; int m_cols 0; QVectorQVectorint m_tiles; }; #endif實(shí)現(xiàn)loadMap用 CSV 數(shù)字代表圖塊類型0 草地、1 墻、2 水。讀取后不僅創(chuàng)建圖元還保留一份二維數(shù)組供碰撞檢測用void MapScene::loadMap(const QString csvPath) { QFile file(csvPath); if (!file.open(QIODevice::ReadOnly)) return; int row 0; while (!file.atEnd()) { QByteArray line file.readLine(); QListQByteArray nums line.split(,); m_tiles.append(QVectorint()); for (int col 0; col nums.size(); col) { int type nums[col].trimmed().toInt(); m_tiles[row].append(type); QGraphicsPixmapItem *tile new QGraphicsPixmapItem(); tile-setPixmap(tilePixmap(type)); tile-setPos(col * TILE_SIZE, row * TILE_SIZE); addItem(tile); } row; } m_rows row; } bool MapScene::canMoveTo(int row, int col) const { if (row 0 || col 0 || row m_rows || col m_tiles[0].size()) return false; return m_tiles[row][col] 0; }addItem把圖塊加進(jìn)場景setPos按圖塊尺寸換算屏幕坐標(biāo)。注意加載新地圖前先clear()場景并重置m_tiles否則舊圖塊殘留在場景里新地圖疊上去全是殘影。QGraphicsScene 的 y 軸向下增長正好符合從上往下讀地圖的習(xí)慣所以這里沒有坐標(biāo)翻轉(zhuǎn)的問題。地圖上觸發(fā)戰(zhàn)斗的常見做法是在canMoveTo返回 true 后檢查目標(biāo)格子的類型如果碰到草叢圖塊就按一定概率進(jìn)入戰(zhàn)斗。這個(gè)隨機(jī)概率放后面戰(zhàn)斗章節(jié)講這里只需要預(yù)留一個(gè)signal encounterWild()由 GameWindow 掛到 BattleController 上。2.3 主循環(huán)與鍵盤事件QTimer 讓游戲跑起來游戲循環(huán)有兩種常見寫法。一種是自己開while(true)循環(huán)里手動調(diào)processEvents()讓界面響應(yīng)。這種寫法在 Qt 里很容易卡死因?yàn)槟闶謩酉M(fèi)事件隊(duì)列的同時(shí)又在等事件時(shí)序上說不清楚。另一種是 Qt 里最順手的做法用QTimer每隔固定毫秒發(fā)一次 timeout 信號把更新邏輯和更新畫面掛到同一個(gè)槽上。// GameWindow 構(gòu)造函數(shù) m_timer new QTimer(this); m_timer-setInterval(16); // 約 60 FPS connect(m_timer, QTimer::timeout, this, GameWindow::onTick); m_timer-start(); void GameWindow::onTick() { if (m_player-isMoving()) m_player-advancePosition(); update(); }setInterval(16)對應(yīng) 60 FPS是人眼覺得流暢的最低標(biāo)準(zhǔn)。如果你的地圖塊多或動畫復(fù)雜先把間隔調(diào)到 3330 FPS跑一遍看卡不卡不要一開始就死磕 16。這里提一個(gè)調(diào)試習(xí)慣手動開程序點(diǎn)按鈕太慢Qt Test 模塊的QTest::mouseClick能模擬鼠標(biāo)點(diǎn)擊配合QSignalSpy監(jiān)聽信號能在測試函數(shù)里自動驗(yàn)證按鈕邏輯后面排查章節(jié)會再提。鍵盤控制在 Widgets 里通常重寫keyPressEventvoid GameWindow::keyPressEvent(QKeyEvent *event) { int row m_player-row(); int col m_player-col(); switch (event-key()) { case Qt::Key_W: row--; break; case Qt::Key_S: row; break; case Qt::Key_A: col--; break; case Qt::Key_D: col; break; default: QWidget::keyPressEvent(event); return; } if (m_scene-canMoveTo(row, col)) m_player-setGridPos(row, col); }移動采用“按格走”而不是像素級平滑移動這是這類小游戲最常見也最好維護(hù)的做法碰撞和事件觸發(fā)都在格子維度處理。想做像素平滑移動本質(zhì)上是在兩個(gè)格子坐標(biāo)之間插值屬于最后的潤色項(xiàng)不要一開始就陷入補(bǔ)間調(diào)參。3. 寶可夢戰(zhàn)斗系統(tǒng)的 C 實(shí)現(xiàn)類設(shè)計(jì)、狀態(tài)機(jī)與隨機(jī)數(shù)3.1 Pokemon 類與屬性克制表數(shù)據(jù)和行為收在一起戰(zhàn)斗系統(tǒng)是這類小游戲的核心也是面試時(shí)最有話講的部分。先定義一個(gè)Pokemon類把數(shù)據(jù)和行為收在一起#ifndef POKEMON_H #define POKEMON_H #include QString #include QVector struct Skill { QString name; int power; int accuracy; // 命中率 0-100 int pp; }; class Pokemon { public: Pokemon(const QString name, const QString type, int maxHp); QString name() const; QString type() const; int curHp() const; int maxHp() const; bool isFainted() const; void takeDamage(int dmg); void addSkill(const Skill skill); const QVectorSkill skills() const; private: QString m_name; QString m_type; int m_maxHp; int m_curHp; QVectorSkill m_skills; }; #endiftakeDamage必須處理下限血量不要出現(xiàn)負(fù)值void Pokemon::takeDamage(int dmg) { m_curHp - dmg; if (m_curHp 0) m_curHp 0; }類設(shè)計(jì)到這里下一步值得加的是屬性克制表。寶可夢系統(tǒng)的“水克火、火克草、草克水”正是體現(xiàn) C 數(shù)據(jù)建模的點(diǎn)。用靜態(tài) QMap 存克制關(guān)系#include QMap #include QString static QMapQString, QMapQString, double g_typeChart { {fire, {{grass, 2.0}, {water, 0.5}, {fire, 0.5}}}, {water, {{fire, 2.0}, {grass, 0.5}, {water, 0.5}}}, {grass, {{water, 2.0}, {fire, 0.5}, {grass, 0.5}}} }; double typeMultiplier(const QString attackType, const QString defendType) { return g_typeChart.value(attackType).value(defendType, 1.0); }QMap::value的默認(rèn)參數(shù) 1.0 很關(guān)鍵屬性沒有克制關(guān)系時(shí)返回普通傷害系數(shù)調(diào)用方不需要判空。把這個(gè)系數(shù)放進(jìn)傷害公式后戰(zhàn)斗數(shù)值立刻有了層次這也是面試官最愛的追問點(diǎn)——克制關(guān)系表怎么擴(kuò)展答案很簡單往 QMap 里繼續(xù)塞鍵值對不用改任何 if 結(jié)構(gòu)。3.2 回合制戰(zhàn)斗狀態(tài)機(jī)用枚舉驅(qū)動主流程回合制流程看起來簡單你打我一下我打你一下。但寫成代碼不能兩個(gè)槽函數(shù)互相調(diào)一旦某個(gè)技能觸發(fā)異常就跳不出當(dāng)前邏輯。正確做法是定義枚舉狀態(tài)用一個(gè)方法推進(jìn)enum BattleState { BATTLE_START, PLAYER_TURN, ENEMY_TURN, ACTION_RESOLVE, BATTLE_END }; class BattleController : public QObject { Q_OBJECT public: explicit BattleController(Pokemon *player, Pokemon *enemy, QObject *parent nullptr); void startBattle(); void playerChooseAction(const BattleAction action); signals: void playerAttacked(int damage); void enemyAttacked(int damage); void battleFinished(bool playerWin); private: void resolveAction(); void enemyChooseAction(); Pokemon *m_player; Pokemon *m_enemy; BattleState m_state; BattleAction m_pendingAction; };玩家點(diǎn)擊技能按鈕后不直接播放動畫而是緩存動作后進(jìn)入結(jié)算狀態(tài)void BattleController::resolveAction() { Skill skill m_player-skills().at(m_pendingAction.skillIndex); int damage qMax(1, (int)(skill.power * 0.8 2)); m_enemy-takeDamage(damage); emit playerAttacked(damage); if (m_enemy-isFainted()) { m_state BATTLE_END; emit battleFinished(true); return; } m_state ENEMY_TURN; enemyChooseAction(); } void BattleController::enemyChooseAction() { int idx RandomHelper::range(0, m_enemy-skills().size() - 1); Skill skill m_enemy-skills().at(idx); int damage qMax(1, (int)(skill.power * 0.8 2)); m_player-takeDamage(damage); emit enemyAttacked(damage); }emit playerAttacked(damage)是典型的信號槽解耦戰(zhàn)斗控制器只負(fù)責(zé)邏輯UI 層監(jiān)聽信號后刷新血條、播放動畫、往日志框追加文字。后續(xù)換界面方案或加聯(lián)機(jī)對戰(zhàn)只需要替換 UI 層戰(zhàn)斗邏輯一行不用動。startBattle里要做的初始化也別忘把雙方血量恢復(fù)到存檔值、重置狀態(tài)為 PLAYER_TURN、發(fā)出開始信號。3.3 用 C 隨機(jī)數(shù)引擎做命中率、暴擊與洗牌小游戲里的命中率、暴擊率、AI 出招全要隨機(jī)數(shù)。很多人習(xí)慣了rand() % 100在 Qt 5.15 和 C11 環(huán)境下有更可靠的寫法用random庫#include random class RandomHelper { public: static bool roll(int percent) { static std::mt19937 rng{std::random_device{}()}; std::uniform_int_distributionint dist(0, 99); return dist(rng) percent; } static int range(int min, int max) { static std::mt19937 rng{std::random_device{}()}; std::uniform_int_distributionint dist(min, max); return dist(rng); } };mt19937是梅森旋轉(zhuǎn)算法周期和分布均勻程度都遠(yuǎn)好過老式的線性同余生成器。std::random_device{}()從系統(tǒng)熵源取種子避免每次運(yùn)行從相同種子開始。以前見過一個(gè)玄學(xué)問題“每次重新開局第一發(fā)技能暴擊率都一樣”多半就是用了固定種子或rand()。用的時(shí)候注意uniform_int_distribution的區(qū)間是閉區(qū)間。命中率 90%正確寫法是dist(rng) 90生成的 0~99 中小于 90 占比正好 90%。抽隨機(jī)技能用range(0, skills.size() - 1)下界上界都要注意別越界。還有一個(gè)容易被忽略的點(diǎn)調(diào)試時(shí)希望戰(zhàn)斗結(jié)果可復(fù)現(xiàn)可以把靜態(tài)引擎的種子臨時(shí)改成固定值例如std::mt19937 rng{42}。同樣的操作序列每次跑結(jié)果一致定位某個(gè)特定傷害值的 bug 非常方便。敵方隊(duì)伍隨機(jī)洗牌也推薦用標(biāo)準(zhǔn)庫的std::shuffle不要自己寫冒泡排序配合 rand代碼更短且分布更均勻。4. 把界面做像樣Qt Designer 布局、幀動畫與存檔落地4.1 用 Qt Designer 拖出戰(zhàn)斗 UI信號槽掛載技能按鈕戰(zhàn)斗界面如果手寫布局控件一多橫豎排列的代碼會占幾百行調(diào)整一個(gè)邊距都要重新編譯。Qt Designer 的作用就在這里拖拽排好界面生成 .ui 文件編譯時(shí)用 UIC 工具轉(zhuǎn)換成 C 類。改布局不動邏輯加按鈕不改代碼。具體操作新建battleform.ui從左側(cè)控件面板拖入兩個(gè) QLabel 顯示雙方寶可夢名字兩個(gè) QProgressBar 顯示血量范圍先設(shè) 0 到 100運(yùn)行時(shí)代碼會改成實(shí)際最大血量四個(gè) QPushButton 放技能命名成 skillBtn0 ~ skillBtn3一個(gè) QTextBrowser 做戰(zhàn)斗日志一個(gè) QLabel 居中顯示精靈動畫代碼里通過Ui::BattleForm *ui訪問控件#include ui_battleform.h class BattleForm : public QWidget { Q_OBJECT public: explicit BattleForm(Pokemon *player, Pokemon *enemy, QWidget *parent nullptr); private: Ui::BattleForm *ui; }; BattleForm::BattleForm(Pokemon *player, Pokemon *enemy, QWidget *parent) : QWidget(parent), ui(new Ui::BattleForm) { ui-setupUi(this); ui-playerHpBar-setMaximum(player-maxHp()); ui-playerHpBar-setValue(player-curHp()); ui-enemyHpBar-setMaximum(enemy-maxHp()); ui-enemyHpBar-setValue(enemy-curHp()); for (int i 0; i player-skills().size(); i) { QPushButton *btn findChildQPushButton *(QString(skillBtn%1).arg(i)); if (btn) { btn-setText(player-skills().at(i).name); connect(btn, QPushButton::clicked, this, [this, i]() { emit skillClicked(i); }); } } }findChild按對象名找按鈕不需要每個(gè)按鈕單獨(dú)定義成員變量。四個(gè)按鈕的 clicked 信號連到同一個(gè)槽lambda 捕獲技能索引。UI 層不關(guān)心中間有沒有命中、扣多少血只把“哪個(gè)技能被點(diǎn)”拋給 Controller。關(guān)于架構(gòu)這類小游戲不用刻意套 MVVM 那種重框架信號槽分離邏輯和界面已經(jīng)足夠等你真需要多套界面復(fù)用邏輯時(shí)再上 MVVM 不遲。4.2 精靈圖幀動畫QPixmap 裁剪與 QTimer 刷新美工給的精靈圖通常是一張橫向連續(xù)幀 PNG程序需要按幀寬裁剪并定時(shí)切換模擬待機(jī)呼吸效果。實(shí)現(xiàn)一個(gè) SpriteWidgetclass SpriteWidget : public QWidget { Q_OBJECT public: SpriteWidget(const QString imagePath, int frameCount, QWidget *parent nullptr); protected: void paintEvent(QPaintEvent *event) override; private: QPixmap m_spriteSheet; int m_frameCount; int m_currentFrame; QTimer m_animTimer; }; SpriteWidget::SpriteWidget(const QString imagePath, int frameCount, QWidget *parent) : QWidget(parent), m_frameCount(frameCount), m_currentFrame(0) { m_spriteSheet.load(imagePath); setFixedSize(m_spriteSheet.width() / frameCount, m_spriteSheet.height()); m_animTimer.setInterval(150); connect(m_animTimer, QTimer::timeout, [this]() { m_currentFrame (m_currentFrame 1) % m_frameCount; update(); }); m_animTimer.start(); } void SpriteWidget::paintEvent(QPaintEvent *) { QPainter painter(this); int frameWidth m_spriteSheet.width() / m_frameCount; QRect srcRect(m_currentFrame * frameWidth, 0, frameWidth, m_spriteSheet.height()); painter.drawPixmap(rect(), m_spriteSheet, srcRect); }這里用的是 QPainter 的源矩形參數(shù)從精靈圖里截取當(dāng)前幀drawPixmap的第二個(gè)參數(shù)就是截取區(qū)域。setFixedSize要趁早調(diào)用否則窗口大小是默認(rèn)值繪制區(qū)域和圖像尺寸對不上。幀間隔 150ms 適合待機(jī)出手技能可以改成 80ms 才看得出動作。精靈圖尺寸注意一張 4 幀、每幀 64x64 的 PNG 加載成 QPixmap 后內(nèi)存占用很小但如果是 2048 像素的大圖建議用 QImageReader 設(shè)置 scaled 尺寸后加載避免一次性占滿內(nèi)存這在嵌入式環(huán)境上很重要。4.3 存檔用 QSettings 還是 JSON持久化的正確選擇寶可夢游戲必然要存檔地圖位置、隊(duì)伍血量、背包裝備。Qt 自帶 QSettings 適合存窗口大小、音量這類簡單配置存檔這種結(jié)構(gòu)化數(shù)據(jù)用 JSON 更合適因?yàn)?QSettings 的 INI 格式處理數(shù)組和嵌套結(jié)構(gòu)很別扭。Qt 5.15 自帶 QJsonDocument寫檔口bool GameSave::saveToJson(const QString path) const { QJsonObject root; root[playerName] m_playerName; root[mapRow] m_mapRow; root[mapCol] m_mapCol; QJsonArray team; for (const Pokemon *p : m_team) { QJsonObject obj; obj[name] p-name(); obj[hp] p-curHp(); obj[maxHp] p-maxHp(); team.append(obj); } root[team] team; QFile file(path); if (!file.open(QIODevice::WriteOnly)) return false; file.write(QJsonDocument(root).toJson()); return true; }寫存檔時(shí)一定要確認(rèn)QFile::open成功再確認(rèn)寫入字節(jié)數(shù)。忽略這兩個(gè)檢查后期頻繁讀寫時(shí)會出現(xiàn)“偶爾存不上、文件是空的”的黑匣子故障。讀存檔寫在loadFromJson注意用QJsonObject::contains判斷字段是否存在老版本存檔缺字段時(shí)按默認(rèn)值兜底不要整個(gè)解析失敗bool GameSave::loadFromJson(const QString path) { QFile file(path); if (!file.open(QIODevice::ReadOnly)) return false; QJsonDocument doc QJsonDocument::fromJson(file.readAll()); QJsonObject root doc.object(); m_playerName root.contains(playerName) ? root[playerName].toString() : Trainer; // 其余字段同樣用 contains 判斷 return true; }存檔目錄不要放 exe 旁邊Windows 下安裝到 Program Files 會沒有寫權(quán)限。常見做法是用QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)取應(yīng)用數(shù)據(jù)目錄再Q(mào)Dir().mkpath確保目錄存在。存讀失敗時(shí)給用戶彈一個(gè) QMessageBox把file.errorString()顯示出來而不是靜默吞掉錯(cuò)誤。5. Qt 5.15.2 開發(fā)避坑指南編譯、運(yùn)行時(shí)與工具鏈的五個(gè)翻車現(xiàn)場寫 Qt 小游戲的過程中編譯報(bào)錯(cuò)和運(yùn)行崩潰占掉的時(shí)間往往比寫游戲邏輯還多。下面五個(gè)坑是我在多個(gè)項(xiàng)目里反復(fù)遇到的按“現(xiàn)象 → 原因 → 解決”的順序說清楚。5.1 cannot mix incompatible Qt library (version ex50601)版本混用的解決現(xiàn)象編譯鏈接階段報(bào)fatal: cannot mix incompatible Qt library (version ex50601) with this librar...這里的 ex50601 是 Qt 5.6.1 的內(nèi)部版本標(biāo)識和工程當(dāng)前使用的 Qt 5.15.2 對不上。原因工程鏈接的 Qt 庫文件來自多個(gè)安裝目錄。常見前置操作是之前裝過 Qt 5.6.x后來又裝 5.15.2環(huán)境變量 PATH 同時(shí)指向兩個(gè)目錄。qmake 生成 Makefile 時(shí)會按 PATH 順序找 qmake 所在目錄的庫舊版本排在前面就去引用了舊庫。另一種常見場景是 Qt Creator 的構(gòu)建套件切換后沒有重新 qmakebuild 目錄里殘留舊 Makefile。解決先刪除整個(gè) build 目錄重新打開工程再確認(rèn)構(gòu)建套件里的 Qt 版本和編譯器是同一套命令行編譯時(shí)先執(zhí)行where qmake看清楚當(dāng)前用的是哪個(gè)路徑。徹底方案是調(diào) PATH 把新版本 qmake 的目錄提到前面或卸載舊版 Qt。血淚經(jīng)驗(yàn)切 Qt 版本必先make clean再讓 qmake 重新生成 Makefile能省掉很多次全量編譯報(bào)錯(cuò)。5.2 qt.qpa.plugin: could not find the Qt platform plugin “l(fā)inuxfb”現(xiàn)象程序在嵌入式板卡或樹莓派上啟動終端打印qt.qpa.plugin: could not find the Qt platform plugin linuxfb后立即退出。普通 Linux 桌面上也會出現(xiàn)類似報(bào)錯(cuò)只是插件名換成 xcb。原因Qt 在 Linux 上必須通過平臺插件對接顯示系統(tǒng)。linuxfb 對應(yīng)裸的 framebuffer 設(shè)備xcb 對應(yīng) X11 窗口系統(tǒng)。程序啟動時(shí)會按固定路徑搜索插件搜不到對應(yīng).so文件就退出。交叉編譯場景最容易漏只拷貝了可執(zhí)行文件漏掉plugins/platforms/目錄。解決在交叉編譯后的 Qt 安裝目錄里找plugins/platforms/libqlinuxfb.so連同libQt5Gui.so.5、libQt5Core.so.5等依賴一起拷貝到目標(biāo)板程序目錄。運(yùn)行時(shí)設(shè)置兩個(gè)環(huán)境變量export QT_QPA_PLATFORMlinuxfb export QT_QPA_PLATFORM_PLUGIN_PATH./platforms ./PokemonQt排查時(shí)先用ldd libqlinuxfb.so看依賴確認(rèn)沒有引用桌面平臺特有的 libGL。如果板子上的 framebuffer 設(shè)備是/dev/fb0默認(rèn)路徑一般就行分辨率和色彩問題再檢查內(nèi)核啟動參數(shù)。5.3 編譯報(bào) unknown module(s) in qt: webenginewidgets 怎么辦現(xiàn)象在 .pro 文件里加了一行QT webenginewidgetsqmake 階段直接報(bào):-1: error: unknown module(s) in qt: webenginewidgets工程完全卡死。原因Qt 5.15.2 的開源安裝包默認(rèn)組件不包含 WebEngine 模塊。WebEngine 基于 Chromium體積大、對編譯器版本敏感安裝器默認(rèn)不勾選。新手最常犯的錯(cuò)網(wǎng)上教程用了 webenginewidgets 展示網(wǎng)頁直接抄過來沒檢查自己的組件列表。解決重新運(yùn)行 Qt Maintenance Tool在組件樹里展開 Qt 5.15.2 → Additional Libraries勾選 Qt WebEngine 后等待下載。但說實(shí)話寶可夢小游戲用不到瀏覽器內(nèi)核想顯示“操作幫助”頁面QTextBrowser setHtml 完全夠用。更推薦直接刪掉這一行不給項(xiàng)目增加幾十 MB 體積和潛在插件沖突。5.4 release 包雙擊閃退windeployqt 與平臺插件排查現(xiàn)象開發(fā)環(huán)境編譯運(yùn)行正常release 打包后拷貝到一臺沒裝 Qt 的電腦雙擊沒反應(yīng)或閃一下就沒了。原因運(yùn)行環(huán)境缺 Qt 運(yùn)行時(shí) DLL 或平臺插件。開發(fā)機(jī)上正常是因?yàn)?Qt Creator 啟動時(shí)會把 Qt 安裝目錄的 bin 加進(jìn) PATH雙擊 exe 用的是系統(tǒng) PATH目標(biāo)機(jī)沒裝過 Qt 自然找不到 DLL。解決用官方工具自動復(fù)制依賴windeployqt PokemonQt.exe運(yùn)行后同目錄會多出 Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll 和 platforms 子目錄。仍然閃退就去“事件查看器 → Windows 日志 → 應(yīng)用程序”里看異常代碼c0000005 表示訪問違規(guī)最常見場景是 DLL 版本混用比如從舊目錄手工拷了幾個(gè) Qt5 開頭的 DLL。原則是發(fā)布目錄只用同一套 Qt 版本的 DLL用dumpbin /dependents或 Dependencies 工具確認(rèn)。5.5 MinGW 與 MSVC 混用access violation c0000005 的根源現(xiàn)象程序在某次集成第三方模塊后運(yùn)行崩潰事件查看器顯示access violation c0000005。另一種典型場景是 C# 通過 P/Invoke 調(diào)用 C 寫的 DLL 也報(bào)同樣的錯(cuò)誤碼。原因MinGW 的 GCC 和 MSVC 的 C ABI 不兼容運(yùn)行庫也不同libstdc 對 msvcp140兩邊編譯出的二進(jìn)制對象模型、異常處理方式都不一致。小游戲本身一般碰不到跨界調(diào)用但集成外部硬件 SDK 或網(wǎng)友打包的庫時(shí)早晚踩到。解決盡早統(tǒng)一工具鏈。構(gòu)建套件選 MinGW 64-bit那么所有第三方庫也必須用 MinGW 版本如果第三方只提供 MSVC DLL就切換到 MSVC 工具鏈的 Qt Kit并確保目標(biāo)機(jī)器安裝對應(yīng)版本的 Microsoft Visual C Redistributable。這個(gè)決定放在項(xiàng)目第一天做不要等集成串口或攝像頭模塊時(shí)才回頭換編譯器那基本等于重寫工程文件。6. 讓戰(zhàn)斗動畫更順暢QTimeLine 補(bǔ)間動畫與幀率驗(yàn)證6.1 用 QTimeLine 做技能動畫替代手寫定時(shí)器技能釋放時(shí)攻擊方的精靈要“前沖一下再彈回”。如果用手寫 QTimer 控制位置要維護(hù)移動標(biāo)志位和方向變量技能一多代碼就亂。Qt 提供 QTimeLine 專門做補(bǔ)間動畫QTimeLine *timeline new QTimeLine(300, this); timeline-setUpdateInterval(15); timeline-setFrameRange(0, 20); connect(timeline, QTimeLine::valueChanged, [this](qreal value) { qreal offset std::sin(value * M_PI) * 80; m_attacker-setPos(m_attackerBaseX offset, m_attackerBaseY); }); timeline-start();value 是 0 到 1 的進(jìn)度sin(value * M_PI)讓位移先增后減最后一次動畫結(jié)束正好回到起點(diǎn)。這種一次性動效用完把 timeline 設(shè)父對象為 this或用deleteLater釋放。6.2 用幀率統(tǒng)計(jì)驗(yàn)證手感加一個(gè)簡單的幀率統(tǒng)計(jì)看游戲是否真的跑在目標(biāo)幀率void GameWindow::onTick() { if (m_player-isMoving()) m_player-advancePosition(); static QElapsedTimer timer; static int frameCount 0; if (!timer.isValid()) timer.start(); frameCount; if (timer.elapsed() 1000) { qDebug() FPS: frameCount * 1000.0 / timer.elapsed(); frameCount 0; timer.restart(); } update(); }實(shí)測幀率手感該做的優(yōu)化低于 30明顯卡頓檢查地圖圖塊數(shù)量、QTimer 間隔、動畫時(shí)長30~55可玩但不順滑技能動畫時(shí)長從 300ms 降到 200ms 試試55 以上達(dá)標(biāo)不用優(yōu)化幀率掉到 30 以下先檢查是不是在動畫槽里做了耗時(shí)操作比如每次刷新都從磁盤讀圖片。再看血條刷新是不是用了全窗口update()改成只update()對應(yīng)的 QProgressBar 區(qū)域性能能提一截。我做這類 Qt 小項(xiàng)目最大的教訓(xùn)是邏輯層不要持有 UI 控件的指針界面層不要寫業(yè)務(wù)邏輯。每次看到把血量計(jì)算寫在按鈕回調(diào)里的代碼都想勸一句——把戰(zhàn)斗邏輯放進(jìn)獨(dú)立的 controller 類以后加 AI、加道具、加動畫都不會崩。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
丁香六月激情毛片| 无码地址| 成人做爰A片免费看视频| 深爱激情九九五月天 | 激情综合五月色在线| 亚洲欧美成人在线观看| 亚洲精品久久久久久久久久吃药| 九九精品99| 久久奄也去色色网站| 99热国产婷婷| 久久久五月天婷婷成人网| 99精品视频网| 爱操人妻| 色欲天天综合网| 久久A区B区| 国产亚洲色婷婷久久99精品91| 亚洲日韩操B| 久久六月综合| 色99网| 99热无码| 特级片神马电影| 久久久思思热| 激情五月天综合网站网站网站| 视频久久9| 狠狠婷婷色| 五月天色影院| 日本五月婷婷| 色五月婷婷老师| 九九大香视频| 97色碰| 天天色噜| www.91在线观看| 综合六月激情婷婷| 丁香婷婷深情五月亚洲| 久久538| 天天干天天干天天干天天干天天| 森林影视大全,最好看的2019年视频| av中文在线| 97人人看一| 97男人天堂| 日本久久激情| 久久一操| 欧美色图天堂网色| 久月婷婷| 五月开心六月婷婷在线播放网站| 五月天婷婷五月| 激情综合网婷婷久久| 日本妈妈乱| 51成人| 综合伊人久久| 六月丁香婷婷视频综合在线观看| 五月天婷五月天综合网在线观| 久久黄A片| 色婷婷五月天天天天天| 国产欧美日韩一区二区三区| 停停五月天激情网| 九月激情综合| 天天干天天做| 综合久久五月| 99视频久久| 国产人妻操逼| 欧美激情综合色综合色| www.婷婷.com| 激情第四色| av一级棒av| 丁香婷婷五月份| 七七久久婷婷| 丁香五月激情宗合| 国产婷婷色综合AV蜜臀AV| 久久视频在线| 91一起操| 99热99| 无码yw| 色综合丁香| 99热综合在线| 亚洲婷婷免费| 狠狠操狠狠操| 婷婷综合在线视频| 五月丁香六月婷婷,婷| 婷婷色五月亚洲| 婷婷丁香五月天在线| 一级性爱视频| 91一起操| 色吧五月婷婷| 国产午夜精品久久久观看| 五月天亭亭俺也| 伊人婷婷色| 大香蕉520| 五月天成人综合| 人碰人人人玩91| 日韩色色一区| 丁香五月av在线| 99视频在线精品| 另类小说色婷婷| 猫咪伊人AV| 色婷婷五月在线| 精品视频99看在线视频| 国产婷婷综合在线免费视频| 精品99*| 婷婷五月天AV在线| 日日操人人操| 欧美性爱五月天| 中文字幕丰满乱孑伦无码专区| 亚洲有码在线视频| 中文国产五月天| 色五月五月婷婷| www.久久| 超碰成人免费| 日本久久婷婷| 欧美久久网| 婷婷无五月无码视频| 超碰免费人妻| 26uuu欧美| 校花娇喘呻吟校长陈若雪视频| 1234操逼网| 久久成人性爱| 伊人婷婷五月天| 色婷婷在线视频观看| 激情综合区| 久色五月丁香视频| 99久久高清视频| 欧美天天五月丁香免费观看 | 超碰色综合| 亚洲狠狠色丁香婷婷综合久久| www.久久爱.com| 国产色五月| 天天综合精品| 天堂爱爱| 高潮毛片又色又爽免费| 天天操天天爽天天爱| 4399亚洲视频| 久久婷婷影院| 亚洲色99| 激情小说婷婷小说| 成人做爰A片免费看视频| 97色色综合| 久久久久人妻中文| 久久九九99视频| 婷婷色五月噜噜| 超碰在线免费| 色五月婷婷中文字幕在线观看| 婷婷五月天伊人| 欧美一级a | 色婷婷久久综合| 91精品综合久久久五月天| 深爱五月中文字幕| 九九婷婷热| 97深爱伊人综合| 色婷网| 99re99在线看| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 激情婷婷五月色| 国产片XXXXA片国语对白| 色五月之第四色| 婷婷五月天精品| 五月激情视频| 国产99久久久国产精品免费看| 亚洲激情亚洲激情| 热91久| 综合久久五月| 婷婷第一页| 激情五月丁香亭亭| 精品久色| 天天天摸夜夜夜玩| 九九人人精品| 99热超碰| 色五月婷婷激情| jiuse91在线| 噜噜在线| 婷色成人| 欧美久人人| WWW.99热| www.五月天社区| 色婷婷亚洲综合天堂| 丁香五月电影| 97色婷婷| 九九色video| 五月天久久91| 丁香香五月激情免费视频| 婷婷丁香六月| 五月天婷婷在线视频| 欧美啪啪9| 九九99久久| 婷婷五月天少妇| 丁香五月天日韩无码| 五月激情天| 天天射影| 黄色三级日本| 婷婷激情五月综合在线视频| 婷婷五月天综合久久| 色色色色网站| 伊人在线视频| 99 这里只有精品| 激情五月婷婷她| 国产精品久久..4399| 五月香蕉婷婷| 激情婷婷| 综合色网站| 六月丁香久久| 青青草tp| 特级西西4444www无码| 九九热a| 91se视频| 激情综合五月天| 第四色首页| 久久久久9999| 六月丁香色色色| 少妇AB又爽又紧无码网站| 性日本精品| 99九九精品| 久99久视频精品| 婷婷五月电影院| 亚州日本欧州韩美高青高潮一| www.久久9| 亚洲色五月婷婷| 色色色色色色色色色色色色色色,网站| 97色啪| 五月综合视频| 玖玖热视频| 青草激情综合| 99思思热只有在这里看| 五月激情网五月综合网| 色五月婷婷激情综合网| 色婷婷97| 日本三级中国三级99| 中文字幕AV在线播放| 婷婷五月激情欧美大胆视频| 五月天激情小说婷婷基地| 丁香婷婷六月天| 激情五月综合网丁| 91紱請| www.色婷婷| 激情五月天伊人av| 五月天激情啪啪| tingting五月天亚洲| 色欲九区| 99乱视频| 日韩成人中文字幕| 人人操97| 99开心五月五月丁香激情| 99黄色在线视频精品熟女| av婷婷丁香| 欧美肉大捧一进一出免费视频| 淫视馆AV在线| 色情综合网| 激情AV在线| 五月婷视频| 六月婷婷久久| 丁香激情五月| 狠狠的日| 99激情| 色综合色色| 伊人久久五月天| 色五月婷婷五月天| 日韩亚洲视频| 五月丁香| 1级欧美日韩| www.seqingwuyuetian| 无码人妻丰满熟妇奶水区码| 中文字幕婷婷9月天| 俺去也五月| 99综合视频一体| 无码人妻少妇色欲AV一区二区| 九九aV| 激情五月天 婷婷| 色欲婷婷五月天| 丁香花五月天激情| 天天爽天天操| 亚洲一区二区色图-亚洲精品国产精品乱码-成人AV | 中文成人在线| 丁香五月婷婷五月基地| 97人操| 夜色综合网| 91色噜噜狠狠狠狠色综合| 狼人狠狠操| 亚洲欧洲国产精品| 婷婷五月激情丁香激情| se99视频| 51国精产品自偷自偷综合 | 国产熟妇乱子伦hd| 伊人五月天久久| 九九大香蕉黄色影院| 日本色色色| 亚洲精品又粗又大又爽A片| 精品国产乱码久久久久夜深人妻| 日韩久操婷婷| 亚洲1区| 日韩抽插操逼| 思思热视频在线| 五月丁香色色网| 99九九视频| 丁香五月天久久| 色青五月天| 色婷婷五月影视| 怡红院院在线导航网| 婷婷五亚洲| 在线色色| www.色情五月天.com| 99色在线视频| 99热这里只有精品9| 成片免费观看视频大全| 亚洲成人网址在线观看| 亚洲小视频免费看| 天天爱天天操| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 少妇人妻人伦A片| 一本色道久久综合狠狠躁小说| 亚洲午夜在线视频| 五月婷婷新网站| 伊人色欲五月天| 婷婷射丁香| 亚洲日韩久久婷婷伊人| 99在线精品视频观看免费下载| 五月天婷婷视频30| 婷婷中文字幕| 亚洲色综合| 色婷婷五月天天天干天天操天天爽| 九月丁香亭亭| 69精品人妻不卡视频| 婷婷五月激情四月综合| 亚洲旡码| 久久99三级在线视频| 99在线免费视| 人人播| 激情啪啪五月天| WwW天天干| 久久久久er热| 色婷婷操逼| 五月婷婷之综合激情| 婷婷五月天综合网| 激情九月婷婷| 99九九在线| 操操操91| 色婷婷五月天激情在线观看| 日比视频91| 五月激情婷婷六月丁香| 九九碰九九爱97超碰| 成人在线日韩欧美| 久色激情| 久99久精品视频| 国产无套精品一区二区| www色哟哟| 五月天自拍网| 九九操屄| 深爱婷婷丁香五月激情| 日本九九九九九九| 九九热视频这里只有精品| 五月婷婷av在线| 五月天色婷婷av| 日本色婷婷| 亚洲综合久| 另类小说色婷婷| 9 1大香蕉| 99热成人在线| 成人丁香五月婷| 五月天六月婷| 婷婷综合九月| 99超级碰免费视频| 五月激情五月丁香| 九九99久久精品| 五月天影院婷婷在线观看| 少妇熟女视频一区二区三区 | 亚洲色 视频| 亚洲午夜在线视频| 丁香五月电影| 99在线观看精品| 日韩精品999| 九九色院| 天天爽天天爽| 色噜噜在线| 亚洲无码性爱| WWW99热| 99啪啪视频| 丁香五月色| tingtingjiqingwuyue| 久久久97| 婷婷五月天偷拍| 久婷自拍视频| 色五月天电影| 五月婷婷开心综合| 色色免费网站| 人与禽A片啪啪| 激情宗合网激情五月天| 26uuu丁香婷婷五月| 超碰在线国产| 丁香六月天堂| www久| 中文字幕丰满孑伦无码专区| 精品色| 亚洲网视屏| 色婷婷五月天| 欧美色性色好| 婷婷成人综合免费视频| 九九偷拍网| 在线不卡视频| 婷婷激情五月天在线| 色婷婷影| 日本熟妇乱妇熟色A片蜜桃| 热99精品视频| 超碰免费在线| 先锋男人91资源| 亚洲操人| 色丁香五月| 99精品在线| 丁香五月激情啪啪综合| 婷婷香五月天| 久久久无码精品成人A片小说 | 婷婷激情五月天在线| 久久伦乱| 9l视频自拍九色9l黑人| 91超级碰| 久久久999精品| 九九热短视频在线观看| 日韩九九视频| 第四色五月婷婷| 国产精品一区在线观看你懂的| 婷婷六月丁香五月| 伊人丁香花综合影院| 在线你懂的亚洲欧| 五月丁香天堂| 色级停停| 777精品久无码人妻蜜桃| 99视频精品在线| 五月色丁香综合| 亚洲成人网站在线| 五月丁香天堂| 色婷婷呢狠禁久禁| 天天做天天爽| 激情网五月| 欧美 日韩 成人| 99久久婷婷五月天| 综合五月亭亭9| 九色PORNY9l原创自拍| 国产综合A片| 亚洲亚洲人成综合网络| www.狠狠| 99亚州综合精品成人网| 九色自拍| 五月丁香 啪啪| 99爱在线观看视频| 丁香五月激情综合啪啪| 国产26uuu视频| 99久久精彩视频。| 亚洲欧洲99| 婷婷激情在线| 8区视频在线| 夜夜爱爱亚洲| 色婷成人狠干| 久久久久久久久久久月丁| 日本激情综合| 影音先锋男人av资源站| 七月丁香婷婷 色色| 色五月婷婷五月天| 五月婷婷色| 大香蕉久久| 九九色人| 婷婷狠狠操| 丁香五月婷久久| 夜夜 操无码| 国产无人区大片| 激情视频综合| 九九综合九九| 久久色情| www久视频com| 婷婷五月天大香蕉在线视频观看| 激情五月天情色| 色婷婷影视99| 欧美色色干| 婷婷五月天Av| 丁香色六月| 久热只有这里有精品| 26uuu视频欧美| 丁香综合婷婷开心激情网| 综合网色| 色视五月天婷婷| 99九九视屏| 99热在线免费| 狠狠干综合网| 五月丁香色色网| 亚洲亚洲人成综合网络| 日日夜夜九九| 色婷婷777狠狠| 天天艹天天综合网| 五月天激情婷婷小说| 日本色色色| 天天综合五月| 中字幕视频在线永久在线观看免费 | 综合久久婷婷| 日本性视频| 影音先锋偷偷色男人站| 再綫Av免费視品| 思思w99| 九九久热| 色激情五月| 男女啪啪做爰高潮无遮挡| 日韩久久日| 五月综合激情| 色婷婷五月天堂资源| 免费不卡狠操美女视频网 | 久久婷婷电影| 久久五月天色婷婷| 亚洲五月色| 婷婷午夜精品久久久| 亚洲色婷婷| 97在线日韩| 色综合久久44| 色情一区二区播放| 日韩无码专区| 丁香五月天影院| 五月婷婷黄色| 天天舔天天操| 欧美成人精品三区综合A片| 丁香五月成人自拍| 欧美日韓成人亚洲精品另类| 久久怡红院| 狠狠狠狠狠狠| 精品在线网站| 无码任你操| 性一交一乱一交A片久久四色| 丁香啪啪中文字幕| 激情的五月| 久久婷婷综合国产| 丁香激情综合| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 天堂草在线看www| 91丨九色丨东北熟女| 超碰人人摸AV| 久久996re热这里只有精品无码| 久久五月天网| 秋霞av不能| 五月婷丁香在线视频在线| 性天堂久久| 夜色爱爱亚洲| 99色播| 色婷婷综合网| 国产一级片| 精品99视频| 91怕怕网| 色婷婷激情五月天在线观看| 国产精品人人做人人爽人人添| 影音先锋男人资源站一区二区| 新五月天婷婷激情电影| 五月婷婷激情网| 色一情一乱一乱一区91| 激情五月色婷婷| av电影在线播放| 69午夜成人影片| 免费精品99| 99视频久久| 久青操| 色激情五月| 五月婷婷真爱激情网| 影音先锋秋秋五月婷婷| 能看的av片| 色婷婷网| 一本久久亚洲五月婷婷| 国产人妻人伦精品一区二区| 丁香五月色播中文在线播放| 婷婷爱五月| 激情五月天婷婷免费观看| 婷婷色网站| 五月婷婷久久大香蕉| 激情九色| 日本九九九九| 激情五月综合网| 天天开心婷婷丁香五月| 亚洲色五月| 亚洲 25P| 69热91天堂| 久久月天堂| 色久免费| 亚洲无码AV片| xxxx久| 亚洲激情综合网| 国产激情综合| 99久久国产成人精品| 99噜噜噜在线播放| www.ppypp| 超碰在线资源| 站长推荐无码播放| 青草性爱视频| 丁香五月天AV在线 | 激情小说婷婷五月| 69人妻人人澡人人爽久久| 婷婷五月天视频免费在线观看| 99久久久久久www| 99热e| 五月天婷婷综合久久| 99噜噜噜在线播放| 深情五月天| 手机旧版看人妻1025| 色情久久久| 五月婷婷xxx| 欧洲色区| 六月婷婷五月天| www.五月婷婷久久.com| 99热国产在线| 91超级碰在线| 在线日韩视频| 这里只有精品免费| 成人噜噜网| 中文字幕在线aⅴ免费观看| 色五月影视| 久久9精品| 熟妇人妻中文字幕无码老熟妇| 五月天婷婷丁香社区| 五月婷婷婷综合网| 丁香婷婷综合激情五月色| 亚洲欧美另类在线23p| 超碰无码318604| 国产亚洲99久久精品| 激情六月婷| 99色婷婷视频| 色播色丁香五月| 国产成人亚洲综合A∨婷婷| 婷婷五月婷婷五月| 一级片sese片.COM| 91精品综合久久久久久五月天| 爱射综合| 久久丁香五月天| 丁香五月天激情婷婷丁香六月| 久久婷五月影院| 五月婷婷激情综合网| 日本熟女内射| 天天色综合色色色色色。| 婷婷久久天堂网| 五月天婷婷色| 青草性爱视频| 久久WW| 日韩日比视频在线| 欧洲色| 超碰在线观看9| 亚洲噜色| 南京搡BBBB搡BBBB| 五月婷婷另类| 久re热视频| 丁香色婷婷色手机免费在线| 天天综合精品| 成片免费播放| 色色无码| 亚洲99精品欧美一区| 五月丁香六月婷婷不卡免费无码 | 日本久久高清| 婷婷五月天播播| 99视频这里只有久久精品| 99热婷婷| 久久九区| Av九九| 亚洲婷婷激情五月天| 大香蕉啪啪网| 久久精品99久久| 天天视频精品9| 香蕉AV777XXX色综合一区| 五月在线| 狠狠色噜噜狠狠狠888| 色婷婷伊人| 超碰高清在线| 秋霞AV淫| 91碰碰视频| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 午夜激情久久| 成人va在线| 超碰色碰碰| 色级停停| 大香蕉久久伊人网| 一级七香蕉| 国产三级在线播放| 国精产品一区二区三区| 四季AV综合网| 4399人妻无码久久久| 久久色五月天| 大香蕉婷婷色| 五月婷成人| 五月网激情| 日本的α片xxxwww| 丁香综合伊人AV| 成人狠狠成人狠狠成人狠狠成人狠狠| 另类图片 五月激情| 激情五月婷婷啪啪| 久久久精品人妻录| 天天综合色| 97狠狠色| 丁香五月天啪啪| 性做久久久久久久免费看| 国产精品久久久久9999小说| 亚洲AV久久久久久久久久久久久久久久| 爆乳熟妇一区二区三区四区| 97婷婷五月| 99碰碰中文| 原琪琪色影院| WWW.五月天9999| 夜夜爽日日躁| 99热网站| 99re思思热久久| 婷婷色婷婷| 欧洲综合一区| 亚洲成人av在线| 亚洲99激情| 五月天激情无码专区| 网站免费一站二站| 99精品在线| 色婷丁香91| 九九99香蕉在线视频播放| 婷婷色在线| 五月天婷a| 天天综合久久| 欧美韩国日本| 99视频久久久| 97涩涩丁香五月天| 热久精品| 久久在线视频免费观看| 99免费在线视频| 天天开心婷婷丁香五月| 丁香六月婷婷激情| 五月婷婷啪啪| 六月丁香婷婷综合狠狠爱夜夜爱| 久久九九综合| 亚洲狠狠婷婷| 啪啪干伊人婷婷| 亚洲色五月| 国产精产国品一二三在观看| 久久在线大香蕉| 亚洲五月六丁香激情| 婷婷五月天欧美| 色婷婷在线视频| 九九久久污| 激情五月图| 伊人五月综合网| 精品一二三区久久AAA片 | 丁香五月婷婷久久综合激情网 | 婷婷丁香六月综合激情站| 激情五月四色| 狠狠色综合网| 欧美日韩成人在线观看| 五月天狠狠干| 五月天狠狠| 色婷婷四色| 中文字幕 久久9999| 成人丁香五月天| 婷婷激情五月视频| 色五月综合网| 性爱综合网| 五月婷婷人人人操| 99热精品在这里| AA片在线观看视频在线播放| 色色99| 97色女人在线| 日韩 mm 不卡| 色久综合天天做视频| 九九综合久久| 亚洲操操| 丁香九月久久| 91网站黄| 久热超碰91| 亚州第一A片| 伊人成综合五月婷婷| 96人人操人人操人人| 人人综合久| 中文av在线观看| 亚洲激情免费视频| 日韩成人中文| 26UUU亚洲欧美| 久久九九热视频| 日本三级日本三级三级人妇四虎| 殴美综合激情五月天免费视频| 最新日韩AV中文字幕| 色色综合视频| 色婷婷精品视频在线播放| 天天干天天干天天干天天干天天干天天干天天 | 91久久精品无码一区二区三区| 丁婷婷五月天在线播放| 月丁香久久久| 91婷婷五月天嫩女| 免费看片在线观看| 亚洲激情婷婷| 操操精品| 97久久久久| 大香蕉啪啪| 激情五月天丁香| www。五月天激情| 噜噜视频| 色色成人網| 做爰丰满少妇1313| www,婷婷五月天,com| 91色综合网站在线| 激情深爱综合网| 欧美婷婷九月| 九九热中文| 黄网在线免费观看| 任你爽视频| 五月色欧洲| 26uuu成人网| 婷婷五月天视频亚洲| 成人短视频在线免费观看| 少妇人妻人伦A片| 91爱啪啪| 日本不卡一区二区三区| 成 人 色 色| 玖玖五月丁香| 丁香五月天色婷婷| 深爱开心激情网| 97超级免费无码| 玖玖爱综合网| 97色色色视屏| 波多野结衣成人作品在线| 超碰在线综合| 精品无码av丁香五月激情| 日韩AV免费电影在线播放| 香蕉AV777XXX色综合一区| 激情中文在线| 五月激情综合网| www.成人婷婷综合| 99啪啪视频| 国产精品天天狠天天看| 婷婷五月天久久久| 欧美激情综合| WWW.HENHENL.| 9久精品视频| 秋霞影音91人妻久久| 亚洲激情五月| 午夜丁香婷婷| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 曰曰久久| 视频这里只有精品16| 久久精品女人天堂AAA| 五月天综合视频| 思思久久青草热| 92久久| 婷婷99视频全集高清| 久久视频婷婷| 久热视频这里只有精品68| 亚洲天堂啪啪| 丁香五月大香蕉在线99| 欧美熟女99| 丁香色综合| 狠狠狠婷婷五月综合| 超碰免费电影| www.夜夜操| 操逼六区| 99热精品免费在线观看| 天天色综合天天| xxxx五月天色色| 超碰av在线| 婷婷成人AV| 97五月天婷婷| 色六月天天激情综合网| 99热线观看9| 伊人久久婷婷五月综合97色| 久久亚洲婷婷| 六月丁香激情| 91久久婷婷人人澡草| 888精品福利地址| 婷婷激情九月| 激情综合在线播放| 99热10在线高清播放| 99免费在线视频| 久综合| 色五月色五天免费视频| 热99只有精品| 婷婷亚洲五月丁香综合在线| 色综合色五月| 色情五月天。| 国产在线视频1234| 婷婷丁香精品视频在线观看| 无码人妻少妇色欲AV一区二区| 99亚色色色| 五月婷婷|欧美| 1024在线观看免费视频| 五月丁香六月激情网站| 亚洲日韩一页精品发布| www.久热| 色五月丁香五月| 99色综合网| 欧美视频五区| 玖玖婷婷五月| 激情婷婷五月天| 思思精品视频| 狠狠干综合网| 996热re视频精品视频这里| 五月色欧洲| 激情网 五月天| 久久er+| 亚洲激情五月婷婷日日| 亚洲精品欧洲精品| 激情六月五月婷婷综合网| 激情小说五月丁香在线视频观看视频| 色婷婷亚洲婷婷| 婷婷五月激情综合| 在线日韩视频| 蜜乳9188| 婷婷五月情色| 色高清无码视频| 婷婷五月天a| 天天干天天爽天天操| 一级A片天天操夜夜操| 天天舔天天摸天天透| 激情九九这里只有精品| 五月婷六月婷婷| 人人草人| 七七色色综合| 免费黄色视频网址| 久久性爱视频| 99国产精品白浆在线观看免费| 少妇水多A片太爽了| 在线播放人妻| 国产婷婷久久| 色婷精品91| 五月丁香久久精品在线观看| 丁香无五月网| 色情免费视频播放| www.99视频| 欧美久久网| 天天爱天天爽| 久久大大香| 婷婷性爱视频在线| 五月天久久婷婷| 千人斩操逼| 国产精品香蕉| 日本久久人人| 99精品在线| 9999热免费视频视频| www.99精品视频| 九九热在线观看6| 婷婷六月久久| 天天爱天天操| 久久草大香蕉| 99情色五月天| 综合色图区| 色宗合久久五月婷婷| 五月婷婷五月天在线| 色五月丁香婷婷| Www.sesese丁香| 色婷婷五月天成人网| 色必久悠悠影院| 激情VA视频| 99热官网精品在线| 丁香婷婷狠狠97| 综合性爱网| 午夜九九电影| 久久性刺激| 欧美69久成人做爰视频| 五月天久久网站| 婷婷六月婷婷| www.色婷婷.com| 第九色区av天堂| 五月丁香综合成人社区| 五月天婷婷爱丁香中文字幕| 婷婷五月天激情网| 欧美成人AAA片一区国产精品| 高清国产AV| 六月丁香婷啪射| 99在线视频精品| 五月婷婷香蕉| 热99国产精品| 96丁香六月婷婷蜜桃综合久久| 五月婷婷综合在线| 毛片新网地| 四月婷婷丁香| 婷婷在线视频| 99网址在线看| 婷婷五月花西瓜| 久热超碰| 欧洲毛片基地c区| 五月婷婷五月天激情网| 色综合色色| 91人妻人人操人人爽| 激情五月天www| 欧美日韩成人| 99精品自拍视频| 五月婷婷丁香婷婷| 激情五月天天| 色必久悠悠影院| 91婷婷丁香| 99噜噜噜| 洗浴中心操B视频| AA片在线观看视频在线播放| 97久久久久| 天天爱天天操| 免费观看日韩成人av| 婷婷五月天99| 亚洲婷婷五月天| 啪啪综合网| 久久婷婷色色| 9999热在线免费观看| 婷婷五月天激情综合深爱激情| 婷婷六月色| 亚洲另类婷婷五月丁香在线播放| 99九九综合久久九九| 欧美啪啪五月天| 婷婷瑟瑟五月天| 97久久婷婷色| 开心五月综合激情综合五月| 五月婷婷综合网| 婷婷激情五月天网站| 91久久久久久久| 99久在线观看| 91青娱乐青青草| 激情久久 婷婷| 久久这里有精品| 99色在线免费观看视频| 啄木鸟丝袜美女福利视频| 91夫妻网站九色| 久久在线人妻| 伊人婷婷99热精品| 99热色在线精品| 九九色婷| 激情五月天色婷婷| 成人va在线| 欧美黄色韩日网| 国内在线99视频| 天天天天天天操| 婷婷丁香五月激情密臀av| 丁香五月六月| 色伊人啪| 操操啪| 丁香九月综合| 欧美肉大捧一进一出免费视频| 色久婷婷网| 国产AV熟妇人震精品一品二区| 婷婷深爱五月亚洲综合| 色和综合网| 曰日爽日日操| 99精品国产在热久久婷婷| 一级二级色大片| 色五月琪琪| 欧美激情综合| 五月天激情无码高清| 丁香婷婷婷婷十二月在线观看视频| 色XX综合网| 天堂成人久久| 天天日天天干天天操| 美女婷婷六月色| www,setingting| 色五月激情五月开心五月| 五月丁香婷婷综合久久| 99性爱| 思思w99| 亚洲色基地| 婷婷五月天开心网| 五月丁香婷婷人体| 久久九九囯产| 操人无码| 五月天婷婷影院影院| 99色.com| 五月激情在线| 热99只有里视频| 亚卅毛片| 国产亚洲精品AAAAAAA片| 一级操逼内射在线视频| 在线你懂的亚洲欧| 成人视频网| 久久婷婷五月免费视频| 国产精品久久久久久白浆色欲| 天天操综合网| 天天插天天插天天插天天插| 99操碰| 五月天天丁香婷婷| 亚洲网站999| 天天综合干| 97热九九| 欧美私人家庭影院| 五月精品| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 日韩黄色中文字幕| 激情人妻综合| 丁香婷五月| 91婷色| 久久婷综| 五月在线| 深爱五月激情| 色五月婷婷少妇人妻| 色综合偷拍| 国产在线aaa片一区二区99| 天天色视频| 五月婷婷少妇之| 久超超碰| 丁香五月欧美婷婷| 99无码精品| 色色色网站| www国产亚洲色婷婷com| 996热| 激情婷婷九月| 91人在线观看| 99色在线视频| 成年人丁香五月| 亚洲99视频| 亚洲性受XXXX五月丁香| 国产免费av在线| 色吧婷婷五月亚洲| 操骚货在线| 欧美啪啪9| 婷婷丁香色无五月| WWW五月天| 亚洲激情四射| 久9免费视频| 色婷婷精品视频在线播放| 无码日本精品XXXXXXXXX| 久久99操| 在线只有精品| 五月天另类图片| hd五月婷婷在线| 五月婷婷色播视频| 亚洲最大在线| 五月久久婷婷天堂视频| 久久丁香婷| 91狠狠色丁香婷婷综合久久狠丁香综合久久精品| 操一区| 9久热在线视频精品| 99精在线| 国产精品成人av在线观看春天| oumeisesewang| 丁香色六月| 狠狠色婷婷7777久| 天天色天天射天天日| 九色 在线| 99热色婷婷| 色九九丁香九月色九九色| 91色五月在线观看| 五月丁香婷婷五月色| 亚洲欧洲中文日韩久久AV乱码| 99精品视频在线观看| 五月在线| 久久综合人妻| 亚洲操操| av色色国产| 99视频在线精品免费观看2| 久九色| 五月婷婷综合久久| 欧美精品99| 大香蕉五月丁香| 五月丁香久久网| 九九操操| 丁香五月电影| 天天爽天天干| 人妻久久久| 91 九色大美女| 婷婷丁香六月天| 欧美成综合在线观看| 六月丁香成人| 色激情五月| 97香蕉碰碰人妻国产欧美| 色色色国产| 五月天激情小说婷婷| 色综合爱综合| 六月婷婷激情小说网| 午夜激情五月天| 婷婷丁香五月天激情| 五月婷啪啪| 丁香六月在线| 丰满少妇猛烈A片免费看观看| 国产精品久久久久久久久久久久| 免费看欧美成人A片无码| 黄网在线免费| 九九九九九九九九九九九九九国产精品| 综合 蜜月 婷婷| 香蕉婷婷色五月| 五月丁香久人妻中文| 日日干夜夜撸夜夜骑| 国语精品探花| 久9久成人精品视频| 依人大香蕉| 国产3p露脸普通话对白| 五月丁香激情综合网官网| 2022人人操人人看| 狠狠香蕉| 五月激情偷拍婷婷| 五月花免费视频| 色吧五月| 狠狠爱深色婷婷综合| 黄色91在线观看| 天天综合情| 亚洲色vA| 欧美日本国产欧美日本韩国99| 亚洲无码99| 五月天啪啪网| 色婷婷操逼| 九九热在线视频,| 无码色| 色色99| 五月丁香久久丝袜啪啪| 国产精品久久99| 99成人精品视频| 大香网伊人久久综合| 天天日天天久久青青| 激情久久久久久久久久| 天天做天天爰天天爽天天无遮挡| 丁香六月情| 色99视频| 免费人人操| 色婷婷丁香五月丁香| 99亚洲视频| 这里只有精品96| 色综合综合色| 婷婷色成人| 五月天成人在线视频网站| 五月婷婷丁香综合,亚洲天堂| www.夜夜| 五月色影院| 特级西西4444www无码| 婷婷伊人综合| site:hcxsz888.com| 99久在线精品99re8热| www.色婷婷| 色天堂在线| 五月丁香花婷婷玉莉AV| 伊人五月综合网| 亚洲精品网址| 色五月天网| 特级西西4444www无码| 丁香花操逼| 五月丁香成人版| 五月婷婷婷婷| 涩涩婷婷五月| 天天做 天天爱| 色婷婷网| 人人操AV| 播五月丁香三月婷婷| 久久五月天激情| 97亚洲色 torrent magnet| 五月婷婷激情| 情色五月天 网站| 五月婷婷色播网| 日本久久高清| 久久一级片| 婷婷草| 日韩精品一区二区三区,四区,五区视频| 91精品国产91久久久久青草| 天天五月天综合网址| 综合欧美五月婷婷| 丁香六月婷婷缴情欧美| 成人网站在线观看视频| 成人在线视频一区| 丁香婷婷视频一区二区| 国产69久久久欧美黑人A片| 五月婷婷另类| 人人澡玖玖一| 成人午夜免费电影| 四月丁香五月婷婷久久| 九九色插| 严洲天天插| 熟惀91九色在线| 天天婷婷操| 91久操| 丁香婷婷综合精品六月初| 色色色欧美| 婷婷伊人中文字幕| 天天射综合网站| 欧美日韩123| 8区视频在线| 一区视频网站| 99干日本| 日韩在线视频网站| 精品久久9| 亚洲旡码| 六月婷婷综合| 婷婷五月天AV| 亚洲综合激情五月久久| 九九热这里只有精品5| 涩综合婷婷| 天天 青草 制服丝袜 在线| 九九热最新地址| 99色色热| 青草青草视频2免费观看| 丁香五月激情六月| 91色性感五月婷婷丁香| 5月丁香六月婷婷|