C++可視化角色按鍵移動(dòng)控制的實(shí)現(xiàn)
1.新建項(xiàng)目
新建一個(gè)空項(xiàng)目,并添加一個(gè)源文件(.cpp)


記住.cpp文件所在的位置
2.新建一個(gè)窗口,并添加背景圖片
將要使用的圖片,拷貝到項(xiàng)目所在文件夾
與.cpp文件處于同一文件夾
#include<stdio.h> //用于標(biāo)準(zhǔn)輸入輸出
#include<graphics.h> //用于圖形的函數(shù)庫(kù)
int main()
{
initgraph(1440, 768); //創(chuàng)建一個(gè)窗口,大小設(shè)定為背景大小,以免圖片拉伸變形
IMAGE background; //創(chuàng)建一個(gè)圖像,命名為background
loadimage(&background, "background.bmp");
//加載背景圖片
putimage(0, 0, &background);
//輸出到窗口,背景圖片從0,0,為原點(diǎn)
getchar(); //暫停,等待輸入任意字符
closegraph(); //關(guān)閉窗口
return 0;

3.加入一個(gè)角色
在main()函數(shù)中插入角色
IMAGE role, roleY; loadimage(&role, "role.bmp" ); loadimage(&roleY, "roleY.bmp"); putimage(100, 500, 93,100,&roleY,0,200,SRCAND); putimage(100, 500, 93,100,&role, 0,200,SRCPAINT );
第4行
putimage(100, 500, 93,100,&roleY,0,200,SRCAND);
100,500表示角色在窗口中的坐標(biāo),位置大約在左下角
93,100 表示角色圖片的大小
&roleY插入的圖片對(duì)象
0,200從該圖片的0,200像素開(kāi)始取值
SRCAND 使用AND的方式加載
第4、5行,使用三元光柵操作實(shí)現(xiàn)透明貼圖
背景圖:

掩碼圖:


4.接收用戶輸入的按鍵,并判斷輸入的是什么
#include<conio.h> //控制臺(tái)輸入輸出
void keyDonw()
{
char choice = _getch();
switch (choice)
{
case 'w':
case 'W':
case 72:
break;
case 's':
case 'S':
case 80:
break;
case 'a':
case 'A':
case 75:
break;
case 'd':
case 'D':
case 77:
break;
}
}
需要添加一個(gè)頭文件,并接收用戶輸入的按鍵
接收 上下左右 四個(gè)方向鍵
使用switch()循環(huán),判斷用戶輸入
5.當(dāng)用戶按鍵后,執(zhí)行相應(yīng)功能
1.首先將main()函數(shù)中定義的一些變量提出來(lái),作為全局變量
不然只有main()函數(shù)可以使用,別的函數(shù)使用不了
IMAGE background,role, roleY;
2.putimage(100, 500, 93,100,&roleY,0,200,SRCAND);
putimage(100, 500, 93,100,&role, 0,200,SRCPAINT );
putimage()函數(shù)中的,表示角色在窗口位置的參數(shù),
會(huì)隨著用戶操作方向鍵改變因此不能再使用100,500
應(yīng)該使用變量代替,如:int x;int y;
case 'w': case 'W': case 72: putimage(0, 0, &background); putimage(x, y, 93, 100, &roleY, imageNum * 93, 300, SRCAND); putimage(x, y, 93, 100, &role, imageNum * 93, 300, SRCPAINT); imageNum++; y -= 5; if (imageNum == 4) imageNum = 0; break;
以按下向上箭頭為例:
- 首先重新載入背景 putimage(0, 0, &background);
- 其次將圖片顯示為角色像上
- 用 imageNum記錄按下照片的次數(shù)
- 由于每走一步角色會(huì)稍有變化,向上走的圖片共有四張,
- 用每個(gè)角色的寬度X按下的次數(shù)
- 使用if語(yǔ)句,當(dāng)照片到第四張的時(shí)候,回到第一張
- 將y軸減小5個(gè)像素,是人物向上移動(dòng)

6.添加個(gè)背景音樂(lè)BGM
將要使用的音樂(lè),拷貝到項(xiàng)目所在文件夾
與.cpp文件處于同一文件夾
#include<mmsystem.h> ////包含多媒體接口
#pragma comment(lib,"winmm.lib")
int main()
{
mciSendString("open 1.mp3 alias music", 0, 0, 0);//媒體控制接口函數(shù)
mciSendString("play music repeat", 0, 0, 0);
}
7.完整代碼
#include<stdio.h> //用于標(biāo)準(zhǔn)輸入輸出
#include<graphics.h> //用于圖形的函數(shù)庫(kù)
#include<conio.h> //控制臺(tái)輸入輸出
#include<mmsystem.h> //包含多媒體接口
#pragma comment(lib,"winmm.lib")
IMAGE background,role, roleY;
int x=100;
int y=500;
int imageNum = 0; //為照片計(jì)數(shù),從0開(kāi)始
void keyDonw()
{
char choice = _getch();
switch (choice)
{
case 'w':
case 'W':
case 72:
putimage(0, 0, &background);
putimage(x, y, 93, 100, &roleY, imageNum * 93, 300, SRCAND);
putimage(x, y, 93, 100, &role, imageNum * 93, 300, SRCPAINT);
imageNum++;
y -= 5;
if (imageNum == 4)
imageNum = 0;
break;
case 's':
case 'S':
case 80:
putimage(0, 0, &background);
putimage(x, y, 93, 100, &roleY, 93 * imageNum, 0, SRCAND);
putimage(x, y, 93, 100, &role, 93 * imageNum, 0, SRCPAINT);
imageNum++;
y += 5;
if (imageNum == 4)
imageNum = 0;
break;
case 'a':
case 'A':
case 75:
putimage(0, 0, &background);
putimage(x, y, 93, 100, &roleY, 93 * imageNum, 100, SRCAND);
putimage(x, y, 93, 100, &role, 93 * imageNum, 100, SRCPAINT);
imageNum++;
x -= 5;
if (imageNum == 4)
imageNum = 0;
break;
case 'd':
case 'D':
case 77:
putimage(0, 0, &background);
putimage(x, y, 93, 100, &roleY, 93 * imageNum, 200, SRCAND);
putimage(x, y, 93, 100, &role, 93 * imageNum, 200, SRCPAINT);
imageNum++;
x += 5;
if (imageNum == 4)
imageNum = 0;
break;
}
}
int main()
{
initgraph(1440, 768); //創(chuàng)建一個(gè)窗口,大小設(shè)定為背景大小,以免圖片拉伸變形
loadimage(&background, "background.bmp");
//加載背景圖片
putimage(0, 0, &background);
loadimage(&role, "role.bmp" );
loadimage(&roleY, "roleY.bmp");
putimage(x, y, 93,100,&roleY,0,200,SRCAND);
putimage(x, y, 93,100,&role, 0,200,SRCPAINT );
mciSendString("open 1.mp3 alias music", 0, 0, 0);//媒體控制接口函數(shù)
mciSendString("play music repeat", 0, 0, 0);
while (true)
{
keyDonw();
}
getchar(); //暫停,等待輸入任意字符
closegraph();
return 0;
}
8.遇到的一些問(wèn)題
VS中可能找不到頭文件<graphics.h>
安裝EasyX,素材中有
loadimage()函數(shù),沒(méi)有與參數(shù)列表匹配的重載函數(shù)
右擊項(xiàng)目名稱(chēng),選擇“屬性”,點(diǎn)左側(cè)的“配置屬性”,在右側(cè)的設(shè)置中找到“字符集”,修改默認(rèn)的“使用 Unicode 字符集”為“使用多字節(jié)字符集(即MBCS)”即可。
涉及的素材下載鏈接:Csucai_jb51.rar
到此這篇關(guān)于C++可視化角色按鍵移動(dòng)控制的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++ 按鍵移動(dòng)控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VC++文件監(jiān)控之FindFirstChangeNotification
因?yàn)镽eadDirectoryChangesW 上次測(cè)試發(fā)現(xiàn)不能多級(jí)目錄監(jiān)控,所以嘗試用FindFirstChangeNotification來(lái)實(shí)施文件監(jiān)控,需要的朋友可以參考下2019-04-04
《C++ Primer》隱式類(lèi)類(lèi)型轉(zhuǎn)換學(xué)習(xí)整理
在本篇文章里小編給大家整理的是關(guān)于《C++ Primer》隱式類(lèi)類(lèi)型轉(zhuǎn)換學(xué)習(xí)筆記內(nèi)容,需要的朋友們參考下。2020-02-02
C++實(shí)現(xiàn)LeetCode(121.買(mǎi)賣(mài)股票的最佳時(shí)間)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(121.買(mǎi)賣(mài)股票的最佳時(shí)間),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言數(shù)組實(shí)現(xiàn)三子棋應(yīng)用實(shí)例
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)組實(shí)現(xiàn)三子棋應(yīng)用實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

