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("\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;
}
嵌入式修改

模糊處理操控的碼源: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM