DevC++ easyx实现视口编辑--像素绘图板与贴图系统

到了最终成果阶段了,虽然中间有一些代码讲起来没有意思,纯靠debug,+1-1解决贴图网格不重合问题,这次是一个分支结束。

想着就是把瓦片贴进大地图里。

延续这几篇帖子,开发时间也从2023年的4月16到了6月2号,80小时基本砸进去才出靠谱效果。

45天平均每天两小时。

DevC++ easyx实现图片拖动,一种悬浮窗实现原理与完整代码-CSDN博客

DevC++ easyx实现悬浮窗放入网格,与在函数分离过程中遇到的BUG下理解 函数的作用时域 以及 初始化与复位的关系。-CSDN博客 DevC++ easyx实现地图拖动,超过屏幕大小的巨大地图的局部显示在屏幕的方法——用悬浮窗的原理来的实现一个视口-CSDN博客

 

这次迭代过程是,贴图放到视口上,然后视口直接再粘贴到大地图上,然后就导致绘图瓦片重叠,而且也没来及考虑复位问题,就立马意识到还没设置网格。这里走的是网格贴图路线。

然后网格检测贴图位置,属于哪个网格,鼠标松开就被嵌入到哪个网格上。

然后这里设置的是网格长宽80像素,就用了数据图像位置变换:x=x-x%80;这样保留能被80整除的部分,然后px=x/80,得到所属网格的序号,这样就存储了贴图。

至于边界,就是处理鼠标位移和大地图坐标变化的问题。视口和采样区域是1:1,或者说是视口复制粘贴到大地图上成为采样图片,所以视口上鼠标移动多少,就是采样图上移动多少,然后算出来鼠标位置和视口左上角的距离,在大地图里,可以拿采样图左上角的坐标再加上这个数据,就是鼠标实际在大地图里面的坐标。

不多说,上效果

先放一个局部代码,跑不起来,因为适配的代码太庞大,文章后面有两个版本-集成版和cpp .h组合版

extern IMAGE maptile;void didshow(IMAGE *set,IMAGE maptile,ExMessage m,int show_x,int show_y,int nowlx,int nowly) {static int flag=0;static int oldx=-8,oldy=-8;int putx,puty;IMAGE olds(80,80);if(m.message==WM_LBUTTONDOWN) {SetWorkingImage(set);putx=nowlx+m.x-show_x;puty=nowly+m.y-show_y;putx=putx-putx%80;puty=puty-puty%80;putimage(putx,puty,&maptile);SetWorkingImage();} else{if(putx==oldx&&puty==oldy) {} else  {if(m.message==WM_LBUTTONDOWN) {}printf("show   %d %d\n",m.x,m.y);SetWorkingImage(set);putx=nowlx+m.x-show_x;puty=nowly+m.y-show_y;putx=putx-putx%80;puty=puty-puty%80;putimage(putx,puty,&maptile);oldx=putx;oldy=puty;SetWorkingImage();}}
}

代码比较多,先放一个整合版,.h分类版本看下面其他代码

这里是整合版。

devc++里新建项目,选择Multimedia里的Easyx

然后复制粘贴跑就行。

按键操作说明:

 “本程序采用外装easy x拓展库的DEVc++制作而成
是跳一跳游戏配套编辑器

性质与单通道技能不同,是起跳前动画

操作说明

左键长按在网格绘制
右键在网格设置锚点

拖动网格左上角图片到中间的绿色区域暂存
左键点击绿色区域,
在黄色区域的左上角就会出现相同形状,说明已选择

然后在黄色区域左键长按或者单击左键,实现贴图
黄色区域右键移动大地图

按F1 清屏
按F2 导出为 png格式图片,自动命名为“gamemap”


gamemap0,gamemap1,gamemap2....gamemap9为游戏可以读取的有效文件,分别对应关卡1,2,3,4....9

粘贴到游戏目录实现自定义背景”

这是整合版,新建项目,复制粘贴就能跑

