日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 开发【梦幻西游】500多行代码实现

發布時間:2024/3/12 c/c++ 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 开发【梦幻西游】500多行代码实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、項目展示
  • 二、準備
    • 1、開發環境
    • 2、圖片素材
  • 三、整個流程
  • 四、函數構建
  • 五、Hero 和 Boss 邏輯
  • 六、Hero Boss 技能繪制
  • 七、判斷死亡
  • 八、信息欄顯示
  • 九、奉上源碼

一、項目展示

二、準備

1、開發環境

在使用VS 的時候通過 win32 項目創建,這里一定不要選錯,如下圖

選中空項目,去掉安全開發聲明周期

2、圖片素材

三、整個流程

整個流程是很重要的,這里一定要懂

首先看看主函數的參數


由于這是 Win32 項目創建,所以和我們平時看的控制臺 main 函數是不一樣的

參數只要知道第一個就行了,和最后一個就行了,因為剩下兩個也沒有用到

HINSTANCE hInstance :表示該程序當前運行的實例句柄,是一個數值標識。當程序在Windows下運行時,它唯一標識運行中的實例

int nShowCmd :指定程序的窗口應該如何顯示,例如最大化、最小化、隱藏等。這個參數的值由該程序的調用者所指定,應用程序通常不需要去理會這個參數的值。

然后我們在主函數中先定義一些東西,這些是必須要有的


另外也可以設置窗口的樣式,以及鼠標等等,當然該項目沒有用到

然后對窗口進行 注冊,創建,更新

接下來是對窗口進行初始化

需要做這些東西,具體啥含義需要深究Win32,就不探討了

然后把英雄,Boss,技能圖標加載進來

首先需要定義

// 素材//背景圖片g_backbmp = (HBITMAP)LoadImage(NULL, L"./res/bg.bmp", IMAGE_BITMAP, 800, 600, LR_LOADFROMFILE);//技能1,2,3,4的圖標g_skillbutton1 = (HBITMAP)LoadImage(NULL, L"./res/skillbutton1.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE);g_skillbutton2 = (HBITMAP)LoadImage(NULL, L"./res/skillbutton2.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE);g_skillbutton3 = (HBITMAP)LoadImage(NULL, L"./res/skillbutton3.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE);g_skillbutton4 = (HBITMAP)LoadImage(NULL, L"./res/skillbutton4.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE);//英雄和Boss圖標g_hero = (HBITMAP)LoadImage(NULL, L"./res/1001.bmp", IMAGE_BITMAP, 3500, 250, LR_LOADFROMFILE);g_boss = (HBITMAP)LoadImage(NULL, L"./res/BOSS.bmp", IMAGE_BITMAP, 4000, 250, LR_LOADFROMFILE);//英雄釋放技能的圖標g_heroskill1 = (HBITMAP)LoadImage(NULL, L"./res/heroslash.bmp", IMAGE_BITMAP, 364, 140, LR_LOADFROMFILE); //普通攻擊g_heroskill2 = (HBITMAP)LoadImage(NULL, L"./res/herocritical.bmp", IMAGE_BITMAP, 574, 306, LR_LOADFROMFILE);//暴擊g_heroskill3 = (HBITMAP)LoadImage(NULL, L"./res/heromagic.bmp", IMAGE_BITMAP, 100, 77, LR_LOADFROMFILE); //魔法攻擊//boss 釋放技能的圖標g_bossskill1 = (HBITMAP)LoadImage(NULL, L"./res/monsterslash.bmp", IMAGE_BITMAP, 150, 120, LR_LOADFROMFILE);g_bossskill2 = (HBITMAP)LoadImage(NULL, L"./res/monstercritical.bmp", IMAGE_BITMAP, 249, 231, LR_LOADFROMFILE);g_bossskill3 = (HBITMAP)LoadImage(NULL, L"./res/monstermagic.bmp", IMAGE_BITMAP, 200, 131, LR_LOADFROMFILE);//恢復氣血圖標g_recover = (HBITMAP)LoadImage(NULL, L"./res/recover.bmp", IMAGE_BITMAP, 150, 150, LR_LOADFROMFILE);//游戲結束和勝利圖標g_hGameOver = (HBITMAP)LoadImage(NULL, L"./res/gameover.bmp", IMAGE_BITMAP, 1086, 396, LR_LOADFROMFILE);g_hVictor = (HBITMAP)LoadImage(NULL, L"./res/victory.bmp", IMAGE_BITMAP, 294, 147, LR_LOADFROMFILE);//添加背景音樂,播放添加到資源的.wav文件,IDR_DENG代表音頻資源res/wav/1.wav的編號,SND_RESOURCE代表使用資源,SND_ASYNC代表異步播放,SND_LOOP代表循環播放PlaySound(_T("./res/夢幻西游原聲-戰斗1-森林.wav"), NULL, SND_ASYNC | SND_LOOP);

