【一些笔记】EGE学习过程中玩的小玩意

总的来说就是一个方块绘图的玩意,其实没啥技术含量,大佬绕行哈
效果图:
请添加图片描述

  • 背景中的每个像素都是随机数生成的(终于知道为啥小时候电视机没信号显示的是那样了、、)
  • WASD控制方块上下左右
  • IJKL控制视角上下左右
  • EQ控制连续绘制和擦除功能
  • RFTGYH分别控制RGB三原色的增减,现颜色显示在左上角
#include<bits/stdc++.h>
#include<thread>
using namespace std;
const double Pi=acos(-1);

#include "graphics.h"
#define EMPTY (-1)

inline void End_of_program()
{
    puts("Got to the end.");
    getch();
    cleardevice();
    getch();
    closegraph();
    exit(0);
}

int MAX_X=680;
int MAX_Y=410;

#define pxmap_MAX_X 4007
#define pxmap_MAX_Y 4007
vector< vector<color_t> >pxmap_back(pxmap_MAX_X,vector<color_t>(pxmap_MAX_Y));
vector< vector<color_t> >pxmap_frnt(pxmap_MAX_X,vector<color_t>(pxmap_MAX_Y));

inline void pxmap_init()
{
    for(int i=0;i<pxmap_MAX_X;i++)
    {
        for(int j=0;j<pxmap_MAX_Y;j++)
        {
            pxmap_back[i][j]=0;
            pxmap_frnt[i][j]=EMPTY;
        }
    }
    puts("done : pxmap_init");
}
inline void pxmap_init_random()
{
    for(int i=0;i<pxmap_MAX_X;i++)
    {
        for(int j=0;j<pxmap_MAX_Y;j++)
        {
            pxmap_back[i][j]=(rand()%0xff<<16)+(rand()%0xff<<8)+(rand()%0xff);
            pxmap_frnt[i][j]=EMPTY;
            // printf("%x\n",pxmap_back[i][j]);
        }
    }
    puts("done : pxmap_init_random");
}

int*color_player_1=NULL;
inline void pxmap_show(int x=0,int y=0)
{
    if(x<0)x=0;
    if(y<0)y=0;
    if(x+MAX_X>pxmap_MAX_X)x=pxmap_MAX_X-MAX_X;
    if(y+MAX_Y>pxmap_MAX_Y)y=pxmap_MAX_Y-MAX_Y;

    for(int i=0;i<MAX_X;i++)
    {
        for(int j=i<41?14:0;j<MAX_Y;j++)
        {
            if(pxmap_frnt[x+i][y+j]!=EMPTY)
            {
                if(getpixel(i,j)!=pxmap_frnt[x+i][y+j])
                    putpixel(i,j,pxmap_frnt[x+i][y+j]);
            }
            else
            {
                if(getpixel(i,j)!=pxmap_back[x+i][y+j])
                    putpixel(i,j,pxmap_back[x+i][y+j]);
            }

        }
    }

    for(int i=0;i<41;i++)
        for(int j=0;j<14;j++)
            putpixel(i,j,*color_player_1);
    // puts("done : pxmap_show");
}

int show_x=1000,show_y=1000;
inline void pxshow_map()
{
    delay_fps(30);
    while(is_run())
    {
        pxmap_show(show_x,show_y);
        // xyprintf(10,10,"%3.2f - fps\n",getfps());
    }
}


struct Player
{
    inline void show()
    {
        for(int i=0;i<px;i++)
        {
            pxmap_frnt[this->x+this->shape[i*2]][this->y+this->shape[i*2+1]]=
            0xffffff
            ^pxmap_back[this->x+this->shape[i*2]][this->y+this->shape[i*2+1]]
            &this->color[i];
        }
        // puts("done : player - show");
    }

    inline void show_print()
    {
        for(int i=0;i<px;i++)
        {
            pxmap_back[this->x+this->shape[i*2]][this->y+this->shape[i*2+1]]=
            this->dcolor;
            // this->color[i];
        }
        // puts("done : player - show");
    }

    inline void erase()
    {
        for(int i=0;i<px;i++)
        {
            pxmap_frnt[this->x+this->shape[i*2]][this->y+this->shape[i*2+1]]=EMPTY;
        }
        // puts("done : player - show");
    }

