zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    使用库项目实现Android程序代码的复用 java程序员
    编译触摸tslib出错:libtool: link: only absolute runpaths are allowed java程序员
    Linux下的TFTP软件的安装设置(TQ210)ubuntu11.10 java程序员
    拥有超过1200个PNG格式图标的免费图标集 Cosmo Mini java程序员
    Android Develop Training中文翻译06《Starting Another Activity》 java程序员
    周记二
    周记三
    周记
    周记
    周记
  • 原文地址:https://www.cnblogs.com/Renhr/p/13407569.html
Copyright © 2011-2022 走看看