免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

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
返回資訊列表
国产午夜精品一区二区三区嫩草| 欧美精品久久久久久视频观看| 久久婷婷五月综合伊人| 欧美婷| 婷婷国产五月天17c| 丁香婷婷色五月| 久久只这里有精品| 天天人人综合| 棕合影院色色| 欧美婷婷综合网| 五月婷婷色五月| 五月丁香婷婷激情澎湃四射| 2020久久婷婷五月| 天天日天天做天天舔| 国产女人十八水真多1| 天天色天天操天天射| 亚洲夜夜操| 99久在线观看| 超碰a女人的天堂| 99在线免费观看| 日本美女五月天| 婷婷狠狠久久| 、激情六月天| 337p大胆噜噜噜噜噜91Av| 91人人爱| 丁香五月婷婷av影院| 久久98| 五月深爱网| 丁香五月情色| 亭亭五月丁香综合欧美| 色婷婷亚洲| 日日操夜夜操不卡| 91干婷婷| 九色综合网| 六月丁香激情网| 人人爱人人草| 免费观看大片视频 丁香婷婷 六月欧美| 99热精品一区| 九九热视频免费的| 97色色色视频| 99r这里| 六月激情久久婷婷| 狠狠色激情在线| 五月丁香婷婷综合网| 婷婷第一页| 日韩有码一区| www.91AV.COM| 9月色婷婷| 日本玖玖在线| 老师把我爽高潮了免费A片| 色一色综合| 国产毛多水多女人A片| 激情五月丁香婷婷| 少妇性BBB搡BBB爽爽爽视頻| 思思热99er| 最近免费中文字幕大全高清大全1| 狠狠操天天干| 牛牛热这里只有jingpin| 成熟妇人A片免费看网站 | 狠狠色综合图片| 丁香五月影院| 丁香五月婷婷综合激情哟哟哟| 国产精品A成V人在线播放| 五月丁香六月婷| 婷婷激情小说| 五月婷婷色在线| 中文字幕视频色婷婷| 99视频| 成人.在线日韩| 亚洲欧美日韩VIP| 亚洲视频在线观看| 久久久五月天婷婷成人网| 玖玖伊人网| 欧美日韩中国| 激情婷婷五月| 丁香六月色香蕉视频| 亚洲色综合| 性爱动图国产麻豆一区二区三区| 亭亭色天香| 丁香五月天激情综合网| 色五月天电影| 天天操天天插| 97成人在线视频| 色婷婷色| 天天干夜夜操A片| 色国产五月| 狠狠人妻久久久久久综合丁香| 丁香五月天婷婷久久| 激情五月六月婷婷综合啪啪| 五月激情婷婷丁香天堂| 五月婷婷激情五月| 精品9l九九九九九77777| 中文字幕av久久爽| 玖玖视频福利| 五月婷婷丁香综合网| 天天天综合网| 六月婷婷色综合| 双性美人被调教到喷水A片| 五月久久综合| 色伊人婷婷| 丁香蜜臀黄色婷婷五月天| se色99| 天天爽夜夜爽天天爽夜夜爽| 久久九九免费视频| 日本丰满久久| 98毛片| 久久AV电影| 激情六月婷婷| 超碰在线观看三级片| 人妻中文字幕网| 狠狠综合| 1区2区视频| 99热综合| 九九干视频| 激情五月综合视频| 婷婷五月天Av| 天天综合网~91| 久久在线人妻| 亚洲在线综合| 国产一级黄色影片,| 久热91精品| 成年AAAA色情| 国产精品久久..4399| 欧美顶级少妇做爰HD| 中文字幕在线不卡视频| 深爱五月中文字幕| 五月天综合婷婷| 久久婷婷桃花五月天| 中文网AV| 97人人做| 精品综合爱| 777久久精品| 可以直接看的av| 国产精品色| 99色.com| 99re最新地址| 国产成人精品一区二三区熟女在线| 色婷婷操逼网| 91精品综合久久久久久五月丁香| www.色五月| AV在线观看网站| 人人草人人视| 99欧美精品99日本精品| 99色看这里只有精品| 丁香五月婷婷亚洲色图| 亚洲精品网址| 九九色综合视频| 久久伊人大香蕉| 激情婷婷网| 丁香五月婷婷亚洲另类| 婷婷五月成人| 亚洲色色在线| 青青草五月天| 伊人网欧美在线男人天堂五月丁香| 五月天综合激情网| 在线免费视频caop| 五月天婷婷丁香社区| 九九色综合| 99碰碰视频| 婷婷婷婷色| 成人中文网| 天天爽天天爽天天爽天天爽天天爽| 综合一区二区三区| 婷婷久久五月天丁香| 婷婷成人五月天成人文学小说| 五月婷视频| 婷婷五月丁香久久| 91Chinese在线| 婷婷五月中文字幕| 99网99热| 婷婷丁香五月91| www.五月天社区| 亚洲熟妇AV乱码在线观看| 久久丁香五月综合六月激情红杏视频 | 婷婷激情五月天在线视频| 亚洲日日日| 欧美色久| 深夜男女福利刺激影院一区完整| 亚洲网视屏| WWW,五月| 97色色婷婷| 综合视频久久| www.久久| 99色视频| 亭亭社区五月天| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 综合色播| 色情激情五月| 九九色插| 色五月涩涩婷婷| 伊人狠狠色婷婷综合丁香一区| 开心激情播播五月天| 秋霞网在线免费基地五月婷婷丁香| 丁香六月成人网| A片试看120分钟做受图片| 狠狠狠人妻| 五月天社区狠狠| 婷婷五月丁香基| 五月天停停成人网| 99久久99视频| 九九婷婷网五月天| 久久五月婷天天干| 伊人玖玖婷婷| 五月天激情网站| 五月天激情站| 另类国产欧美视频| 久久九色| xfplayav在线| 亚洲色图45p| 综合色色网| site:xmssd.com| 亚洲操操操| 91啪级电影| 北条麻妃九九九国产精品视频| 色婷婷丁香香香蕉视频| 丁香五月影视| 九九亚洲天堂| 日本女人久久| 久热这里只有精品99re,久热这里只有精品7| 性按摩玩人妻HD中文字幕| 激情5月天天天| 久草婷| 五月天天综合| 婷婷操逼网| 国产精品A片在线| 九九色99| 看久久性爱视频| 中文在线成人| 少妇高潮A片无套内谢麻豆传| 九九久久视频| 国产亚洲色婷婷久久99精品91| 亚洲乱码日产精品BD| 天天操狠狠操| 丁香香五月激情免费视频| 婷婷99视频全集高清| 天天色视频| 五月丁香色色网| 久久久久久久久久久-久五月天婷婷| 九九性视频| 六月婷婷激情| 99视频在线观看视频| 五月婷婷影| 婷婷亚洲在线| 色色色色色热| 欧美 日韩 成人| 99ri在线视频| 在线中文亚洲| 日日夜夜久| 狠狠爱综合网| 97操碰在线视频| 激情小说五月天| 婷香五月激情视频| 五月丁香婷庭在线| 丁香五月另类小说在线阅读| 亚洲婷婷91丁香| 夜夜嗨一区二区三区直播内容 | 天天色凹凸| 综合五月婷婷| 天天摸天天透天天舔| 99热国产国产| 五月天色导航婷婷资源婷婷| 久久婷丁香五月| 日本激情综合| 熟女人妻视频| 色婷婷影院| 激情五月天开心| 亚洲精品性色| 深爱激情四射| 99热 这里只有精品 国产 日韩| 狠狠干狠狠操狠狠爱| 国产日韩欧美性爱| 亚洲久热| 久久婷婷网| 中文在线视频久1| 色色亚洲无码| 婷婷激情五月天7| 丁香 久久| 婷婷丁香色女人| 人妻丰满精品一区二区A片| 九九99免费视频| 五月婷婷真爱激情网| 337p午夜影院| 初夜av| 丁香六月婷婷综合激情欧美 | 五夜婷婷| 日本一级| 色久九| 九九無妻| 天天爱天天做天天操| 精品一区二区三区木瓜| 婷婷激情综合网| 天天插天天狠| 色五月婷婷天天干| 国产精品五月丁香| 欧美成人网婷婷综合在线| 综合欧美五月婷婷| 天天摸,天天爽| 婷香五月网在线| 91色久| 久久多色| 丁香色五月婷婷17C| 六月婷婷av| 99久久婷婷五月综合| 亚洲成人AV在线| 国产高潮白浆一区二区| 免费看无码视频A级| 五月婷综合激情| 99re久热| 97色女人在线| 丁香婷婷大香蕉| 狠狠综合久久| 99在线爽| 丁香六月天之亚州热女 | 色婷婷av在线| 丁香婷婷精品视频| 婷婷五月天com| 婷婷开心综合人妻小说网址| 婷婷深爱五月| 91操网| 五月婷婷天| 亚洲另类电影| 婷婷六月丁综合| 久久日本wwww色| 成人AV综合在线| 狠狠色噜噜狠狠| 婷婷五月AV| 亚洲成人在线播放| 久久综合天天综合| 91无码高清| 99无码视频| 日韩aaaaa| 欧亚成人A片一区二区| 五月丁香久久综合91| 色五月婷婷丁香凹凸| 9久久久| 丁香六月婷婷综合| 婷婷五月精品在线| 亚洲成人高清在线| 亚洲成人AV电影在线| 久久六月综合| 无码se| 色五月aV| 欧美成人va| 久久综合中文| 婷婷综合天堂| 天天综合久久| 五月花在线观看视频| 久久婷.com| 777精品久无码人妻蜜桃| 9 1大香蕉| 久超超碰| 五月天婷婷视频30| 丁香五月成人社区| 婷婷久久色| 91久久99久久91熟女精品| 狠狠五月天婷婷| 99综合| 91超碰人人操| 99久精品| 狠狠干青青草| 色色亚洲视频| 九九精品热播| 国产美女最新VA在线免费观看| 女人天堂AV| 日本色婷婷| 伊人九九综合| 99久久免费精品| 俺去也五月天婷婷| 亚洲色图81p| 婷婷五月天激情综合婷婷五月天激情综合| 天天肏天天肏天天肏| 色婷婷成人做爰A片免费看网站| 九九色天堂| 狠狠婷婷爱| 婷婷色色丁香五月天| 日日操夜夜擼| 色五月涩涩婷婷蜜桃| 欧美丁香五月| 色九月丁香婷婷蜜桃在线观看| 国产激情综合五月久久| 射久久丁香五月| 国产看真人毛片爱做A片| 91成人看片| 五月婷婷丁香六月在线| 婷婷色网| 一逼色综合| 91精品久久久久、久五月天| 九月停停| 国产片色| 大香蕉啪啪啪| 久久婷婷六月天| 日日夜夜干| 婷婷亚州综合| 五月草视频| 成人免费黄色短视频| 久久视频66| 六月丁香色色| 色婷婷偷拍| 五月综合色播播丁香婷婷| 日本猛少妇色XXXXX猛叫| 99热新网址| 欧美中文五月天| 亚洲av另类在线观看| 一本久久亚洲五月婷婷| 大陆极品少妇内射AAAAAA| 婷婷色婷婷亚洲成人| 丁香五月手机在线| 色五月琪琪| 99久久精品国产色欲| 五月天激情亚洲| 青青福利网| 日韩中文字幕| 这里只有精品久| 99色色网| 狠狠色五月| 精品夜夜澡人妻无码AV| 伊人婷婷激情| 91夫妻视频| 五月丁香六月婷婷中文版| 开心五月婷婷| 丁香五月视频在线观看| 操B视频在线播放| 色婷婷成人在线| 五月婷婷深深爱| 天天激情视频| 99久久婷婷国产综合精品| 婷婷伊人五月| 综合久久综合五月天婷婷| 伊人五月天婷婷| 色欲五月丁香| 丁香五月亚综合图片| 在线一起草av| 色丁香五月| 中文字幕人妻在线| 大香网伊人久久综合| 国产激情综合五月| 婷婷色色亚洲| 亚洲综合五月| 亚洲一级色电影| 丁香五月婷久久| 久久久精品99亚洲综合| 五月婷婷色色爱| 狠狠色综合网站久久久久| 色婷婷激情四射视频| 激情中文在线| 激情五月天综合网站网站网站| www.婷婷六月天| 天天婷婷天天| 伊人丁香五月婷婷潮吹| 色丁香婷婷| 激情久久久| 亚洲妇女熟BBW| 999热成人在线综合网| 美欧成人视频| 婷婷久久大香蕉| 五月天婷婷深深爱| 青青草轻轻操| 国产亚洲成AV人片在线观黄桃| 99热精地址| 懂色av蜜臀av粉嫩av永陈冠希| 五月色网| 亚洲男人的天堂婷婷色五月| 91热视频色网站| 五月亭亭直播| 色婷婷激情五月天| 五月婷婷激情综合| 久久99人人| 五月婷婷色| 色色色色色热| 91超级碰人人操| 色综合婷婷| 婷婷六月插屄激情| 久99视频在线观看| 97在线日韩| 99热精品在线观看| 天天色综合网1| 久99视频在线观看| 国av网| 亚洲无码播放| 日本五月视频| 精a品a视a频| 噢美99| 色吧五月| 丁香五月婷婷色偷偷| 亚洲操逼片| 噢美99| 久草大| 狠狠插狠狠| 日本色婷婷| 五月婷婷久久爱| 色综合伊人网| 婷婷五月天丁香社区| 婷婷丁香五月天欧美| 99丁香五月婷婷在线| 欧美色五月| 色五月婷婷大香蕉| 久久九九大香蕉电院| 激情综合五月丁香| 另类亚洲视频| 嫩草哈哈操| 欧美精品999| 色老久久| 五月丁香婷婷AV| 伊人国产婷婷五月天| 9久精品视频| 国产综合丁香五月天| 99精品成人无码A片观看金桔| 日韩成人AV在线播放| 五月天综合激情网| 久久久久人妻精选| 婷婷中文字幕版| 99亚洲精品视频在线观看| 国产精品视频网| 色.五月综合网| 丁香婷婷六月| 日日色综合| 狼友超碰| 99操免费视频| 日本天天色| 五月天色婷婷伊人网| 日韩狠狠色婷婷| 99热伊人| 97色色婷婷| 99色中文| 激情黄色小说色五月| 久青草大香蕉| 成人AV网站在线| 五月色情婷婷| 狠狠色婷婷丁香五月| 九九综合九| 中国丰满熟女A片免费观| 天天狠狠夜夜狠狠2023| 色5月婷婷| 99综合| 婷婷大香蕉| 五月婷婷六月天| 91超碰在线播放| 久久婷婷内射| 久久婷婷色综合| 五月综合激情| 中文字幕永久免费| 婷婷爱五月天| 亚洲精品V天堂中文字幕| 婷婷五月天色| 97精品人人A片免费看| 极品少妇高潮啪啪AV无码| 色色综合网站| 亚洲九N| 精品一二三区久久AAA片| 成人无码精品1区2区3区免费看| 国产成人片| 风流少妇A片一区二区蜜桃| 99综合视频一体| 免费无码毛片一区二区A片| 五月激情天| 亚洲国产精品VA在线看黑人| 精品日本视频444| BlACKEDRAW视频一区二区| 99操不停| 99热e| 伊人99热| 激情综合激情五月| 亚洲第一精品网站| 香蕉操亚洲| 激情综合五月| 国产毛片精品一区二区色欲黄A片| 一本色道久久88综合日韩精品| 嫩BBB搡BBBB榛BBBB| 天天色综网| tingtingseav| 丁香六月婷婷久久高清| 色八月婷婷| 五月永久激情| 五月天激情网图片| 天天日,天天插| 一区二区乱视频码| 婷婷丁香五月激情密臀av| 天天色丁香| 色综合久久44| 五月婷婷三级| 五月婷成人网| 91 久热| 国产亚洲精品久久一区二区三区| 99热91| 少妇AB又爽又紧无码网站 | 九九人妻福利| 婷婷激情六月中文| 五月伊人网| 亚洲成色综合网站免费观看| AV网址大全在| 五月婷婷六月丁香综合在线| 99色热综合| 99视频在线观看网址| 五月丁香六月激情欧美综合| 色五月天在线| 国产激情av| 99热这里只有精品99| 五月婷婷丁香狠狠撸久久| www.yw色| 成人做爰A片免费看网站找不到了| 色色 亚洲| 丁香花色色网| 五月丁香婷婷激情图片| 99国产在线| 中国激情网| 玖玖爱综合网| 国产在线网址1| 色九九综合| 色了色综合| 人人干99| ai97re99一本| 日本天天色| 无人精品在线视频| 精品综合久久久久久五月天| 婷婷五月色综合| 操老逼综合网| 五月丁香婷婷啪啪| 丁香五月婷婷在线观看| 国产色丁香| 美女91一起草| 538在线精品| 激情综合网址| 精品无码99| 色狠狠激情五月| 超碰色女人| 亚洲亚洲人成综合网络| 超碰在线观看99| 97好吊操| 国产永久一二一起草| 91视频免费后入强操| 爱久久小说下载网| 婷婷综合激情| 激情綜合網址| 欧美日本va| 五月激情婷婷开心五月| 中文字幕综合网| 碰人人97| 在线成人va| 色情婷婷| 九九99精品视频| 99精品免费欧美小视频 | 蜜臀A∨在线水帘洞| 97干视频在线| HD久久精品视频| 99re热视频这里只精品| 激情五月影院| 婷婷色九月| 色五月婷婷很很操| 可以免费看的av网站| 激情文学天天| 开心五月六月婷婷| 久久婷婷精品| 激情伊人| 亚州操操| 色婷久九| 91人人操| 日本黄色精品| 四川操逼站| 99热热热天天人人人超超碰| 五月开心播播网| 五月天综合| 婷婷激情小说| 婷婷五月六月丁香| 婷婷五月天小说网| 激情综合五月| 久久婷婷六月综合| 欧美婷婷| 久久久18| 成人丁香五月| 六月丁香激情网| 综合大香蕉| 亚洲色图五月丁香| 久草视频一,二三四| 激情婷婷丁香| 91婷婷丁香五月| 99爱视频| 91色色色18| 99在线资源| 午夜成人天堂久久无码日韩久久| 91操片| 香蕉综合在线| 婷婷亚洲天堂| 五月丁香激情综合| 日本一级一级一级一级| 精国产品一区二区三区A片| 欧美交换配乱吟粗大25P| 性做久久久久久久免费看| 99热久久这里只有精品| 精品无码久久久久久久久| 香蕉人妻AV久久久久天天| 风流少妇A片一区二区蜜桃| 精品夜夜澡人妻无码AV| 伊人久久丁香五月91| 久久九九思思| 97香蕉人人在线观看| 五月婷久久草| 亚洲综合婷婷| 免费AV黄在线播放| 五月激情基地| 99热都是精品| 综合大香蕉| 综合网激情| 欧美电影在线播放| 色五月噜噜| 色青五月天| 99碰网站| 99热 免费| 思思久久思思| 五月天色丁香| 99热日本| 亚洲妇女熟BBW| 色婷婷播放| 91视频五月丁香| 99久久亚洲精品视频| 激情五月婷婷网在线观看| 婷婷天天综合| 激情婷婷六月天| 久操大香蕉| 99热久久这里只有精品| 日本玖玖在线| 日韩操逼大片| 五月激情开心婷婷| 色婷婷丁香五月在线观看| 丁香五月区| 久99热| 一级内射毛片| 另类亚洲2| 国产丁香五月天婷婷| 99无吗| 97在线精品| 成人无码精品1区2区3区免费看| 另类图片五月激情| 蜜臀AV在线成人| 天天综合色综合| 日日夜夜天天| 久草热8精品视频在线观看| 啪啪操网| 精a品a视a频| 日韩在线五月天婷婷| 91色噜噜狠狠狠狠色综合| 免费做A爰片77777| 婷婷中文字幕网| 色色色精品无码区| 激情六月色| 超碰免费人人| 91综合在线观看首页| 无码九九| 激情综合激情综合| 久草热8精品视频在线观看| 婷婷五月丁香色播| 天天日人人| www.99日本| 亚洲字幕AV一区二区三区四区| 九九综舍久久| 天天操天天谢| 五月天婷婷色色| 五月婷婷综合在线视频| 五月色婷婷在线观看| 五月婷婷色五月| 国产乱妇无乱码大黄AA片| 五月天婷婷社区久久综合| 色综合五月在线| 翔田千里 50岁 无码| 日韩av免费版| 男人天堂伊人五月丁香| 夜夜躁婷婷AV| 日本久久九| 五月天激情偷拍| 综合网啪| 99热最新国内| 99精品视频在线6| 99a级片| 嫩草免费视频| 26uuu.| 日本操碰碰| 婷婷亚州综合| 五月天影院婷婷在线观看| 久热久| 久久婷婷亚洲无码一起| 色综合日日| www.99视频| 996热re视频精品视频| 九九视频这里只有精品| www.97视频| 九九热这里只有精品556| 婷婷成人五月天| 久久久亚洲成人无码A片| 天天摸天天舔天天爽| 中文字幕在线日亚州9| 888久久久| 99热的无码| 国产片XXXXA片国语对白| 日韩中文欧美| 久久停停超碰| 久婷久婷激情肉| 色五月丁香五月天| 五月停视频天堂| 无码人妻一区二区三区四区| 日韩一级片| 三级三久久线久久99久目本WW| 97色色网| 免费AV在线网址| 热思思| 色欲五月丁香| 五月天婷婷影院影院| 99精品网| 天天爽天天日人人爱 | 操久久精| 亚洲九九视频| 99免费青青蜜臀| 国产精品热搜丁香五月婷婷| 色色色五月天婷婷| 激情 婷婷 丁香五月天| 亚洲欧洲中文日韩久久AV乱码| 天天色·欧美| 丁香五月天激情| 丁香五月天天哦| 婷婷社区五月天| 天天插天天玩天天干| 另类天堂| 五月婷婷色色| 91五月天| 五月激情五月丁香| 久久女婷| \\五月天婷婷激情| 亚洲情综合五月天| wwwxxx五月婷婷小说| 中文字幕网伦射乱中文| 先锋av性爱成人电影| 超碰婷婷色| 天天爽夜夜爽夜爽精品| 99热最新国内| 久久只有18视频| 97艹| 六月撸婷婷| 亚洲一级色电影| 狠狠爱综合网| 婷婷丁香77777| 亚洲精品又粗又大又爽A片| 五月天成人网婷婷| av五月天婷婷丁香| 99精色| 亚洲人人操| 99九九热在线观看| 99热最新地址在线| 亚洲欧美在线观看| 99热99热99热99热| 色综合香蕉| 大香蕉综合| 综合欧美五月婷婷| 日日影院 | 亚洲第一色区| 玖玖婷婷精品| 99热官网精品在线| 五月婷婷天天色| 婷婷中文字幕欧美| www.婷婷五月| 婷婷五月丁香久久| 丁香五月天社区| 99亚洲色| 狠狠爱婷婷丁香| 五月丁香| 五月婷婷成人w| 久久一操| www.久久久.com| 亚洲精品五十一区| 一区二区你懂的| 免费啪啪亚州视频| 丁香五月婷婷综合视频| 五月丁香综缴情性爱| 亚洲99在线| 亚洲热手机在线观看| 九九无码AV| 七七色色综合| 激情影院内射| 99碰碰碰| 国产亚洲色婷婷久久99精品91| 婷婷亚洲激情在线观看视频 | 人妻videos人妻高清| 久久婷婷电影| 泰州成人视频| 这里只有精品视频一区| 欧美图片丁香五月天| 91一起操| 色视频五月天| 精热在线综合网| 九月色婷婷婷| 亚洲激情网| 亚洲丁香网| 91丨九色丨白浆秘| 色色网站毛片| 久久与婷婷| 色婷婷综合中心| 性色av大香综合| JAPANRCEP老熟妇乱子伦视频| 很很干夜夜干| 99这里是99在线视频| 1024在线视频| 九热视频| 色婷婷久久| 日韩无码人妻一区二区三区综合| 成人网站av免费网站推荐| 极品少妇高潮啪啪AV无码| 亚洲热视频| 色9色| 色婷婷啪啪啪啪啪啪| 精品人妻午夜一区二区三区四区| 综合久久高清| 激情婷婷五月天在线观看| 久久五月网| 色在线免费观看| 激情婷婷六月天| 日韩色色视频| 西瓜美女a片| 色99视频| www.99免费视频| 国产人妻777人伦精品HD| 成人AV中文字幕| 丁香五月婷婷天| 丁香色五月婷婷17C| 午夜日韩久久久网站| 无码激情AAAAA片-区区| 五月天激情图片| 天天爽天天摸人妻综合网| 插插插丁香五月婷婷| 久久电影4399| 99热亚州综合| 被强行糟蹋的女人A片| www.五月婷婷久久.com| 亚洲精品午夜国产va久久成人| 天天草天天爱| 九九热九九| 97超级碰碰碰| 91午夜婷婷狠狠久久综合9色| 激情深爱五月天| 啪啪婷婷五月天激情| 五月激情婷婷六月| 五月五丁香婷婷| 丁香婷婷人妻| 亚洲性爱电影| 色婷婷最新域名| 97五月婷| 男女啪啪做爰高潮无遮挡| 91Chinese在线| 天天插天天干| 精品亚洲VA网站| 严洲天天插| 久久这里只有精品07 | 丁香九九九九| 99热这里只有精品99| 开心五月天激情| 在线综合婷婷| 九九热再线九九视频免费在线观看 | 亚洲AV影片在线观看| 亚洲中文字幕在线观看| 欧美25p| 日本色图综合| 91要啪| 五月婷婷激情中文字幕| 成人色五婷婷| 五月色天情| 婷婷娱乐丁香综合网| 久久五月丁香综合17C| 99色看这里只有精品| 九九热这里有精品视频| 开心婷婷中文字慕| 狠狠干综合| 超碰在线成人| AV在线资源| 色色色国产| 大香蕉婷婷色| 操久久网| 99精品自拍| 色综合色| 无码地址| 热久久思思热思思| 亚洲性爱干干| 五月丁香婷婷激情在线视频| 亚洲精品欧洲精品| 激情综合五月激情| 九九热这里只有精品556| 好好干Av| 六月激情婷婷色| 激情五月图| 婷婷丁香六月影视| 精品人妻久久久| 五月婷婷免费| 欧洲第一久色| 激情五月天小说| 激情五月综合婷婷| 成人五月天丁香婷| 91超级碰碰碰| 日本狠狠干| 成人精品一区日本无码网 | 99热九九这里只有精品10| 色婷婷五月天激情在线播放| 婷婷丁香一月| 丁香色情五月综合网站| 天天做天天摸| 99这里只有精品| www.久久久.com| 五月婷视频| 亚洲精品国产熟女久久久| 99精品丁香五月| 久久99免费视屏| 另类视屏| 丁香五月婷婷激情网| 亭亭丁香aV| 亚洲狠狠婷婷综合久久久| 午夜无码精品色综合久久| 99热亚洲精品| 国产在线黄色| 天天日日夜夜| 97成人丁香| 国产成人AV在线播放| 综合色色婷婷| 婷婷五日b| 啪啪亚洲综合| 丁香婷婷九月| 激情五月综合网| 久久5 9视频免费观看| 天堂久久大香蕉| 久99久在线| 激情综合网五月天天| 色丁香五月婷婷在线| 亚洲人人操| 婷婷五月天小说| 超91热| 婷婷人人操| 欧美婷婷五月激情| 色五月婷婷影院| 久久九九网| 99re热视频这里只精品| 99视频在线观看视频| 伊人激情| 久久久五月婷婷| 五月丁香好婷婷A片网| 九九热免费视频| 日本情色一区二区| 久久五月婷婷电影| 久久九九大香蕉电院| 在线观看av网站| 人妻丰满精品一区二区A片| 五月天婷婷丁香人人操91| av在线观看免费| 五月丁香六月花| 综合AV在线| 少妇水多A片太爽了| 午夜婷婷久久 | 丁香六月婷婷| OUMEIRIHANCHENGREN| 思恩热国产视频右线观看| 五月天激情开心网| 日韩成人无码人妻| 日韩成人精品中文字幕电影| 182TV亚洲| 极品人妻videosss人妻| 久9视频免费播放| 国自产拍偷拍精品啪啪一区二区| 久久久精品99| 狠狠另类视频| 婷婷狠狠97| 少妇人妻丰满做爰XXX| 大香蕉婷婷丁香| 色五月激情综合| 日本三级中文字幕| 爱iii做iiii日| 五月激情啪啪| 婷婷五月丁香基地| 99噜噜噜在线播放| 色情五月天丁香社区| 思99热精品久久只有精品| 中文字幕AV在线播放| 九九艹女| 婷婷六月丁香在线| 婷婷六月色开| 性做久久久久久久免费看| 黄色精品五月婷婷| 性生活久久朋友人妻| 色丁香五月婷婷| 人人操女人| www.亭亭五月天| 五月丁香婷婷色| 91久久九久久九久久九久久九久久| 天天开心AV色综合婷婷五月天| 九九99精品| 98色丁香五月婷婷综合网| 四五月婷婷| 五月天婷婷在线视频| 99热销国产这里有精品| 五月天婷婷五月| 六月丁香啪啪| 国产成人综合在线| 91婷婷五月天嫩女| 国产在线激情视频| 国产亚洲色婷婷99精品| 婷婷情色五月天| 九色porny在线观看激情四射| 成人色情五月天婷婷丁香| 丁香婷婷久久 | 丁香婷停五月激情综合深爱| 激情综合网五月| www.色婷婷.com| 六月色播| 97碰碰久久| 99成人精品六| 97热这里只有精品| 99九九在线观看免费| 开心激情网五月天| 九色亚洲| 天天操夜夜玩!| 欧美婷婷| 日本va欧美va欧美va精品| 色五月婷婷操逼| 玖色色综合| www.深爱激情| 新激情五月天| 色五月五月天| 香蕉久久国产AV一区二区| 久久永久网址| 大香蕉五月丁香| 4399在线观看免费高清黄色视频| 无码任你操| 岛囯综合激情网| 五月色俺婷婷| 91蝌蚪窝视频在线| 五月天综合区| 狠狠精品干练久久久无码中文字幕| 丁香五月色| 婷婷色中文字幕| 9久久久久| yellow视频在线观看91| 九九 激情 网| 五月天停婷基地| 黄网在线观看免费| 日韩在线一级| 五月天狠狠色| 久久98热re| 五月天丁香成人| 97色热| 色玖玖综合网| 久久精典| 九九激情综合| 午夜丁香婷婷| 99亚色色色| 色色婷婷丁香| 五月香蕉婷婷| 国产人妻777人伦精品HD| 天天综合天天做天天综合| 中文字幕乱码亚洲精品一区| 久久午夜理论| 久久婷婷午夜| 国产色五月| 影音先锋综合网| 亭亭玉月丁香| www.91九色| 九九久久综合| www久久五月com| 丁香五月天在线观看| 91久久1118| 超碰99在线| 91久操| 婷婷五月激情片| 碰99在线| 婷婷爱五月天| 久久性操| 97精品综合久久| 五月丁香好婷婷A片网| av婷婷丁香| 六月激情综合| 99热这里是精品| 亚洲综合色网| m色激情网| 97性高潮久久久| 另类 在线| 99re最新地址视频| 亚洲妇女熟BBW| 怡红院视频| 国产综合视频婷婷| 狠狠爱综合| 丁香五月成人在线| 亚洲四色五月| 五月婷婷激情综合| 激情五月婷婷网在线观看| 色天使久久综合| 色婷婷激情四射视频| 亚洲激情亚洲激情| 色婷婷丁香女女| 五月丁香色综合| 婷婷九月| 日韩人妻白浆视频系列| 激情六月色| 思思99热这里只有精品| 色色色五月天婷婷| 五月丁香亭亭| 婷婷欧美偷拍综合| 秋霞九九无码| 99在线热| 欧美毛片www| 精品亚洲日韩99欧美片| 欧美激情综合色综合啪啪五月| 五月丁香激情婷婷综合| 久久性刺激| 无码日本精品XXXXXXXXX | 婷婷五月天堂| 久久中文人妻系列| 亚洲视频码| 亚洲情欲| 新精品99| 色综合色色| 日本性视频| 99免费| 五月天激情亚洲| 激情深爱五月婷婷| 婷婷五月丁香人妻无码高清| 婷婷狠狠操| 亚洲热久久| 久久色频| 中文字幕黄色电影网址| 久热99| 丁香久久久| 天天操夜夜玩!| 天天久综合网永久入口17v | 9色在线| 激情五月天社区| 婷婷黄色五月天在线视频| 久久jiuwww| 日日操夜夜擼| 欧洲毛片基地c区| 欧美婷婷五月| 亚洲精久久| 91窝窝| 99热在线观看| 99精品在线观看视频| 色五月婷婷啪啪五月| 五月婷在线| 99九九热视频免费| 久久精品国产AV一区二区三区 | 欧美综合123区| 26uuu另类亚洲欧美日本一| sS丁香五月婷婷| 超碰无码318604| 碰碰碰97国产| 久久伊人大香蕉| 91视频五月丁香| 开心五月深爱激情| 可以免费看av网站| 国产精品操| 91丁香色五月| 极品人妻VIDEOSSS人妻| 成人网址在线观看| 熟女激情五月天 | 手机激情网| 色婷婷婷av| 成人电影AV在线观看| 婷色综合| 日韩一区二区A片免费观看| 99视频内射三四| 六月丁香五月婷婷| 色五月丁香六月婷婷| 天天日人人| 热99这里只是精品| 色婷婷丁香九月| 六月婷婷青青青视频| 伊人狼人干| 精品一二三区久久AAA片|