    inline void erase_print()
    {
        for(int i=0;i<px;i++)
        {
            pxmap_back[this->x+this->shape[i*2]][this->y+this->shape[i*2+1]]=0;
        }
        // puts("done : player - show");
    }

    inline void be_square(color_t clr=0x00ffff)
    {
        shape.clear();
        color.clear();
        for(int i=0;i>=-10;i--)
        {
            for(int j=-5;j<=5;j++)
            {
                shape.push_back(j);
                shape.push_back(i);
                color.push_back(clr);
            }
        }
        px=color.size();
    }

    inline void move(int dx,int dy)
    {
        // printf("move %d - %d\n",dx,dy);
        this->erase();
        x+=dx;
        y+=dy;
        this->show();
    }

    int x=show_x+100;
    int y=show_y+100;
    int dcolor=0x00ffff;
    int px;
    vector<int>shape;
    vector<color_t>color;
}player;


inline void player_ctrl()
{
    set<UINT>keydown;
    key_msg m_msg;

    bool print_state=false;
    bool erase_state=false;
    color_player_1=&player.dcolor;

    thread getting_key
    ([&](){
        while(is_run())
        {
            m_msg=getkey();
            switch(m_msg.msg)
            {
                case key_msg_down:
                    keydown.insert(m_msg.key);
                    if(m_msg.key=='E')
                        print_state=!print_state;
                    if(m_msg.key=='Q')
                        erase_state=!erase_state;
                    break;
                case key_msg_up:
                    keydown.erase(m_msg.key);
                    break;
            }
            // printf("%d - %d\n",keydown.size(),m_msg.msg);
        }
    });


    while(is_run())
    {
        if(keydown.size()>0)
        {
            int dx=keystate('D')-keystate('A');
            int dy=keystate('S')-keystate('W');
            player.move(dx,dy);

            show_x+=keystate('L')-keystate('J');
            show_y+=keystate('K')-keystate('I');

            if(keystate('R'))
            {
                player.dcolor=(player.dcolor&0x00ffff)|min(((player.dcolor&0xff0000)+0x010000),0xff0000);
                // printf("%8x\n",player.dcolor);
            }
            if(keystate('T'))
            {
                player.dcolor=(player.dcolor&0xff00ff)|min(((player.dcolor&0x00ff00)+0x000100),0x00ff00);
                // printf("%8x\n",player.dcolor);
            }
            if(keystate('Y'))
            {
                player.dcolor=(player.dcolor&0xffff00)|min(((player.dcolor&0x0000ff)+0x000001),0x0000ff);
                // printf("%8x\n",player.dcolor);
            }
            if(keystate('F'))
            {
                player.dcolor=(player.dcolor&0x00ffff)|max(((player.dcolor&0xff0000)-0x010000),0x010000);
                // printf("%8x\n",player.dcolor);
            }
            if(keystate('G'))
            {
                player.dcolor=(player.dcolor&0xff00ff)|max(((player.dcolor&0x00ff00)-0x000100),0x000100);
                // printf("%8x\n",player.dcolor);
            }
            if(keystate('H'))
            {
                player.dcolor=(player.dcolor&0xffff00)|max(((player.dcolor&0x0000ff)-0x000001),0x000001);
                // printf("%8x\n",player.dcolor);
            }
            if(keystate(VK_SPACE))
                cleardevice();
                // End_of_program();
            if(print_state)
                player.show_print();
            if(erase_state)
                player.erase_print();
        }
        delay_ms(10);
    }
}

int main()
{
    initgraph(MAX_X, MAX_Y, INIT_RENDERMANUAL | INIT_NOFORCEEXIT);

    pxmap_init_random();
    // pxmap_init();

    // thread getfps_thd([&](){while(1){printf("%3.2f - fps\n",getfps());Sleep(750);}});
    thread pxshow_map_thd(pxshow_map);
    thread player_ctrl_thd(player_ctrl);
    player.be_square();
    player.show();
    // for(int i=0;i<pxmap_MAX_X;i++)
    // {
    //     show_x=i;
    //     // printf("%d\n",show_x);
    //     // getch();
    //     delay_ms(10);
    // }

    player_ctrl_thd.join();

    End_of_program();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值