C语言人物复杂移动与异步输入

同样的,我也是采用EasyX库
先准备好素材(该素材是从RPG maker MV 中找的几张)

一:人物复杂移动

背景图(background.png)

在这里插入图片描述

人物图(actor1.jpg)

在这里插入图片描述

人物遮罩图(actor2.jpg)

在这里插入图片描述

代码

#include <graphics.h>
#include <conio.h>
//像素宽度
int width = 1000;
//像素高度
int high = 740;
//创建图片对象(背景)
IMAGE BG;
//创建图片对象(人物)
IMAGE AC1,AC2;
//动作编号
int id = 0;
//移动方向
char direction;
//人物坐标
int p_x = width/2;
int p_y = high/2;

int main()
{	
	//设置窗口大小
	initgraph(width,high);
	//加载背景图片
	loadimage(&BG,"background.png");
	//绘制背景图片
	putimage(0,0,&BG);
	//加载人物图片
	loadimage(&AC1,"actor1.jpg");
	loadimage(&AC2,"actor2.jpg");
	//绘制人物图片
	putimage(p_x,p_y,50,50,&AC2,0,0,NOTSRCERASE);
	putimage(p_x,p_y,50,50,&AC1,0,0,SRCINVERT);
	direction = getch();
	BeginBatchDraw();	
	while(1)
	{
		if (kbhit())
		{
			direction = getch();
		}
			
		else if(direction =='a')
		{
			p_x-=8;
			if (p_x<=0)
			{
				p_x=0;
			}
			//清空绘制区域
			clearrectangle(0,0,width,high);
			//绘制背景图片
			putimage(0,0,&BG);
			//绘制人物图片
			putimage(p_x,p_y,50,50,&AC2,50*id,50,NOTSRCERASE);
			putimage(p_x,p_y,50,50,&AC1,50*id,50,SRCINVERT);
			id++;
			Sleep(30);
			if (id==3)
			{
				id = 0;
			}
	
		}
		else if(direction =='d')
		{
			p_x+=8;
			if (p_x>=width-50)
			{
				p_x = width-50;
			}
			//清空绘制区域
			clearrectangle(0,0,width,high);
			//绘制背景图片
			putimage(0,0,&BG);
			//绘制人物图片
			putimage(p_x,p_y,50,50,&AC2,50*id,100,NOTSRCERASE);
			putimage(p_x,p_y,50,50,&AC1,50*id,100,SRCINVERT);
			id++;
			Sleep(30);
			if(id==3)
			{
				id = 0;
			}
	
		}
		else if(direction =='w')
		{
			p_y-=8;
			if (p_y<=0)
			{
				p_y=0;
			}
			//清空绘制区域
			clearrectangle(0,0,width,high);
			//绘制背景图片
			putimage(0,0,&BG);
			//绘制人物图片
			putimage(p_x,p_y,50,50,&AC2,50*id,150,NOTSRCERASE);
			putimage(p_x,p_y,50,50,&AC1,50*id,150,SRCINVERT);
			id++;
			Sleep(30);
			if(id==3)
			{
				id = 0;
			}
			
		}
		else if(direction =='s')
		{
			p_y+=8;
			if (p_y>=high-50)
			{
				p_y=high-50;
			}
			//清空绘制区域
			clearrectangle(0,0,width,high);
			//绘制背景图片
			putimage(0,0,&BG);
			//绘制人物图片
			putimage(p_x,p_y,50,50,&AC2,50*id,0,NOTSRCERASE);
			putimage(p_x,p_y,50,50,&AC1,50*id,0,SRCINVERT);
			id++;
			Sleep(30);
			if(id==3)
			{
				id = 0;
			}
			
		}
		FlushBatchDraw();

	}
	EndBatchDraw();
	//关闭窗口
	closegraph();
	return 0;
}

代码可以将所有绘制操作放在一起,减少代码量,我这里为了更直接看的逻辑所有没改进

效果显示

图有点大,可能人物摆臂动作看的不是很清楚
在这里插入图片描述

二:异步输入实现同时操作两个小人

人物素材(girl1.jpg)

在这里插入图片描述

遮罩图(girl2.jpg)

在这里插入图片描述

利用windows API 中的GetAsyncKeyState函数

代码

