今天带来一个游戏场景的人物行走。用的是C语言写的,用到的编译器是vs2015,2013或者(vc)也行的,自然要记得安装图形库文件。
涉及到的知识点不多:
图形库 鼠标和键盘操作 图片 贴图
C语言 if swicth分支 函数 循环for while do while
星城下面就把代码发出来一下,代码如下:
#include//图形库头文件
#include
#include//getch 获取键盘消息 kbhit 判断是否有键盘消息
//#include"resource.h"
#include//加音乐 mcisendstring playsound
#pragma comment(lib,"WINMM.LIB")//多媒体的库 winmm.lib 可以小写
/*
1.实现 打包图片 涉及到资源文件
//如果是添加资源的话 资源文件 改下代码
2.音乐 wav-->playsound
*/
/*
关于 贴图 图形库
创建一个窗口 initgraph
图片 -->IMAGE 变量 loadimage 加载一张图片
putimage 贴图
*/
/*
人物移动
1.贴图 素材 基本动作 上 下 左 右 左上 左下 右上 右下 8个方向
2. 人物走路 四个动作 //动作越多人物效果越好
人物 透明贴图
1.贴图 人物图片 遮挡的图片 -->素材
loadimage 贴图 遮挡的图片 AND SRCPAINT
人物图片 OR SRCAND
贴图 需要坐标 人物坐标 目的坐标 人物的移动方向 人物动作
传递参数会很麻烦
没什么区别 但是结构体好看一点 结构体 变量名字 取名字比较简单
1.全局变量
2.定义全局结构体
*/
struct//结构体可以没有名字
{
int x, y;//人物当前坐标 像素
int _x,_y;//目的地坐标
int move;//人物的移动方向
/*
0表示往下 1左 2往右 3往上 4左下 5右下 6左上 7右上
*/
int num;//人物动作 0 1 2 3
}person = {100,100,250,250,2,1};//初始化状态
IMAGE people[3];//图片 背景图 人物图片 掩码图
void init()//初始化
{//创建窗口 图片加载部分
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多字节
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多字节
//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();//结束绘图
if (person.num == 3)
{
person.num = 0;
}
else
{
person.num++;
}
Sleep(10);
}
//实现行走
void walk()
{
//如果目的坐标 和人物坐标不一样 就需要走动
//先判断哪个方向 可能没办法走到这个区域 给他一个范围 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; }//往下走
/*
单位像素 一个像素一个像素 角度 三角函数 出现小数(舍弃) 跑偏的 刚刚好是整数情况非常小
*/
}
void change()//用鼠标/键盘实现改目标位置
{
//键盘实现的部分 有没有键盘输入
if (kbhit())
{
switch (getch())//获取键盘消息
{
case 'W':
case'w':
//两种方案
//目标位置 当前位置的上方 或目标点的上方
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())//有没鼠标信息的
{
MOUSEMSG msg = GetMouseMsg();//获取鼠标信息 等待
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();//关闭窗口
return 0;
}
/*
IMAGE img;//装图片的容器
loadimage(&img,L"背景.jpg",640,480);//jpg bmp L多字节
putimage(0, 0, &img);//把这张图片贴出来 0,0坐标
IMAGE img2;
loadimage(&img2, L"boy.bmp");//jpg bmp L多字节
putimage(0, 0, &img2);//把这张图片贴出来 0,0坐标*/
学习编程(C语言/C++)并不难各位可以加下群315732400(资料和视频),一起交流提升,编程不要觉得很难,虽说也有难度,但是学好了对以后的帮助是非常大。
最终的效果图:
星城就差不多把效果图,代码都已经发出来了,可以借鉴一下我的思路,图形库记得安装好,别忘了,这个鼠标可以控制人物的移动,素材的话自己都可以去找一下,可以不一样的,小编就暂时说到这,素材,图片命名,路径都是要统一别乱了。