瓦片地图编辑器——实现卡马克卷轴的编辑,键盘控制游戏移动和鼠标点击游戏编辑通过同一个视口实现。

 瓦片地图编辑器——实现卡马克卷轴的编辑,键盘控制游戏移动和鼠标点击游戏编辑通过同一个视口实现。_第1张图片

左边是游戏地图编辑区,右边是地图缓冲区,解决了地图缓冲区拖动bug,成功使得缓冲区可以更新。

AWSD进行移动

鼠标左右键分别是绘制/拖动

按F1健导出为mapv3.txt

F2清空数组

打印的是游戏数组

easyx开发devcpp 5.11 easyx20220922版本

#include 
#include 
#define ROW 150						// 游戏地图行 
#define COLUMN 150					// 游戏地图列 
//#define ROW 20						// 游戏地图行
//#define COLUMN 20					// 游戏地图列
#define PIXNUM 30						// 一个瓦片边长为 30 像素 
#define SHOWSIZE 10						// 一个视口边长为 5 个瓦片 
#define BUFFERSIZE 3					// 地图缓冲区边长 3 个视口 
#define SHOWSPEED 4						// 游戏地图背景移动速度 
#define SHOWX 300						// 游戏显示区域 
#define SHOWY 300
typedef struct area {
	int lx;								// 左上角坐标
	int ly;
	int rx;								// 右上角坐标
	int ry;
	int high;							// 高度
	int wide;
} area;

typedef struct checkBackgroundBuffer {	// 用于记录缓冲条件的临界数据
	int xmin;
	int ymin;
	int xmax;
	int ymax;
	int adjust;
} bklimit;

typedef struct background {				// 游戏地图背景
	area gamepos;						// 采样区相对于缓冲区的坐标
	area deskpos;						// 改 bug 整理得到一个新结构体,把窗口坐标封装了
	int nowpointx;						// 在整个地图数组映射形成的地图上的坐标
	int nowpointy;
	IMAGE *gamebk;
} bk;

typedef struct backgroundBuffer {							// 游戏背景缓冲区
	area meshpos;
	int meshrow;
	int meshcolumn;
	bklimit bufferlimit;
	IMAGE *mapmesh;											// 缓冲区,长宽各为 3*size*a 个像素
} bkbuffer;
int map[ROW][COLUMN]= {0};
//int map[ROW][COLUMN]= {
//	{0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,1,0,0, 0,0,2,0,2, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,0,0,2, 0,0,0,2,0, 0,0,0,0,0},
//	{0,0,0,0,1, 0,0,0,0,0, 0,0,1,0,0, 1,0,0,0,0},
//
//	{0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,1,0,0, 0,0,2,0,2, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,0,0,2, 0,0,0,2,0, 0,0,0,0,0},
//	{0,0,0,0,1, 0,0,0,0,0, 0,0,1,0,0, 1,0,0,0,0},
//
//	{0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,1,0,0, 0,0,2,0,2, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,0,0,2, 0,0,0,2,0, 0,0,0,0,0},
//	{0,0,0,0,1, 0,0,0,0,0, 0,0,1,0,0, 1,0,0,0,0},
//
//	{0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,1,0,0, 0,0,2,0,2, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,0,0,2, 0,0,0,2,0, 0,0,0,0,0},
//	{0,0,0,0,1, 0,0,0,0,0, 0,0,1,0,0, 1,0,0,0,0},
//};