#include <graphics.h>
#include <conio.h>
#include <windows.h>
//像素宽度
int width = 1000;
//像素高度
int high = 740;
//创建图片对象(背景)
IMAGE BG;
//创建图片对象(人物)
IMAGE AC1,AC2,BC1,BC2;
//动作编号
int id = 0;
int id2 = 0;
//方向编号
int d_id;
int d_id2;
//人物坐标
int p_x = width/4;
int p_y = high/2;
//人物2坐标
int p2_x = width/4*3;
int p2_y = high/2;

int main()
{	
	//设置窗口大小
	initgraph(width,high);
	//加载背景图片
	loadimage(&BG,"background.png");
	//绘制背景图片
	putimage(0,0,&BG);
	//加载人物图片
	loadimage(&AC1,"actor1.jpg");
	loadimage(&AC2,"actor2.jpg");
	//绘制人物图片
	putimage(p_x,p_y,50,50,&AC2,0,0,NOTSRCERASE);
	putimage(p_x,p_y,50,50,&AC1,0,0,SRCINVERT);
	//加载人物2图片
	loadimage(&BC1,"girl1.jpg");
	loadimage(&BC2,"girl2.jpg");
	//绘制人物2图片
	putimage(p2_x,p2_y,50,50,&BC2,0,0,NOTSRCERASE);
	putimage(p2_x,p2_y,50,50,&BC1,0,0,SRCINVERT);

	BeginBatchDraw();	
	while(1)
	{	
		if(GetAsyncKeyState(0x41) & 0x8000)	//a
		{
			d_id=1;
			p_x-=8;
			if (p_x<=0)
			{
				p_x=0;
			}
			id++;
			if (id==3)
			{
				id = 0;
			}
	
		}
		if(GetAsyncKeyState(0x44) & 0x8000)	//d
		{
			d_id=2;
			p_x+=8;
			if (p_x>=width-50)
			{
				p_x = width-50;
			}
			id++;
			if(id==3)
			{
				id = 0;
			}
	
		}
		if(GetAsyncKeyState(0x57) & 0x8000)		//w
		{
			d_id=3;
			p_y-=8;
			if (p_y<=0)
			{
				p_y=0;
			}
			id++;
			if(id==3)
			{
				id = 0;
			}
			
		}
		if(GetAsyncKeyState(0x53) & 0x8000)		//s
		{
			d_id=0;
			p_y+=8;
			if (p_y>=high-50)
			{
				p_y=high-50;
			}
			id++;
			if(id==3)
			{
				id = 0;
			}			
		}
		if(GetAsyncKeyState(VK_LEFT) & 0x8000)		//左键
		{
			d_id2=1;
			p2_x-=8;
			if (p2_x<=0)
			{
				p2_x=0;
			}
			id2++;
			if(id2==3)
			{
				id2 = 0;
			}			
		}
		if(GetAsyncKeyState(VK_RIGHT) & 0x8000)		//右键
		{
			d_id2=2;
			p2_x+=8;
			if (p2_x>=width-50)
			{
				p2_x=width-50;
			}
			id2++;
			if(id2==3)
			{
				id2 = 0;
			}			
		}
		if(GetAsyncKeyState(VK_UP) & 0x8000)		//上键
		{
			d_id2=3;
			p2_y-=8;
			if (p2_y<=0)
			{
				p2_y=0;
			}
			id2++;
			if(id2==3)
			{
				id2 = 0;
			}			
		}
		if(GetAsyncKeyState(VK_DOWN) & 0x8000)		//下键
		{
			d_id2=0;
			p2_y+=8;
			if (p2_y>=high-50)
			{
				p2_y=high-50;
			}
			id2++;
			if(id2==3)
			{
				id2 = 0;
			}			
		}
		//清空绘制区域
		clearrectangle(0,0,width,high);
		//绘制背景图片
		putimage(0,0,&BG);
		//绘制人物图片
		putimage(p_x,p_y,50,50,&AC2,50*id,50*d_id,NOTSRCERASE);
		putimage(p_x,p_y,50,50,&AC1,50*id,50*d_id,SRCINVERT);
		//绘制人物2图片
		putimage(p2_x,p2_y,50,50,&BC2,50*id2,50*d_id2,NOTSRCERASE);
		putimage(p2_x,p2_y,50,50,&BC1,50*id2,50*d_id2,SRCINVERT);
		Sleep(30);
		FlushBatchDraw();

	}
	EndBatchDraw();
	//关闭窗口
	closegraph();
	return 0;
}

效果显示

在这里插入图片描述

扩展

可以给两个人物加上冲突判断,使的人物不会叠加显示。
这些就交给大家增加了

  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云淡风轻ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值