另外對 Boss 和 英雄的屬性初始值也可以在初始化函數中賦值

當然也得定義

//初始英雄化數據 Hero.Agility = 20; Hero.Intell = 10; Hero.level = 6; Hero.strength = 10; Hero.MaxHp = 1000; Hero.NowHp = 1000; Hero.MaxMp = 60; Hero.NowMp = 60; //初始化Boss數據 Boss.Agility = 10; Boss.Intell = 10; Boss.level = 10; Boss.strength = 10; Boss.MaxHp = 2000; Boss.NowHp = 2000;

初始化完成之后

下面就是一個循環了

TranslateMessage 把消息轉換為字符串,在下一次調度 PeekMessage 是被讀出

DispatchMessage 調度一個消息給窗口程序

下面是 GamePaint 函數中的調用,為什么會在窗口中有背景,技能,這種視覺性畫面,其實就是GamePaint 函數在繪制

四、函數構建

繪制函數的主邏輯

//繪制函數 VOID GamePaint(HWND hwnd){//貼出背景圖片和戰斗信息PutBackInformation();//如果Boss氣血不為0,貼出圖片和生命值if (Boss.NowHp > 0){ PutImageBoss();PutLife(false);}//如果Hero氣血不為0,則貼圖片和生命值if (Hero.NowHp > 0){PutImageHero();PutLife(true);}//如果游戲結束if (g_bGameOver){if (Hero.NowHp <= 0){IsGameOver(TRUE);}else{IsGameOver(FALSE);}g_bCanAttack = false;}//如果可以攻擊if (g_bCanAttack){g_frame++;//消息循環,每一次循環就是一幀if (g_frame >= 5 && g_frame <= 10){if (g_frame == 5){//根據不同的技能,貼上對應的技能圖HeroAction_Logic();DieCheck(Boss.NowHp, false);}HeroActionPaint();//hero的技能圖片}else if (g_frame == 15){BossAction_Logic();//怪物邏輯}else if (g_frame >= 16 && g_frame < 30){BossActionPaint();//顯示怪物的攻擊圖片}//第三十幀,回合結束else if (g_frame == 30){g_frame = 0;int MpRecover = 2 * rand() % Hero.Intell + 6; Hero.NowMp += MpRecover;if (Hero.NowMp >= Hero.MaxMp){Hero.NowMp = Hero.MaxMp;}}}//需要把 g_memdc 中的寫入到g_hdc中BitBlt(g_hdc, 0, 0, 800, 600, g_memdc, 0, 0, SRCCOPY); }

五、Hero 和 Boss 邏輯

Hero 的邏輯模塊

