Easyx基础:【绘图坐标+坐标转换+光标移动】(整理)+全屏鼠标投影(原创)

学习了好一段时间,效率极其低下ヽ(≧□≦)ノ

搜索学习各种各样的,但是都没见过好好整理的,极其麻烦,

特别是有的函数少见,整明白一个函数特别难,难得搜到,也难得看懂,忽然想起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;
}
Easyx绘图框_鼠标移动绘图
#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;
}
Easyx绘图框综合

下面是经典使用案例(全屏鼠标精准投影操控游戏):

#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("
");
        }
        start++;
        if(start==7) 
        {
            printf("1.鼠标控制移动
");
            printf("2.只要手速快,允许闪现穿墙(认真脸)
");
            printf("3.按任意键开始游戏



");
            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("
游戏结束


1.按(空格+任意键)可复活继续游戏
2.按(非空格+任意键)重新开始游戏
");
    scanf("%c",&game);
    getchar();
    if(game=='
') goto relife;
    if(game==' ') goto goon;
    return 0;
}
嵌入式修改

模糊处理操控的码源:https://blog.csdn.net/LittleWhiteLv/article/details/80375047?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

原文地址:https://www.cnblogs.com/Renhr/p/13407569.html