<span>Easyx基础:【绘图坐标+坐标转换+光标移动】(整理)+全屏鼠标投影(原创)</span>
学习了好一段时间,效率极其低下ヽ(≧□≦)ノ
搜索学习各种各样的,但是都没见过好好整理的,极其麻烦,
特别是有的函数少见,整明白一个函数特别难,难得搜到,也难得看懂,忽然想起Easyx官网有介绍,人都傻了...(ˉ﹃ˉ)阿巴阿巴阿巴。。。
在此分享目前个人学习到的,成功达到学习目的的,成果,整合。
因为重要,所以前置!!!
1.使用函数的理论方面内容太多,还请自行学习,首建官网:https://docs.easyx.cn/zh-cn/reference
2.其他方面的理论知识也是如上,各求所需,下面会分享个人认为比较好的一些资源网站。
3.如果对Easyx一点都不懂,甚至还没下载安装,点击这里—>https://codeabc.cn/bestans/a/concise-lesson-contents
获取各种句柄:https://my.oschina.net/u/2314763/blog/422622 + https://www.cnblogs.com/zjutlitao/p/3889900.html
vs2019项目打包:https://blog.csdn.net/wangyunzhao007/article/details/84932389(注意漏了一个步骤:在创建Setup Project之前的配置界面 需要选择解决方案 为(添加到解决方案)而不是(创建新解决方案),否则 项目输出 会是 空白界面!!!)
下面是标题代码:
windows框综合
tip:代码,注释都有空白区分开,便于拆分理解。
简单用例:
(两个都是采用字符输出来替代图像,图像投影简单,可以照葫芦画瓢啦,设置下坐标就行)
#include<graphics.h> #include<windows.h> int main() { POINT p; HWND hd = GetForegroundWindow(); TCHAR S[]=_T("无论在哪里,我都爱你阿"); int X=640,Y=480;//大小可任意适度修改 initgraph(X,Y); int mx=GetSystemMetrics(SM_CXFULLSCREEN); int my=GetSystemMetrics(SM_CYFULLSCREEN); int width = X; //减去量不定,个例 if(width>textwidth(S))width-=textwidth(S); int high = Y; if(high>60*Y/480)high-=60*Y/480; while(1) { GetCursorPos(&p); int x=p.x*width/mx; int y=p.y*high/my; outtextxy(x,y,S); Sleep(10); //system("pause>nul"); //两种清屏方式: //clearrectangle(x,y,x+textwidth(S),y+textheight(S)); cleardevice(); //system("pause>nul"); } return 0; }
#include<iostream> #include<windows.h> #include<graphics.h> using namespace std; int main() { HWND hd = GetForegroundWindow(); //这里是使用的Easyx绘图投影,另外写的用例基本window窗口的投影,两种。 int X=640,Y=480;//大小可任意适度修改 int kuan=X; int gao=Y; int mx=GetSystemMetrics(SM_CXFULLSCREEN); int my=GetSystemMetrics(SM_CYFULLSCREEN); int a = 8, b = 16;//一个基本输出单位所占像素大小:宽度,高度 char S[6][9]={"********","a a","a a","a a","a a","********"};//a+a 含有6个空格 TCHAR s1[] =_T( "████" ); TCHAR s2[] =_T( "a a");//含有12个空格 因为一个空格只占用4个宽度的像素 x2 才是理想图像 TCHAR s3[] =_T( "a a"); TCHAR s4[] =_T( "a a"); TCHAR s5[] =_T( "a a"); TCHAR s6[] =_T( "████" ); initgraph(X, Y); while(1) { int i=0, k=0; TCHAR Len1[10],Len2[10]; //图像的侧边 输出该字符串所占高度和宽度 outtextxy(k, i++ * 16, s1); sprintf(Len1,_T("%d"),textheight(s1));sprintf(Len2,_T("%d"),textwidth(s1));outtextxy(k+90,i*16-16,Len1);outtextxy(k+120,i*16-16,Len2); outtextxy(k, i++ * 16, s2); sprintf(Len1,_T("%d"),textheight(s2));sprintf(Len2,_T("%d"),textwidth(s2));outtextxy(k+90,i*16-16,Len1);outtextxy(k+120,i*16-16,Len2); outtextxy(k, i++ * 16, s3); sprintf(Len1,_T("%d"),textheight(s3));sprintf(Len2,_T("%d"),textwidth(s3));outtextxy(k+90,i*16-16,Len1);outtextxy(k+120,i*16-16,Len2); outtextxy(k, i++ * 16, s4); sprintf(Len1,_T("%d"),textheight(s4));sprintf(Len2,_T("%d"),textwidth(s4));outtextxy(k+90,i*16-16,Len1);outtextxy(k+120,i*16-16,Len2); outtextxy(k, i++ * 16, s5); sprintf(Len1,_T("%d"),textheight(s5));sprintf(Len2,_T("%d"),textwidth(s5));outtextxy(k+90,i*16-16,Len1);outtextxy(k+120,i*16-16,Len2); outtextxy(k, i++ * 16, s6); sprintf(Len1,_T("%d"),textheight(s6));sprintf(Len2,_T("%d"),textwidth(s6));outtextxy(k+90,i*16-16,Len1);outtextxy(k+120,i*16-16,Len2); POINT p; GetCursorPos(&p); int x=p.x*kuan/mx; int y=p.y*gao/my; if(!x%a)x--; if(!y%b)y--; i++; outtextxy(k,++i*16-16,"投影像素坐标:");sprintf(Len1,_T("%d"),x); sprintf(Len2,_T("%d"),y);outtextxy(k+110,i*16-16,Len1);outtextxy(k+150,i*16-16,Len2); outtextxy(k,++i*16-16,"投影逻辑坐标:");sprintf(Len1,_T("%d"),y/b);sprintf(Len2,_T("%d"),x/a);outtextxy(k+110,i*16-16,Len1);outtextxy(k+150,i*16-16,Len2); // 需要判断上边界和下边界,左边界和右边界 // 此外,因为是用的汉字,而汉字占用两个基本字符的像素,所以需要判断汉字中间位置的像素点 (不需要再写代码判断) // 因此,比如第二行右边的a的位置为(1,5),而实际显示撞墙的坐标会是(1,5),(1,6),(1,7) 三个点 if((S[y/b][x/a+1]!=' '||S[y/b][x/a+2]!=' '||S[y/b+1][x/a+1]!=' '||S[y/b+1][x/a+2]!=' ')&&x/a+1<=8&&y/b<6)outtextxy(k, i++ * 16, "当前位置撞墙 "); else outtextxy(k, i++ * 16, "当前位置未撞墙"); outtextxy(x,y,"我"); Sleep(100); //system("pause>nul"); cleardevice(); } return 0; }
下面是经典使用案例(全屏鼠标精准投影操控游戏):
#include<stdio.h> #include<windows.h> #include<stdlib.h> #include<time.h> #define K 10 //宽 #define C 20 //长 #define D 7 //障碍间隔 #define L ((K-2)*7/8) //障碍最长值 int wo,I; void getmouse_() { HANDLE Hd=GetStdHandle(STD_OUTPUT_HANDLE); HWND hd=GetForegroundWindow(); POINT p; int high=K*15-45; int width=C*8; int max_x=GetSystemMetrics(SM_CXFULLSCREEN); int max_y=GetSystemMetrics(SM_CYFULLSCREEN); GetCursorPos(&p); int x=p.y*high/(double)max_y; int y=p.x*width/(double)max_x; int a=16,b=8; if(!x%a)x--; if(!y%b)y--; wo=x/a+1; I=y/b; } int main() { relife: //重玩 char a[K][C],game; DWORD S,E; //系统运行时间 S=GetTickCount(); float v=1; int random,d=D,start=0,score=1,speed,i,j; POINT q={0,0}; //和坐标有关的东西 LPPOINT s=&q; //和坐标有关的东西 for(i=0;i<K;i++) for(j=0;j<C;j++) a[i][j]=' '; //初始化地图 for(i=0;i<C;i++) a[0][i]=a[K-1][i]='-'; //初始化边界 srand((unsigned)time(0)); while(1) { getmouse_(); if(a[wo][I]=='*') break; else { goon: //复活 a[wo][I]='O'; } system("cls"); for(i=0;i<K;i++) { for(j=0;j<C;j++) { if(i==wo&&j==I) printf("@ "); //角色 else if(a[i][j]=='-'||a[i][j]=='*') printf("█"); //边界和障碍 else printf(" "); } printf("\n"); } start++; if(start==7) { printf("1.鼠标控制移动\n"); printf("2.只要手速快,允许闪现穿墙(认真脸)\n"); printf("3.按任意键开始游戏\n\n\n\n"); score=0; system("pause"); } a[wo][I]=' '; for(i=0;i<C-1;i++) for(j=1;j<K-1;j++) a[j][i]=a[j][i+1]; //障碍移动 if(d==D) { random=rand()%(2*L)-L; //生成随机障碍 if(random>K-2||random<(2-K)||(random<3&&random>-3)) random=3; if(random>0) for(i=1;random>0;random--,i++) a[i][C-1]='*'; else for(i=K-2;random<0;random++,i--) a[i][C-1]='*'; d=0; score++; speed=1000/score; } else for(i=1;i<=K-2;i++) a[i][C-1]=' '; printf("得分:%d",score); E=GetTickCount(); if(v<1000/((float)(E-S))&&start>=7) v=1000/((float)(E-S)); printf(" 速度:%.3lf格/秒",v); S=GetTickCount(); if(start>=7) Sleep(speed); d++; } printf("\n游戏结束\n\n\n1.按(空格+任意键)可复活继续游戏\n2.按(非空格+任意键)重新开始游戏\n"); scanf("%c",&game); getchar(); if(game=='\n') goto relife; if(game==' ') goto goon; return 0; }