//這個邏輯是由程序猿自定以的,如果你想游戲簡單點,就可以在這里進行設定 //如果你想讓游戲復雜,在這里也可以讓游戲變得復雜,所以這里是玩家邏輯模塊VOID HeroAction_Logic(){int damage = 0;switch (HeroAction) //根據 HeroAction不同的值觸發不同的技能{case NORMAL: //普通攻擊有一定機會觸發暴擊//模擬隨機暴擊幾率 25%if (rand() % 4 == 1){HeroAction = CRITICAL;damage = 4 * (3 * (rand() % Hero.Agility) + Hero.level*Hero.strength + 20);//這里可以自定以設置Boss.NowHp -= damage;}else{//普通攻擊damage = 3 * (rand() % Hero.Agility) + Hero.level*Hero.strength + 20;//80~107Boss.NowHp -= damage;}break;case MAGIC://消耗30if (Hero.NowMp >= 30){damage = 5 * (2 * (rand() % Hero.Agility) + Hero.level*Hero.Intell);Boss.NowHp -= damage;Hero.NowMp -= 30;}else{HeroAction = MISS;}break;case RECOVER://消耗40if (Hero.NowMp >= 40){Hero.NowMp -= 40;int HpRecover = 3 * (rand() % Hero.Intell) + 13; //0-27Hero.NowHp += HpRecover;if (Hero.NowHp >= Hero.MaxHp){Hero.NowHp = Hero.MaxHp;}}else{HeroAction = MISS;}break;} }

Boss 的邏輯

這里如果你想讓Boss變得厲害,也可以在這里設置

如果你想讓它變得很菜,也是在這里設置

