左边是游戏地图编辑区,右边是地图缓冲区,解决了地图缓冲区拖动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|