今天帶來一個游戲場景的人物行走纷捞。用的是C語言寫的痢虹,用到的編譯器是vs2015,2013或者(vc)也行的,自然要記得安裝圖形庫文件主儡。
涉及到的知識點(diǎn)不多:
圖形庫 鼠標(biāo)和鍵盤操作 圖片 貼圖
C語言 if swicth分支 函數(shù) 循環(huán)for while do while
星城下面就把代碼發(fā)出來一下奖唯,代碼如下:
#include//圖形庫頭文件
#include
#include//getch 獲取鍵盤消息 kbhit 判斷是否有鍵盤消息
//#include"resource.h"
#include//加音樂 mcisendstring playsound
#pragma comment(lib,"WINMM.LIB")//多媒體的庫 winmm.lib 可以小寫
/*
1.實(shí)現(xiàn) 打包圖片 涉及到資源文件
//如果是添加資源的話 資源文件 改下代碼
2.音樂 wav-->playsound
*/
/*
關(guān)于 貼圖 圖形庫
創(chuàng)建一個窗口 initgraph
圖片 -->IMAGE 變量 loadimage 加載一張圖片
putimage 貼圖
*/
/*
人物移動
1.貼圖 素材 基本動作 上 下 左 右 左上 左下 右上 右下 8個方向
2. 人物走路 四個動作 //動作越多人物效果越好
人物 透明貼圖
1.貼圖 人物圖片 遮擋的圖片 -->素材
loadimage 貼圖 遮擋的圖片 AND SRCPAINT
人物圖片 OR SRCAND
貼圖 需要坐標(biāo) 人物坐標(biāo) 目的坐標(biāo) 人物的移動方向 人物動作
傳遞參數(shù)會很麻煩
沒什么區(qū)別 但是結(jié)構(gòu)體好看一點(diǎn) 結(jié)構(gòu)體 變量名字 取名字比較簡單
1.全局變量
2.定義全局結(jié)構(gòu)體
*/
struct//結(jié)構(gòu)體可以沒有名字
{
int x, y;//人物當(dāng)前坐標(biāo) 像素
int _x,_y;//目的地坐標(biāo)
int move;//人物的移動方向
/*
0表示往下 1左 2往右 3往上 4左下 5右下 6左上 7右上
*/
int num;//人物動作 0 1 2 3
}person = {100,100,250,250,2,1};//初始化狀態(tài)
IMAGE people[3];//圖片 背景圖 人物圖片 掩碼圖
void init()//初始化
{//創(chuàng)建窗口 圖片加載部分
mciSendString(L"open 1.mp3 alias bgm", 0, 0, 0);
mciSendString(L" play bgm", 0, 0, 0);
initgraph(640, 480);//窗口大小 像素
loadimage(&people[0], L"背景.jpg",640,480); //縮放 jpg bmp L多字節(jié)
loadimage(&people[1], L"人物圖.bmp");//以圖片像素加載
loadimage(&people[2], L"掩碼圖.bmp");
//IDR_JPG1 JPG "背景.jpg"
//IDB_BITMAP1 BITMAP "人物圖.bmp"
//IDB_BITMAP2 BITMAP "掩碼圖.bmp"
//loadimage(&people[0], L"JPG",MAKEINTRESOURCE(IDR_JPG1), 640, 480); //縮放 jpg bmp L多字節(jié)
//loadimage(&people[1], L"BITMAP", MAKEINTRESOURCE(IDB_BITMAP1),280,992);//以圖片像素加載
//loadimage(&people[2], L"BITMAP", MAKEINTRESOURCE(IDB_BITMAP2),280,992);
}
void draw()//繪圖
{
//1.重新繪制背景圖
//2.人物圖
//雙緩沖繪圖
BeginBatchDraw();//開始繪圖
//寫繪圖部分
putimage(0, 0, &people[0]);//背景圖片
//人物圖片
putimage(person.x-30, person.y-80, 70, 124, &people[2], 70 * person.num, 124 * person.move, SRCAND);//掩碼圖
putimage(person.x-30, person.y-80, 70, 124, &people[1],70*person.num,124*person.move,SRCPAINT);//貼人物圖 AND 方式貼圖
EndBatchDraw();//結(jié)束繪圖
if (person.num == 3)
{
person.num = 0;
}
else
{
person.num++;
}
Sleep(10);
}
//實(shí)現(xiàn)行走
void walk()
{
//如果目的坐標(biāo) 和人物坐標(biāo)不一樣 就需要走動
//先判斷哪個方向 可能沒辦法走到這個區(qū)域 給他一個范圍 4 x-=5 x=x-5
if (person.x > person._x&&person.y > person._y) { person.x -=1, person.y -= 1, person.move = 6; return; }//人物在目的地的右下方 左上方走
if (person.x < person._x&&person.y > person._y) { person.x += 1, person.y -= 1, person.move = 7; return; }//往右上方走
if (person.x > person._x&&person.y < person._y) { person.x -= 1, person.y += 1, person.move = 4; return; }//左下方走
if (person.x < person._x&&person.y < person._y) { person.x += 1, person.y += 1, person.move = 5; return; }//右下
if (person.x > person._x) { person.x -= 1, person.move = 1; return; }//往左走
if (person.x < person._x) { person.x += 1, person.move = 2; return; }//往右走
if (person.y > person._y) { person.y -= 1, person.move = 3; return; }//往上走
if (person.y < person._y) { person.y += 1, person.move = 0; return; }//往下走
/*
單位像素 一個像素一個像素 角度 三角函數(shù) 出現(xiàn)小數(shù)(舍棄) 跑偏的 剛剛好是整數(shù)情況非常小
*/
}
void change()//用鼠標(biāo)/鍵盤實(shí)現(xiàn)改目標(biāo)位置
{
//鍵盤實(shí)現(xiàn)的部分 有沒有鍵盤輸入
if (kbhit())
{
switch (getch())//獲取鍵盤消息
{
case 'W':
case'w':
//兩種方案
//目標(biāo)位置 當(dāng)前位置的上方 或目標(biāo)點(diǎn)的上方
person._y = person.y - 15;//一次移動 15個單位
person._x = person.x;
break;
case 'A':
case'a':
person._y = person.y;
person._x = person.x-15;
break;
case'S':
case's':
person._y = person.y + 15;
person._x = person.x;
break;
case'D':
case 'd':
person._y = person.y;
person._x = person.x+15;
break;
}
}
else if(MouseHit())//有沒鼠標(biāo)信息的
{
MOUSEMSG msg = GetMouseMsg();//獲取鼠標(biāo)信息 等待
switch(msg.uMsg)
{
case WM_LBUTTONDOWN://左鍵按下
person._x = msg.x;
person._y = msg.y;
break;
//case WM_RBUTTONDOWN://右鍵按下
}
}
}
int main()
{
init();
draw();
while (1)
{
change();
walk();
draw();
}
getchar();
closegraph();//關(guān)閉窗口
return 0;
}
/*
IMAGE img;//裝圖片的容器
loadimage(&img,L"背景.jpg",640,480);//jpg bmp L多字節(jié)
putimage(0, 0, &img);//把這張圖片貼出來 0,0坐標(biāo)
IMAGE img2;
loadimage(&img2, L"boy.bmp");//jpg bmp L多字節(jié)
putimage(0, 0, &img2);//把這張圖片貼出來 0,0坐標(biāo)*/
學(xué)習(xí)編程(C語言/C++)并不難各位可以加下群315732400(資料和視頻),一起交流提升糜值,編程不要覺得很難丰捷,雖說也有難度,但是學(xué)好了對以后的幫助是非常大寂汇。
最終的效果圖:
星城就差不多把效果圖瓢阴,代碼都已經(jīng)發(fā)出來了,可以借鑒一下我的思路健无,圖形庫記得安裝好,別忘了液斜,這個鼠標(biāo)可以控制人物的移動累贤,素材的話自己都可以去找一下,可以不一樣的少漆,小編就暫時說到這臼膏,素材,圖片命名示损,路徑都是要統(tǒng)一別亂了渗磅。