VOID BossAction_Logic(){srand((unsigned int)time(NULL));//血量充足的時候if (Boss.NowHp >= (Boss.MaxHp / 2)){switch (rand() % 3){case 0:BossAction = NORMAL;break;case 1:BossAction = CRITICAL;break;case 2:BossAction = MAGIC;break;default:break;}}else{ //血量比較低的時候,進入狂暴狀態switch (rand() % 3){case 0:BossAction = CRITICAL;break;case 1:BossAction = MAGIC;break;case 2:BossAction = RECOVER;break;default:break;}} }

六、Hero Boss 技能繪制

Hero 技能圖片繪制

VOID HeroActionPaint(){switch (HeroAction){case NORMAL:SelectObject(g_bufdc, g_heroskill1);TransparentBlt(g_memdc, 50, 150, 364, 140, g_bufdc, 0, 0, 364, 140, RGB(0, 0, 0));break;case CRITICAL:SelectObject(g_bufdc, g_heroskill2);TransparentBlt(g_memdc, 50, 60, 574, 306, g_bufdc, 0, 0, 574, 306, RGB(0, 0, 0));break;case MAGIC:SelectObject(g_bufdc, g_heroskill3);TransparentBlt(g_memdc, 50, 60, 100, 77, g_bufdc, 0, 0, 100, 77, RGB(0, 0, 0));break;case RECOVER:SelectObject(g_bufdc, g_recover);TransparentBlt(g_memdc, 380, 340, 150, 150, g_bufdc, 0, 0, 150, 150, RGB(0, 0, 0));break;default:break;} }

Boss 技能的繪制 + 邏輯運算

VOID BossActionPaint(){int damage = 0;int recover = 0;wchar_t str[100];switch (BossAction){case NORMAL:SelectObject(g_bufdc, g_bossskill1);TransparentBlt(g_memdc, 360, 390, 150, 120, g_bufdc, 0, 0, 150, 120, RGB(0, 0, 0));if (g_frame == 30){damage = rand() % Boss.Agility + (Boss.level*Boss.strength);Hero.NowHp -= damage;DieCheck(Hero.NowHp, true);}break;case CRITICAL:SelectObject(g_bufdc, g_bossskill2);TransparentBlt(g_memdc, 360, 390, 249, 231, g_bufdc, 0, 0, 249, 231, RGB(0, 0, 0));if (g_frame == 30){damage = 2 * (rand() % Boss.Agility + (Boss.level*Boss.strength));Hero.NowHp -= damage;DieCheck(Hero.NowHp, true);}break;case MAGIC:SelectObject(g_bufdc, g_bossskill3);TransparentBlt(g_memdc, 50, 60, 574, 306, g_bufdc, 0, 0, 574, 306, RGB(0, 0, 0));if (g_frame == 30){damage = 2 * (2 * (rand() % Boss.Agility) + Boss.strength*Boss.Intell);Hero.NowHp -= damage;recover = (int)((double)damage*0.2);Boss.NowHp += recover;DieCheck(Hero.NowHp, true);}break;case RECOVER:SelectObject(g_bufdc, g_recover);TransparentBlt(g_memdc, 150, 150, 150, 150, g_bufdc, 0, 0, 150, 150, RGB(0, 0, 0));if (g_frame == 30){recover = 2 * Boss.Intell * Boss.Intell;Hero.NowHp += recover;if (Boss.NowHp > Boss.MaxHp){Boss.NowHp = Boss.MaxHp;}}break;default:break;} }

七、判斷死亡

每次Hero 和 Boss 減少氣血的時候調用一次

//判斷死亡,第一個參數可以是 Boss 的,也可以是Hero的 VOID DieCheck(int nowhp, bool ishero){if (nowhp <= 0){g_bGameOver = true;//播放音樂if (ishero){ PlaySound(L"./res/failure.wav", NULL, SND_FILENAME | SND_ASYNC);}else{PlaySound(L"./res/victory.wav", NULL, SND_FILENAME | SND_ASYNC);}} }

八、信息欄顯示

就是我藍色框框的東西,該怎么實現?

第一步:在初始化函數中

第二步:定義 Message_Insert 插入信息欄函數

第三步:在繪制函數中

  • 設置顏色為紅色
  • 然后遍歷進行輸出,text[i] 中的東西就是一句話
  • 第四步:在每一次的攻擊或者回復氣血之后,都調用一次

    例如

    其他函數的實現

    //貼Hero 和 Boss VOID PutImageHero(){SelectObject(g_bufdc, g_hero);//BitBlt(g_memdc, 350, 250, 250, 250, g_bufdc, 0, 0, SRCCOPY);TransparentBlt(g_memdc, 350, 250, 250, 250, g_bufdc, g_heronum * 250, 0, 250, 250, RGB(0, 0, 0));//去掉黑背景,透明繪圖if (g_heronum++ >= 13){g_heronum = 0;} }VOID PutImageBoss(){SelectObject(g_bufdc, g_boss);TransparentBlt(g_memdc, 100, 120, 250, 250, g_bufdc, g_bossnum * 250, 0, 250, 250, RGB(0, 0, 0));//去掉黑背景,透明繪圖if (g_bossnum++ >= 15){g_bossnum = 0;}}//顯示血量 VOID PutLife(BOOL hero){wchar_t str[100]; //保存血量if (!hero){swprintf_s(str, L"%d/%d", Boss.NowHp, Boss.MaxHp);SetTextColor(g_memdc, RGB(255, 0, 0));TextOut(g_memdc, 180, 310, str, wcslen(str));}else{//顯示血量swprintf_s(str, L"%d/%d", Hero.NowHp, Hero.MaxHp);SetTextColor(g_memdc, RGB(255, 0, 0));TextOut(g_memdc, 450, 465, str, wcslen(str));//顯示藍swprintf_s(str, L"%d/%d", Hero.NowMp, Hero.MaxMp);SetTextColor(g_memdc, RGB(0, 0, 255));TextOut(g_memdc, 465, 480, str, wcslen(str));} }//貼背景,戰斗信息,技能圖標 VOID PutBackInformation(){//貼背景圖片SelectObject(g_bufdc, g_backbmp); //把圖片選入 memdcBitBlt(g_memdc, //目標設備0, 0, 800, 600, //目標設備的范圍g_bufdc, //源設備0, 0, //源設備的起始值SRCCOPY); //拷貝 //顯示戰斗信息SetTextColor(g_memdc, RGB(255, 0, 0));for (int i = 0; i < g_iTextNum; ++i){TextOut(g_memdc, 20, 20 + i * 20, text[i], wcslen(text[i]));}//貼技能圖標SelectObject(g_bufdc, g_skillbutton1);BitBlt(g_memdc, 600, 200, 40, 40, g_bufdc, 0, 0, SRCCOPY);SelectObject(g_bufdc, g_skillbutton2);BitBlt(g_memdc, 600, 250, 40, 40, g_bufdc, 0, 0, SRCCOPY);SelectObject(g_bufdc, g_skillbutton3);BitBlt(g_memdc, 600, 300, 40, 40, g_bufdc, 0, 0, SRCCOPY);SelectObject(g_bufdc, g_skillbutton4);BitBlt(g_memdc, 600, 350, 40, 40, g_bufdc, 0, 0, SRCCOPY); }VOID IsGameOver(BOOL isGameOver){if (isGameOver){//英雄敗,SelectObject(g_bufdc, g_hGameOver);BitBlt(g_memdc, 120, 150, 543, 396, g_bufdc, 543, 0, SRCAND);BitBlt(g_memdc, 120, 150, 543, 396, g_bufdc, 0, 0, SRCPAINT);}else{SelectObject(g_bufdc, g_hVictor);TransparentBlt(g_memdc, 240, 195, 294, 147, g_bufdc, 0, 0, 294, 147, RGB(0, 0, 0));} }

    九、奉上源碼

    Github 地址

    記得點個 star

    總結

    以上是生活随笔為你收集整理的C++ 开发【梦幻西游】500多行代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 在线看视频 | 欧美一卡二卡三卡四卡 | 一眉道姑 电影 | 国产第一页在线观看 | 免费黄色短片 | 国产一二三 | 你懂的网址在线观看 | 五月av在线| www.国产精品视频 | 国产欧美日韩三级 | 午夜一区二区三区 | 五月激情四射网 | 欧美精品亚洲 | 成人aaaaa| 91久久久久久久久 | 午夜性色福利影院 | 99亚洲天堂 | 国内外成人免费视频 | 欧美在线中文 | 日日干天天爽 | 日韩免费网站 | 日韩电影一区二区在线观看 | 天天人人 | 久久91视频 | 自拍偷拍欧美激情 | 亚洲综合五月天婷婷丁香 | 久久成人人人人精品欧 | 亚洲免费大全 | 色偷偷资源网 | 麻豆影音先锋 | 午夜少妇久久久久久久久 | 亚洲精品成人区在线观看 | 97久久超碰| 爱搞国产| 肥熟女一区二区三肥熟女 | 国产激情视频在线观看 | www色日本| 91视频福利| 在线观看免费黄视频 | 我看黄色一级片 | 欧美一级大黄 | 青青伊人影院 | 人妻少妇精品中文字幕av蜜桃 | 久久性感美女视频 | 亚洲特黄特色 | 欧美综合亚洲图片综合区 | 欧美乱码精品一区二区 | 男人天堂怡红院 | 久久丝袜视频 | 毛片在线视频观看 | 精品国产欧美一区二区 | 成人免费视频观看 | av中字 | 色哟哟黄色 | 久操视频免费看 | 亚洲综合精品 | 黄色成人免费网站 | 婷婷伊人久久 | 亚洲天堂免费在线 | 亚洲aa在线观看 | 国产v亚洲v天堂无码 | 久久综合中文 | 粉色午夜视频 | 日本三级理论片 | 91豆花视频 | 久久久人人爽 | 久久久这里有精品 | 欧美一区二区高清视频 | 隔壁人妻偷人bd中字 | 91国产精品 | 欧美一区二区免费视频 | 一本到免费视频 | 超薄肉色丝袜一二三 | 激情小说图片视频 | 国产精品免费一区二区三区四区 | 91操碰| 国产激情综合五月久久 | 欧美精品在欧美一区二区 | av这里只有精品 | 99蜜桃臀久久久欧美精品网站 | 日韩欧美一区二区三区久久婷婷 | 日韩特级毛片 | 成人网在线播放 | 911看片 | 人妻天天爽夜夜爽一区二区三区 | 欧美裸体女人 | 波多野结衣网址 | 不卡中文av | 色99视频| 91插插视频 | 成人黄页 | 欧美性插视频 | 96在线视频| 国产区第一页 | 我不卡一区二区 | 日韩av线上 | 日批视频免费播放 | 国产专区av| 成人免费无码av |