#include<stdio.h>
#include<graphics.h>
//INputboX
#include<windows.h>
//Sleep(2000);
//在中断休止
#include <conio.h>
// kbhit(void);检测按键,无也继续下去
#include<string.h>
//保存导入输入//#include"oripic.h"
//#include"show.h"
//#include"draw.h"
//#include"flowsave.h"
//#include"movecheck.h"
//#include"buttoncheck.h"
//#include"keycheck.h"int w=3600;
int h=800;
int w2=3,h2=7;
int x2=650,y2=100;
int showx3=101,showy3=100;extern int w,h; IMAGE set(w,h);struct pixlocal {short x;short y;
};struct skline {int lenth=0;int setx,sety;struct pixlocal a[10000];
} nf,ndnf;struct drawdesksize {int x;int y;int a;int h;int sizetile=8;int smx;int smy;
} ddm;IMAGE maptile(ddm.a/ddm.sizetile,ddm.h/ddm.sizetile);struct pircle {IMAGE img2;IMAGE img3;int orilx,orily;int nowlx,nowly;int a,h;
//	原有图片的左上角坐标int m1x=0,m1y=0;int  putflag=0;int  drawflag=0;struct skline b;
} save;struct picsave {int lx;int ly;int wide;int h;int useflag;struct skline b;
} a[28];void oripicdesk(int a,int h) {initgraph(a,h,EX_SHOWCONSOLE);setbkcolor(WHITE);cleardevice();
//	创制绘图界面,背景色设置,以背景色填充。setlinecolor(BLACK);setlinestyle(PS_SOLID,1);
//	不含实线,矩形的面积为8*8;含实线,9*9.rectangle(0,0,a-2,h-1);//确定工作界面范围setfillcolor(WHITE);
}void oridrawdesksize(struct drawdesksize* ddm,int x,int y) {ddm->x=x;ddm->y=y;ddm->a=640;ddm->h=640;ddm->sizetile=8;ddm->smx=ddm->x-ddm->a/ddm->sizetile;ddm->smy=ddm->y-ddm->h/ddm->sizetile;
}void drawdesk(struct drawdesksize ddm) {int i,j;int square=ddm.sizetile;for(i=ddm.x; i<=ddm.x+ddm.a-square; i+=square) {for(j=ddm.y; j<ddm.y+ddm.h; j+=square) {fillrectangle(i,j,i+square,j+square);}}rectangle(ddm.smx-1,ddm.smy-1,ddm.x,ddm.y);
}void oripircle(struct pircle *save,struct drawdesksize *ddm) {save->orilx=ddm->smx,save->orily=ddm->smy;save->nowlx=ddm->smx,save->nowly=ddm->smy;save->a=ddm->a/ddm->sizetile;save->h=ddm->h/ddm->sizetile;
//	原有图片的左上角坐标save->m1x=0,save->m1y=0;save->putflag=0;save->drawflag=0;
}void oriset(IMAGE *set,struct drawdesksize ddm,int w,int h) {SetWorkingImage(set);setbkcolor(YELLOW);cleardevice();setlinecolor(BLACK);for(int i=0; i<h; i+=ddm.a/ddm.sizetile) {for(int j=0; j<w; j+=ddm.h/ddm.sizetile)rectangle(j+1,i+1,j+ddm.a/ddm.sizetile,i+ddm.h/ddm.sizetile);}line(0, 0, 800, 1400);SetWorkingImage();
}extern struct skline nf,ndnf;extern IMAGE maptile;void didshow(IMAGE *set,IMAGE maptile,ExMessage m,int show_x,int show_y,int nowlx,int nowly) {static int flag=0;static int oldx=-8,oldy=-8;int putx,puty;IMAGE olds(80,80);if(m.message==WM_LBUTTONDOWN) {SetWorkingImage(set);putx=nowlx+m.x-show_x;puty=nowly+m.y-show_y;putx=putx-putx%80;puty=puty-puty%80;putimage(putx,puty,&maptile);SetWorkingImage();} else{if(putx==oldx&&puty==oldy) {} else  {if(m.message==WM_LBUTTONDOWN) {}printf("show   %d %d\n",m.x,m.y);SetWorkingImage(set);putx=nowlx+m.x-show_x;puty=nowly+m.y-show_y;putx=putx-putx%80;puty=puty-puty%80;putimage(putx,puty,&maptile);oldx=putx;oldy=puty;SetWorkingImage();}}
}void show(IMAGE *set,ExMessage m,int show_x,int show_y,int show_wideth,int show_height) {
//	视口的图片大小,视口的大小,在窗口的坐标,视口的大小static int nowlx,nowly,pic_wide,pic_heigh;static int m1x,m1y;static int drawflag,putflag,attachflag;static	IMAGE olds(show_wideth,show_height);static	IMAGE news(show_wideth,show_height);static int m2x,m2y;
//	加速移动设置,自动移动设置。static int flag=1;if(flag==1) {pic_wide=show_wideth;pic_heigh=show_height;m1x=0;m1y=0;m2x=0;m2y=0;drawflag=0;putflag=0;attachflag=0;flag=0;setlinecolor(BLACK);rectangle(show_x,show_y,show_x+show_wideth,show_y+show_height);BeginBatchDraw();SetWorkingImage(set);getimage(&olds,nowlx,nowly,pic_wide,pic_heigh);SetWorkingImage();putimage(show_x,show_y,&olds);EndBatchDraw();} else {if(m.message==WM_LBUTTONDOWN) {if(m.ctrl&&m.x>show_x&&m.x<show_x+show_wideth&&m.y>show_y&&m.y<show_y+show_height) {putflag=true;
//					启动批复制粘贴
//					printf("%d\n",door.putflag);SetWorkingImage(set);getimage(&olds,nowlx,nowly,pic_wide,pic_heigh);
//					获取视口里的图片
//m1x=m.x;m1y=m.y;m2x=m.x;m2y=m.y;
//					printf("%d %d\n",m1x,m1y);SetWorkingImage();} else if (m.x>show_x&&m.x<show_x+show_wideth&&m.y>show_y&&m.y<show_y+show_height) {
//				printf("333333\n");didshow(set,maptile,m,show_x,show_y,nowlx,nowly);attachflag=true;}} else if(attachflag==true&&m.x>show_x&&m.x<show_x+show_wideth&&m.y>show_y&&m.y<show_y+show_height) {didshow(set,maptile,m,show_x,show_y,nowlx,nowly);if(m.message==WM_LBUTTONUP) {attachflag=false;}SetWorkingImage(set);getimage(&olds,nowlx,nowly,pic_wide,pic_heigh);SetWorkingImage();putimage(show_x,show_y,&olds);} else if(putflag==true) {BeginBatchDraw();SetWorkingImage();SetWorkingImage(set);nowlx=nowlx-5*(m.x-m1x);nowly=nowly-5*(m.y-m1y);
//			进行了位移放大。
//			位移同鼠标位移方向相反,大小相同m1x=m.x;m1y=m.y;getimage(&olds,nowlx,nowly,pic_wide,pic_heigh);
//			获取新地方的底图,为了下次重现,不干扰下次获取临近底图。
//		putimage(save->nowlx,save->nowly,&save->img2);SetWorkingImage();putimage(show_x,show_y,&olds);
//			putimage(500,500,&save->img3);EndBatchDraw();//			一次绘图出来,没有屏闪了if(m.message==WM_LBUTTONUP||m.ctrl==0) {putflag=0;}}}}extern IMAGE maptile;//用于设置绘图画布大小 //用于记录轨迹 
void remem(struct ExMessage m,int *lenth,struct drawdesksize ddm) {int i=*lenth;static int oldx=-ddm.sizetile,oldy=-ddm.sizetile,a=ddm.sizetile,h=ddm.sizetile;if(m.x>oldx&&m.x<oldx+a&&m.y>oldy&&m.y<oldy+h) {
//节约运算,只在绘制时进行坐标变换} else {int px=0,py=0,qx=0,qy=0;int mapqx=0,mapqy=0;//修正可涂色范围,防止溢出。y<不可等于640+100,x等于640+600-1是边界小方块的最右侧像素px=m.x-ddm.x;py=m.y-ddm.y;//修正600的偏移,601=600+1;0==1%8 ,600=600+(601-600)%8qx=px-px%a;qy=py-py%h;mapqx=qx/a;mapqy=qy/h;px=ddm.x+qx;py=ddm.y+qy;setfillcolor(BLACK);fillrectangle(px,py,px+ddm.sizetile,py+ddm.sizetile) ;nf.a[i].x = mapqx;nf.a[i].y = mapqy;i++;*lenth=i;nf.lenth=*lenth;printf("%d %d %d\n",i-1,nf.a[i-1].x,nf.a[i-1].y);putpixel(ddm.smx+nf.a[i-1].x,ddm.smy+nf.a[i-1].y,BLACK);oldx=px;oldy=py;}
}void draw(ExMessage m,int *lenth) {
//	绘制的函数static int flag=0;if(m.message==WM_LBUTTONDOWN) {remem(m,lenth,ddm);
//		printf("222\n");flag=1;} else if(flag==1) {remem(m,lenth,ddm);if(m.message==WM_LBUTTONUP) {flag=0;}}
}void drawmousecheck(ExMessage m,int *lenth,struct drawdesksize * ddm) {if(m.x>ddm->x&&m.x<ddm->x+ddm->a&&m.y>ddm->y&&m.y<ddm->y+ddm->h) {draw(m,lenth);
//			printf("333\n");}}void oriflowsave(int x,int y,int w,int h){setfillcolor(GREEN);int i;int num=0;for(int j=0; j<h; j++) {for(i=1; i<=w; i++) {a[num].lx=x+1+i*81;a[num].ly=y+1+j*81;a[num].wide=80;a[num].h=80;a[num].useflag=0;fillrectangle(a[num].lx,a[num].ly,a[num].lx+a[num].wide,a[num].ly+a[num].h);num++;}}
}void rehave(ExMessage m,int w,int h) {int i;int num=0;for(int j=0; j<w; j++) {for(i=1; i<=h;i++) {if(m.x>a[num].lx&&m.x<a[num].lx+a[num].wide&&m.y>a[num].ly&&m.y<a[num].ly+a[num].h) {if(a[num].useflag==1) {ndnf=a[num].b;break;}}num++;}}
}void pickpen(ExMessage m,int w,int h) {int i,j;int num=0;for(j=0; j<w; j++) {for(i=1; i<=h; i++) {if(m.x>a[num].lx&&m.x<a[num].lx+a[num].wide&&m.y>a[num].ly&&m.y<a[num].ly+a[num].h) {if(a[num].useflag==1) {getimage(&maptile,a[num].lx,a[num].ly,80,80);fillrectangle(20,80,100,160);putimage(20,80,&maptile);}}num++;}}
}void flowsave(ExMessage m,struct pircle *save,int w,int h) {if(m.message==WM_LBUTTONDOWN) {pickpen(m,w,h);} else if(m.message==WM_LBUTTONUP) {
//		单机直接粘贴bug但是可以作为长按的刷新,接入其他地方int i;int num=0;for(int j=0; j<w; j++) {for(i=1; i<=h; i++) {if(m.x>a[num].lx&&m.x<a[num].lx+a[num].wide&&m.y>a[num].ly&&m.y<a[num].ly+a[num].h) {if(a[num].useflag==0) {a[num].b=nf;if(save->nowlx!=save->orilx&&save->nowly!=save->orily) {putimage(save->nowlx,save->nowly,&save->img3);} else {getimage(&save->img2,save->orilx,save->orily,save->a,save->h);}putimage(a[num].lx,a[num].ly,&save->img2);save->nowlx=save->orilx;save->nowly=save->orily;save->m1x=0;save->m1y=0;
//						printf("%d\n",save->m1x);save->putflag=false;a[num].useflag=1;break;}}num++;}}}if(m.message==WM_RBUTTONDOWN) {rehave(m,w,h);}}extern int w2,h2;void movecheck(struct ExMessage m,struct pircle *save) {if(save->putflag==0&&m.message==WM_LBUTTONDOWN) {if(save->m1x==0&&save->m1y==0&&m.x>save->orilx&&m.x<save->orilx+save->a&&m.y>save->orily&&m.y<save->orily+save->h) {getimage(&save->img2,save->orilx,save->orily,save->a,save->h);getimage(&save->img3,save->orilx,save->orily,save->a,save->h);save->m1x=m.x;save->m1y=m.y;save->putflag=true;printf("2222\n");} else if(m.x>save->nowlx&&m.x<save->nowlx+save->a&&m.y>save->nowly&&m.y<save->nowly+save->h) {save->putflag=true;getimage(&save->img2,save->orilx,save->orily,save->a,save->h);save->m1x=m.x;save->m1y=m.y;
//			printf("11111\n");}} else if(save->putflag==true) {BeginBatchDraw();putimage(save->nowlx,save->nowly,&save->img3);save->nowlx=save->nowlx+m.x-save->m1x;save->nowly=save->nowly+m.y-save->m1y;save->m1x=m.x;save->m1y=m.y;getimage(&save->img3,save->nowlx,save->nowly,save->a,save->h);putimage(save->nowlx,save->nowly,&save->img2);EndBatchDraw();if(m.message==WM_LBUTTONUP) {save->putflag=0;}
//			一次绘图出来,没有屏闪了}}void buttonscheck(ExMessage m,struct pircle *save) {static int flag=0;if(flag==0) {rectangle(20,20,60,40);flowsave(m,save,w2,h2);flag=1;}movecheck(m,save);flowsave(m,save,w2,h2);}extern IMAGE set;//重置绘图版功能
void ori(struct drawdesksize ddm) {int i,j;int square=ddm.sizetile;setfillcolor(WHITE);setlinecolor(GREEN);for(i=ddm.x; i<=ddm.x+ddm.a-square; i+=square) {for(j=ddm.y; j<ddm.y+ddm.h; j+=square) {fillrectangle(i,j,i+square,j+square);}}for(i=ddm.smx; i<ddm.smx+ddm.a/ddm.sizetile; i++) {for(j=ddm.smy; j<ddm.smy+ddm.h/ddm.sizetile; j++) {putpixel(i,j,WHITE);}}
//	rectangle(ddm.smx-1,ddm.y-1,ddm.x,ddm.y);}void pixnf(int lenth,struct drawdesksize ddm) {
//		小地图打印int i=0;for(i=0; i<lenth; i++) {putpixel(ddm.smx+nf.a[i].x,ddm.smy+nf.a[i].y,WHITE);if(i%55==0)Sleep(1);}for(i=0; i<lenth; i++) {putpixel(ddm.smx+nf.a[i].x,ddm.smy+nf.a[i].y,BLACK);if(i%55==0)Sleep(1);}
}void keycheck(ExMessage m,int *lenth) {switch(m.vkcode) {case VK_F1:ori(ddm);*lenth=0;
//				优化清屏后叠加在小地图bug'break;case VK_F2 :saveimage(_T("gamemap.png"),&set);break;case VK_F5 :static int limf5=0;if(limf5==0) {pixnf(*lenth,ddm);limf5=1;break;} else {limf5=0;}
//				限制一次按动,一次调用,因为获取getmessage函数有连续两次探测。break;}}int main() {oripicdesk(1800,870);oridrawdesksize(&ddm,1000,100);oripircle(&save,&ddm);oriset(&set,ddm,w,h);
//初始化表格,界面setlinecolor(BLACK);oriflowsave(x2,y2,w2,h2);drawdesk(ddm);ExMessage m;int lenth=0;while (1) {m = getmessage(EX_MOUSE | EX_KEY);drawmousecheck(m,&lenth,&ddm);keycheck(m,&lenth);buttonscheck(m,&save);show(&set,m,showx3,showy3,600,700);}closegraph();return 0;
}

 

上面的整合版本是展示

下面是实际开发.h组合cpp的版本

 分类说明

.h版本的功能模块

主函数,可以看出来一次循环执行内容,功能与名称相统一。

main.cpp文件代码

新建项目,复制粘贴,有的保存为cpp,有的保存为.h文件

原始版本:

#include<stdio.h>
#include<graphics.h>
//INputboX
#include<windows.h>
//Sleep(2000);
//在中断休止
#include <conio.h>
// kbhit(void);检测按键,无也继续下去
#include<string.h>
//保存导入输入#include"oripic.h"
#include"show.h"
#include"draw.h"
#include"flowsave.h"
#include"movecheck.h"
#include"buttoncheck.h"
#include"keycheck.h"int w=3600;
int h=800;
int w2=3,h2=7;
int x2=650,y2=100;
int showx3=101,showy3=100;int main() {oripicdesk(1800,870);oridrawdesksize(&ddm,1000,100);oripircle(&save,&ddm);oriset(&set,ddm,w,h);
//初始化表格,界面setlinecolor(BLACK);oriflowsave(x2,y2,w2,h2);drawdesk(ddm);ExMessage m;int lenth=0;while (1) {m = getmessage(EX_MOUSE | EX_KEY);drawmousecheck(m,&lenth,&ddm);keycheck(m,&lenth);buttonscheck(m,&save);show(&set,m,showx3,showy3,600,700);}closegraph();return 0;
}

 

oripic.h文件代码

初始化,但是这个函数属于最后写的,把一些代码整合,美观一点。其他没啥用

extern int w,h; IMAGE set(w,h);struct pixlocal {short x;short y;
};struct skline {int lenth=0;int setx,sety;struct pixlocal a[10000];
} nf,ndnf;struct drawdesksize {int x;int y;int a;int h;int sizetile=8;int smx;int smy;
} ddm;IMAGE maptile(ddm.a/ddm.sizetile,ddm.h/ddm.sizetile);struct pircle {IMAGE img2;IMAGE img3;int orilx,orily;int nowlx,nowly;int a,h;
//	原有图片的左上角坐标int m1x=0,m1y=0;int  putflag=0;int  drawflag=0;struct skline b;
} save;struct picsave {int lx;int ly;int wide;int h;int useflag;struct skline b;
} a[28];void oripicdesk(int a,int h) {initgraph(a,h,EX_SHOWCONSOLE);setbkcolor(WHITE);cleardevice();
//	创制绘图界面,背景色设置,以背景色填充。setlinecolor(BLACK);setlinestyle(PS_SOLID,1);
//	不含实线,矩形的面积为8*8;含实线,9*9.rectangle(0,0,a-2,h-1);//确定工作界面范围setfillcolor(WHITE);
}void oridrawdesksize(struct drawdesksize* ddm,int x,int y) {ddm->x=x;ddm->y=y;ddm->a=640;ddm->h=640;ddm->sizetile=8;ddm->smx=ddm->x-ddm->a/ddm->sizetile;ddm->smy=ddm->y-ddm->h/ddm->sizetile;
}void drawdesk(struct drawdesksize ddm) {int i,j;int square=ddm.sizetile;for(i=ddm.x; i<=ddm.x+ddm.a-square; i+=square) {for(j=ddm.y; j<ddm.y+ddm.h; j+=square) {fillrectangle(i,j,i+square,j+square);}}rectangle(ddm.smx-1,ddm.smy-1,ddm.x,ddm.y);
}void oripircle(struct pircle *save,struct drawdesksize *ddm) {save->orilx=ddm->smx,save->orily=ddm->smy;save->nowlx=ddm->smx,save->nowly=ddm->smy;save->a=ddm->a/ddm->sizetile;save->h=ddm->h/ddm->sizetile;
//	原有图片的左上角坐标save->m1x=0,save->m1y=0;save->putflag=0;save->drawflag=0;
}void oriset(IMAGE *set,struct drawdesksize ddm,int w,int h) {SetWorkingImage(set);setbkcolor(YELLOW);cleardevice();setlinecolor(BLACK);for(int i=0; i<h; i+=ddm.a/ddm.sizetile) {for(int j=0; j<w; j+=ddm.h/ddm.sizetile)rectangle(j+1,i+1,j+ddm.a/ddm.sizetile,i+ddm.h/ddm.sizetile);}line(0, 0, 800, 1400);SetWorkingImage();
}

 

这就是本篇文案解决的问题后产生的代码,

可以和DevC++ easyx实现悬浮窗放入网格,与在函数分离过程中遇到的BUG下理解 函数的作用时域 以及 初始化与复位的关系。-CSDN博客

与DevC++ easyx实现地图拖动,超过屏幕大小的巨大地图的局部显示在屏幕的方法——用悬浮窗的原理来的实现一个视口-CSDN博客 

对比看一看代码,这就是视口编辑代码的族谱。 

视口代码。maptile就是粘贴的瓦片,set就是大地图,其他函数参数是视口位置坐标,自己换点数据试试,自然而然。

show.h文件代码

extern struct skline nf,ndnf;extern IMAGE maptile;void didshow(IMAGE *set,IMAGE maptile,ExMessage m,int show_x,int show_y,int nowlx,int nowly) {static int flag=0;static int oldx=-8,oldy=-8;int putx,puty;IMAGE olds(80,80);if(m.message==WM_LBUTTONDOWN) {SetWorkingImage(set);putx=nowlx+m.x-show_x;puty=nowly+m.y-show_y;putx=putx-putx%80;puty=puty-puty%80;putimage(putx,puty,&maptile);SetWorkingImage();} else{if(putx==oldx&&puty==oldy) {} else  {if(m.message==WM_LBUTTONDOWN) {}printf("show   %d %d\n",m.x,m.y);SetWorkingImage(set);putx=nowlx+m.x-show_x;puty=nowly+m.y-show_y;putx=putx-putx%80;puty=puty-puty%80;putimage(putx,puty,&maptile);oldx=putx;oldy=puty;SetWorkingImage();}}
}void show(IMAGE *set,ExMessage m,int show_x,int show_y,int show_wideth,int show_height) {
//	视口的图片大小,视口的大小,在窗口的坐标,视口的大小static int nowlx,nowly,pic_wide,pic_heigh;static int m1x,m1y;static int drawflag,putflag,attachflag;static	IMAGE olds(show_wideth,show_height);static	IMAGE news(show_wideth,show_height);static int m2x,m2y;
//	加速移动设置,自动移动设置。static int flag=1;if(flag==1) {pic_wide=show_wideth;pic_heigh=show_height;m1x=0;m1y=0;m2x=0;m2y=0;drawflag=0;putflag=0;attachflag=0;flag=0;setlinecolor(BLACK);rectangle(show_x,show_y,show_x+show_wideth,show_y+show_height);BeginBatchDraw();SetWorkingImage(set);getimage(&olds,nowlx,nowly,pic_wide,pic_heigh);SetWorkingImage();putimage(show_x,show_y,&olds);EndBatchDraw();} else {if(m.message==WM_LBUTTONDOWN) {if(m.ctrl&&m.x>show_x&&m.x<show_x+show_wideth&&m.y>show_y&&m.y<show_y+show_height) {putflag=true;
//					启动批复制粘贴
//					printf("%d\n",door.putflag);SetWorkingImage(set);getimage(&olds,nowlx,nowly,pic_wide,pic_heigh);
//					获取视口里的图片
//m1x=m.x;m1y=m.y;m2x=m.x;m2y=m.y;
//					printf("%d %d\n",m1x,m1y);SetWorkingImage();} else if (m.x>show_x&&m.x<show_x+show_wideth&&m.y>show_y&&m.y<show_y+show_height) {
//				printf("333333\n");didshow(set,maptile,m,show_x,show_y,nowlx,nowly);attachflag=true;}} else if(attachflag==true&&m.x>show_x&&m.x<show_x+show_wideth&&m.y>show_y&&m.y<show_y+show_height) {didshow(set,maptile,m,show_x,show_y,nowlx,nowly);if(m.message==WM_LBUTTONUP) {attachflag=false;}SetWorkingImage(set);getimage(&olds,nowlx,nowly,pic_wide,pic_heigh);SetWorkingImage();putimage(show_x,show_y,&olds);} else if(putflag==true) {BeginBatchDraw();SetWorkingImage();SetWorkingImage(set);nowlx=nowlx-5*(m.x-m1x);nowly=nowly-5*(m.y-m1y);
//			进行了位移放大。
//			位移同鼠标位移方向相反,大小相同m1x=m.x;m1y=m.y;getimage(&olds,nowlx,nowly,pic_wide,pic_heigh);
//			获取新地方的底图,为了下次重现,不干扰下次获取临近底图。
//		putimage(save->nowlx,save->nowly,&save->img2);SetWorkingImage();putimage(show_x,show_y,&olds);
//			putimage(500,500,&save->img3);EndBatchDraw();//			一次绘图出来,没有屏闪了if(m.message==WM_LBUTTONUP||m.ctrl==0) {putflag=0;}}}}

 

draw.h文件代码

这是绘制瓦片纹理的像素绘图板的绘制矩形像素部分。

做了一点优化,如果还是属于原来的方块,就不执行绘制了。减少重复绘制。

extern IMAGE maptile;//用于设置绘图画布大小 //用于记录轨迹 
void remem(struct ExMessage m,int *lenth,struct drawdesksize ddm) {int i=*lenth;static int oldx=-ddm.sizetile,oldy=-ddm.sizetile,a=ddm.sizetile,h=ddm.sizetile;if(m.x>oldx&&m.x<oldx+a&&m.y>oldy&&m.y<oldy+h) {
//节约运算,只在绘制时进行坐标变换} else {int px=0,py=0,qx=0,qy=0;int mapqx=0,mapqy=0;//修正可涂色范围,防止溢出。y<不可等于640+100,x等于640+600-1是边界小方块的最右侧像素px=m.x-ddm.x;py=m.y-ddm.y;//修正600的偏移,601=600+1;0==1%8 ,600=600+(601-600)%8qx=px-px%a;qy=py-py%h;mapqx=qx/a;mapqy=qy/h;px=ddm.x+qx;py=ddm.y+qy;setfillcolor(BLACK);fillrectangle(px,py,px+ddm.sizetile,py+ddm.sizetile) ;nf.a[i].x = mapqx;nf.a[i].y = mapqy;i++;*lenth=i;nf.lenth=*lenth;printf("%d %d %d\n",i-1,nf.a[i-1].x,nf.a[i-1].y);putpixel(ddm.smx+nf.a[i-1].x,ddm.smy+nf.a[i-1].y,BLACK);oldx=px;oldy=py;}
}void draw(ExMessage m,int *lenth) {
//	绘制的函数static int flag=0;if(m.message==WM_LBUTTONDOWN) {remem(m,lenth,ddm);
//		printf("222\n");flag=1;} else if(flag==1) {remem(m,lenth,ddm);if(m.message==WM_LBUTTONUP) {flag=0;}}
}void drawmousecheck(ExMessage m,int *lenth,struct drawdesksize * ddm) {if(m.x>ddm->x&&m.x<ddm->x+ddm->a&&m.y>ddm->y&&m.y<ddm->y+ddm->h) {draw(m,lenth);
//			printf("333\n");}}

flowsave.h文件

绿色网格检测白色瓦片用于暂存。


void oriflowsave(int x,int y,int w,int h){setfillcolor(GREEN);int i;int num=0;for(int j=0; j<h; j++) {for(i=1; i<=w; i++) {a[num].lx=x+1+i*81;a[num].ly=y+1+j*81;a[num].wide=80;a[num].h=80;a[num].useflag=0;fillrectangle(a[num].lx,a[num].ly,a[num].lx+a[num].wide,a[num].ly+a[num].h);num++;}}
}void rehave(ExMessage m,int w,int h) {int i;int num=0;for(int j=0; j<w; j++) {for(i=1; i<=h;i++) {if(m.x>a[num].lx&&m.x<a[num].lx+a[num].wide&&m.y>a[num].ly&&m.y<a[num].ly+a[num].h) {if(a[num].useflag==1) {ndnf=a[num].b;break;}}num++;}}
}void pickpen(ExMessage m,int w,int h) {int i,j;int num=0;for(j=0; j<w; j++) {for(i=1; i<=h; i++) {if(m.x>a[num].lx&&m.x<a[num].lx+a[num].wide&&m.y>a[num].ly&&m.y<a[num].ly+a[num].h) {if(a[num].useflag==1) {getimage(&maptile,a[num].lx,a[num].ly,80,80);fillrectangle(20,80,100,160);putimage(20,80,&maptile);}}num++;}}
}void flowsave(ExMessage m,struct pircle *save,int w,int h) {if(m.message==WM_LBUTTONDOWN) {pickpen(m,w,h);} else if(m.message==WM_LBUTTONUP) {
//		单机直接粘贴bug但是可以作为长按的刷新,接入其他地方int i;int num=0;for(int j=0; j<w; j++) {for(i=1; i<=h; i++) {if(m.x>a[num].lx&&m.x<a[num].lx+a[num].wide&&m.y>a[num].ly&&m.y<a[num].ly+a[num].h) {if(a[num].useflag==0) {a[num].b=nf;if(save->nowlx!=save->orilx&&save->nowly!=save->orily) {putimage(save->nowlx,save->nowly,&save->img3);} else {getimage(&save->img2,save->orilx,save->orily,save->a,save->h);}putimage(a[num].lx,a[num].ly,&save->img2);save->nowlx=save->orilx;save->nowly=save->orily;save->m1x=0;save->m1y=0;
//						printf("%d\n",save->m1x);save->putflag=false;a[num].useflag=1;break;}}num++;}}}if(m.message==WM_RBUTTONDOWN) {rehave(m,w,h);}}

 

 

 movecheck.h文件

就是DevC++ easyx实现图片拖动,一种悬浮窗实现原理与完整代码-CSDN博客

 

extern int w2,h2;void movecheck(struct ExMessage m,struct pircle *save) {if(save->putflag==0&&m.message==WM_LBUTTONDOWN) {if(save->m1x==0&&save->m1y==0&&m.x>save->orilx&&m.x<save->orilx+save->a&&m.y>save->orily&&m.y<save->orily+save->h) {getimage(&save->img2,save->orilx,save->orily,save->a,save->h);getimage(&save->img3,save->orilx,save->orily,save->a,save->h);save->m1x=m.x;save->m1y=m.y;save->putflag=true;printf("2222\n");} else if(m.x>save->nowlx&&m.x<save->nowlx+save->a&&m.y>save->nowly&&m.y<save->nowly+save->h) {save->putflag=true;getimage(&save->img2,save->orilx,save->orily,save->a,save->h);save->m1x=m.x;save->m1y=m.y;
//			printf("11111\n");}} else if(save->putflag==true) {BeginBatchDraw();putimage(save->nowlx,save->nowly,&save->img3);save->nowlx=save->nowlx+m.x-save->m1x;save->nowly=save->nowly+m.y-save->m1y;save->m1x=m.x;save->m1y=m.y;getimage(&save->img3,save->nowlx,save->nowly,save->a,save->h);putimage(save->nowlx,save->nowly,&save->img2);EndBatchDraw();if(m.message==WM_LBUTTONUP) {save->putflag=0;}
//			一次绘图出来,没有屏闪了}}void buttonscheck(ExMessage m,struct pircle *save) {static int flag=0;if(flag==0) {rectangle(20,20,60,40);flowsave(m,save,w2,h2);flag=1;}movecheck(m,save);flowsave(m,save,w2,h2);}

keycheck.h文件

这个是按键实现保存,清屏处理。

这也是软件快捷键的执行的代码。

extern IMAGE set;//重置绘图版功能
void ori(struct drawdesksize ddm) {int i,j;int square=ddm.sizetile;setfillcolor(WHITE);setlinecolor(GREEN);for(i=ddm.x; i<=ddm.x+ddm.a-square; i+=square) {for(j=ddm.y; j<ddm.y+ddm.h; j+=square) {fillrectangle(i,j,i+square,j+square);}}for(i=ddm.smx; i<ddm.smx+ddm.a/ddm.sizetile; i++) {for(j=ddm.smy; j<ddm.smy+ddm.h/ddm.sizetile; j++) {putpixel(i,j,WHITE);}}
//	rectangle(ddm.smx-1,ddm.y-1,ddm.x,ddm.y);}void pixnf(int lenth,struct drawdesksize ddm) {
//		小地图打印int i=0;for(i=0; i<lenth; i++) {putpixel(ddm.smx+nf.a[i].x,ddm.smy+nf.a[i].y,WHITE);if(i%55==0)Sleep(1);}for(i=0; i<lenth; i++) {putpixel(ddm.smx+nf.a[i].x,ddm.smy+nf.a[i].y,BLACK);if(i%55==0)Sleep(1);}
}void keycheck(ExMessage m,int *lenth) {switch(m.vkcode) {case VK_F1:ori(ddm);*lenth=0;
//				优化清屏后叠加在小地图bug'break;case VK_F2 :saveimage(_T("gamemap.png"),&set);break;case VK_F5 :static int limf5=0;if(limf5==0) {pixnf(*lenth,ddm);limf5=1;break;} else {limf5=0;}
//				限制一次按动,一次调用,因为获取getmessage函数有连续两次探测。break;}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习(二) -- 数据预处理(2)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 未完待续…… 目录 系列文章目录 前言 四、【数据清洗】 1、缺失数据的检测与处理 1.1、检测与统计 1.2、处理 1.2.1、删除缺…

Postgresql源码(119)PL/pgSQL中ExprContext的生命周期

前言 在PL/pgSQL语言中&#xff0c;执行任何SQL都需要通过SPI调用SQL层解析执行&#xff0c;例如在SQL层执行表达式的入口&#xff1a; static bool exec_eval_simple_expr(PLpgSQL_execstate *estate,PLpgSQL_expr *expr,Datum *result,bool *isNull,Oid *rettype,int32 *re…

助力成长的开源项目 —— 筑梦之路

闯关式 SQL 自学&#xff1a;sql-mother 免费的闯关式 SQL 自学教程网站&#xff0c;从 0 到 1 带大家掌握常用 SQL 语法&#xff0c;目前一共有 30 多个关卡&#xff0c;希望你在通关的时候&#xff0c;变身为一个 SQL 高手。除了闯关模式之外&#xff0c;这个项目支持自由选…

VuePress、VuePress-theme-hope 搭建个人博客 1【快速上手】 —— 防止踩坑篇

vuePress官网地址 &#x1f449; 首页 | VuePress 手动安装 这一章节会帮助你从头搭建一个简单的 VuePress 文档网站。如果你想在一个现有项目中使用 VuePress 管理文档&#xff0c;从步骤 3 开始。 步骤 1: 创建并进入一个新目录 mkdir vuepress-starter cd vuepress-star…

创建x11vnc系统进程

为方便使用vnc&#xff0c;所以寻找到一个比较好用的vnc服务端那就是x11vnc&#xff0c;索性就创建了一个系统进程 一、环境 系统&#xff1a;银河麒麟v4-sp2-server 软件&#xff1a;x11vnc【linux下】、VNCviewer【win下】 二、安装x11vnc 1、挂载光盘源并修改apt源 mou…

用可视化案例讲Rust编程1. 怎么能学会Rust

用可视化案例讲Rust编程 1. 怎么能学会Rust 如果要列举Rust的优势&#xff0c;恐怕写个十条八条是写不完的&#xff0c;而且不管写哪条优势&#xff0c;都有很多同学跳起来反驳&#xff0c;比如我们说Rust比C/C内存安全&#xff0c;肯定有同学说C 20也支持内存安全&#xff0…

message: 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogra

第一步&#xff1a;修改 project.config.json 文件 "packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./miniprogram/"}], "packNpmManually": true 第二步&#xff1a;…

机器人活动区域 - 华为OD统一考试

OD统一考试 题解: Java / Python / C++ 题目描述 现有一个机器人,可放置于 M x N 的网格中任意位置,每个网格包含一个非负整数编号,当相邻网格的数字编号差值的绝对值小于等于 1 时机器人可以在网格间移动。 问题: 求机器人可活动的最大范围对应的网格点数目。 说明: 网格…

Android Studio xml布局代码补全功能失效问题

这里写目录标题 前言&#xff1a;问题描述原因分析&#xff1a;解决方案&#xff1a;1.更新 Android Studio 版本2.原版本解决XML补全失效 小结 前言&#xff1a; 在开发过程中&#xff0c;你可能遇到很多奇奇怪怪的问题。Android Studio 编译器出现问题也是常有的事情&#x…

单片机开发--keil5

一.keil5 Keil uVision5是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于对嵌入式系统中的微控制器进行编程。它是一个软件套件&#xff0c;包括源代码编辑器、项目经理、调试器以及微控制器开发、调试和编程所需的其他工具。Keil uVision5 IDE主要用于对基于A…

线性代数基础知识

计算机视觉一些算法中常会用到线性代数的一些知识&#xff0c;为了便于理解和快速回忆&#xff0c;博主这边对常用的一些知识点做下整理&#xff0c;主要来源于如下这本书籍。 1. 矩阵不仅仅是数字排列而已&#xff0c;不然也不会有那么大精力研究它。其可以表示一种映射 关于…

Linux Debian12安装和使用ImageMagick图像处理工具 常见图片png、jpg格式转webp格式

一、ImageMagick简介 ImageMagick是一套功能强大、稳定而且免费的工具集和开发包。可以用来读、写和图像格式转换&#xff0c;可以处理超过100种图像格式&#xff0c;包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等格式。对图片的操作&#xff0c;即可以通过命令行进行&am…

Bert模型from_pretrained报网络错误解决办法

问题描述&#xff1a; 服务器或者本地运行以下代码时报网络连接错误&#xff1a; from transformers import AutoTokenizermodel_checkpoint "distilbert-base-uncased" tokenizer AutoTokenizer.from_pretrained(model_checkpoint, use_fastTrue, cache_dir./cac…

python解决一维动态规划问题,寻找丑数

对于一维动态规划问题中&#xff0c;还有一个可能会经常遇到的问题&#xff0c;就是寻找丑数。 对于丑数的概念是&#xff0c;把只包含质因子2、3和5的数称作丑数&#xff08;Ugly Number&#xff09;。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添…

Vue-响应式数据

一、ref创建基本类型的响应式数据 vue3可以使用ref、reactive去定义响应式数数据。 知识点汇总 使用ref需要先引入ref&#xff0c;import {ref} from vue在模板 template 中使用了添加ref 的响应式数据&#xff0c;变量的后面不用添加.value所有js代码里面&#xff0c;去操作r…

【web】vue 播放后端(flask)发送的 mp3 文件

文章目录 演示后端&#xff08;flask&#xff09;前端&#xff08;vue3&#xff09;重要说明 演示 后端&#xff08;flask&#xff09; 后端返回的是 mp3 文件的 url&#xff0c;是可以直接在浏览器上打开后播放的处理跨域请求pip install flask-cors后端代码from flask impor…

Python - 数据结构与算法之 排列与组合

目录 一.引言 二.排列 A-Permute ◆ 定义 ◆ 计算 ◆ 性质 ◆ 实现 三.组合 C-Combine ◆ 定义 ◆ 计算 ◆ 性质 ◆ 实现 四.经典算法题目 1.全排列 [无重复] 2.全排列 [有重复] 3.组合 [可重复] 4.子集 [无重复] 5.子集 [有重复] 五.总结 一.引言 关于排列…

云原生十二问

一、什么是云原生&#xff1f; 云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法。现代企业希望构建高度可扩展、灵活且具有弹性的应用程序&#xff0c;可以快速更新以满足客户需求。为此&#xff0c;他们使用现代工具和技术&#xff0c;这些工具和技术本质上支…

科普帖:什么是XaaS-一切皆服务模型(包含10个示例类别)

有时似乎有太多的商业首字母缩写词要记住。随着快速变化的技术进步和云计算的出现&#xff0c;新的类别将不断涌现。XaaS 就是这样一个最新的补充。 该领域的大多数读者都知道SaaS&#xff08;软件即服务&#xff09;、IaaS&#xff08;基础设施即服务&#xff09;和PaaS&…

【CISSP学习笔记】5. 安全架构和工程

该知识领域涉及如下考点&#xff0c;具体内容分布于如下各个子章节&#xff1a; 使用安全设计原理来研究、实施与管理工程过程理解安全模型的基本概念&#xff08;例如 Biba、Star Model、Bell-LaPadula 等模型&#xff09;基于系统安全要求选择控制措施理解信息系统 (IS) 的安…