int pixnum=PIXNUM;											// 瓦片的大小正方形像素瓦片的边长
int showsize=SHOWSIZE;
int buffersize = BUFFERSIZE;
bk bkgd;													// background
bkbuffer bkgdbu;											// backgroundbuffer
IMAGE b(3*showsize*pixnum,3*showsize*pixnum);				// mapmesh 缓冲区
IMAGE a(showsize*pixnum,showsize*pixnum);					// 采样区,采样的到的图片就是屏幕上的游戏
// 清除地图
void clearmap();
// 保存编辑完的地图
void savemap();
//读取txt字符表格作为背景数组
void loadmap();
//检测背景是否需要更新
bool buchange() {
	bool changeflag=0;
	while(bkgd.gamepos.lx>bkgdbu.bufferlimit.xmax) {		// if else if变 while 解决鼠标拖动,导致的多次平移问题
		bkgd.gamepos.lx-=bkgdbu.bufferlimit.adjust;
		bkgdbu.meshpos.lx+=showsize;
		changeflag=1;
		printf("死循环\n");
	}
	while(bkgd.gamepos.lxbkgdbu.bufferlimit.ymax) {
		bkgd.gamepos.ly-=bkgdbu.bufferlimit.adjust;
		bkgdbu.meshpos.ly+=showsize;
		changeflag=1;
	}
	while(bkgd.gamepos.lydeskpos.lx&&m.y>deskpos.ly&&m.x&&<){
//		+=flah_a;
//	}else{
//		+=flag_a;
//	}
	bkgd.gamepos.lx-=flag_a;			// 左移采样区
	bkgd.gamepos.lx+=flag_d;			// 右移采样区
	bkgd.gamepos.ly-=flag_w;			// 上移采样区
	bkgd.gamepos.ly+=flag_s;			// 下移采样区
}

//初始化地图缓冲区
void initbkbuffer() {
	bkgdbu.mapmesh = &b;													// 挂载地图缓冲区
	bkgdbu.meshpos.lx=0;
	bkgdbu.meshpos.ly=0;
	bkgdbu.meshrow=BUFFERSIZE*showsize;
	bkgdbu.meshcolumn=BUFFERSIZE*showsize;
	bkgdbu.bufferlimit.adjust=showsize*pixnum;								// 缓冲区需要更新的临界条件
	bkgdbu.bufferlimit.xmax=2*showsize*pixnum;								// 超过九宫格就立即更新,采样区默认在九宫格的中心
	bkgdbu.bufferlimit.xmin=0;
	bkgdbu.bufferlimit.ymax=2*showsize*pixnum;
	bkgdbu.bufferlimit.xmin=0;
	freshbuffer();
	SetWorkingImage();
//	putimage(700,pixnum,bkgdbu.mapmesh);									// 缓冲区可视化
}
//初始化地图采样区
void initbk() {
	bkgd.gamebk = &a;														// 如果是在这里声明临时变量 a ,函数执行完毕之后,程序就会销毁变量
	bkgd.gamepos.lx=showsize*pixnum;										// 采样区默认位置
	bkgd.gamepos.ly=showsize*pixnum;
	bkgd.nowpointx=bkgd.gamepos.lx;											// 绝对位置,用于解决gamepos 范围在 0~2*showsize*pixnum 导致的笔刷绘制失败bug
	bkgd.nowpointy=bkgd.gamepos.ly;											// 打表检测,读表时发现的绘制位置始终在一个区域内,才发现的这个bug
	bkgd.deskpos.lx=SHOWX;													// 采样之后的粘贴位置
	bkgd.deskpos.ly=SHOWY;
	bkgd.deskpos.rx=bkgd.deskpos.lx+showsize*pixnum;						// 粘贴区域的大小,用于检测鼠标指针是否在该区域内绘制
	bkgd.deskpos.ry=bkgd.deskpos.ly+showsize*pixnum;
	SetWorkingImage(bkgdbu.mapmesh);
	getimage(bkgd.gamebk,bkgd.gamepos.lx,bkgd.gamepos.ly,showsize*pixnum,showsize*pixnum);					// 加载屏幕地图,开始采样
	SetWorkingImage();
	putimage(bkgd.deskpos.lx,bkgd.deskpos.ly,bkgd.gamebk);					// 粘贴采样结果
}

int main() {
	initgraph(1800,800,1);
	setbkcolor(GREEN);
	cleardevice();
	loadmap();																// 加载地图
	clearmap();
	initbkbuffer();
	initbk();
	ExMessage msg;
	while(1) {
		peekmessage(&msg,EX_KEY|EX_MOUSE,true);
		move(msg);															// 键盘awsd检查
		draft(msg);															// 鼠标右键拖动检查
		draw(msg);															// 鼠标左键绘制
		if(buchange()) {
			freshbuffer();													// 刷新九宫格缓冲区
			printf("九宫格已刷新\n");
		}
		if(msg.message==WM_KEYDOWN) {
			if(msg.vkcode==VK_F1) {
				savemap();
			} else if(msg.vkcode== VK_F2) {
				clearmap();
			}
		}
		show();																// 打印缓冲区,打印新的采样结果,更新游戏背景, 结算完毕统一显示
		Sleep(2);
	}

	return 0;
}
//清楚地图 
void clearmap() {
	for(int i=0; i

你可能感兴趣的:(编辑器,计算机外设,游戏)