番外——弹幕机

好些东西和功能都没有实现,总体来说是不怎么满意的。

代码如下:

#include<graphics.h>
#include<cstdio>
#include<time.h>
#include<easyx.h>
#include<vector>
#include<stdlib.h>
#include<conio.h>
#define RAND 1            //随机文字
#define CUSTOM 2        //自定义文字
using namespace std;

static COLORREF c[8] = { WHITE,BLACK,BLUE,YELLOW,BROWN,GREEN,RED,LIGHTBLUE };
struct text
{
    int speed;
    int x, y;
    COLORREF color;
    char p[150];
};

vector<text> v;//动态数组

static void creatwindow();
static void settext();
static void showtext();
static void move();

int main()
{
    creatwindow();
    CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)settext,NULL,NULL,NULL);//创建线程     都是while死循环
    while (1)
    {
        showtext();
        move();
        Sleep(500);
        //用定时器SetTimer也可以
    }
    return 0;
}

static void move()
{
    //size_t就是unsigned int 用了typedef
    for (size_t i = 0; i< v.size(); i++)
    {
        v[i].x -= v[i].speed;
    }        
}
static void showtext()
{
    BeginBatchDraw();//批量绘图 easyx里的

    cleardevice();    
    for(size_t i=0;i<v.size();i++)
    {
        settextcolor(v[i].color);
        outtextxy(v[i].x, v[i].y, v[i].p);
    }    

    EndBatchDraw();
}
static void settext()
{    
    text *t;    
    t = new text;
    //new更简洁明了 还可以初始化数据元素这是和malloc不一样的地方 不过我感觉new里面就是个malloc。。。

    while (true)
    {
        printf_s("一大波弹幕正在靠近中:");
        gets_s(t->p);
        /*if (_kbhit()&&_getch() == '#') model=CUSTOM
        else*/
        t->x = GetSystemMetrics(SM_CXSCREEN)-20;
        srand((unsigned int)time(NULL));
        t->speed = rand() % 20 + 1;
        t->color = c[rand() % 8];//t->color = RGB(rand() % 256, rand() % 256, rand() % 256);
        t->y = rand() % (GetSystemMetrics(SM_CYSCREEN) - 30) + 20;
        //    case CUSTOM:   用mfc更容易实现这点 我懒得打了
        //    {
        //        int r=0,xx,yy;
        //        printf_s("弹幕速度:");
        //        
        //        printf_s("弹幕颜色:");
        //        
        //        r%=8;
        //        t->color = c[r];
        //        printf_s("弹幕坐标x,y:");
        //        
        //        t->x = xx;
        //        t->y = yy;
        //    }
        v.push_back(*t);//加载到模板里
    }
}
static void creatwindow()
{
    HWND hwnd;//工具里的spy++可以看句柄
    int x = GetSystemMetrics(SM_CXSCREEN), y = GetSystemMetrics(SM_CYSCREEN);
    //metric米制的  getsystemmetrics用来获取系统窗口长度 SM_CXSCREEN是宽x 是win32的api

    initgraph(x, y,SHOWCONSOLE);
    hwnd = GetHWnd();//获取当前窗口句柄 操控权限-.-!

    SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) - WS_CAPTION);
    //设置窗口风格  hwnd窗口-标题    gwl_style窗口风格

    SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, x, y, SWP_SHOWWINDOW);
    //设置窗口起始点 句柄 窗口z序 左上角坐标 大小 显示窗口且不能改变大小 并真正改变窗口

    LONG wl = GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED;
    SetWindowLong(hwnd, GWL_EXSTYLE, wl);//扩展风格
    SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);
    //把窗口后面的东西沾到窗口上面或者说伪透明  
    //取值为LWA_COLORKEY时,bAlpha参数无效而窗体中的所有颜色为crKey的地方将变为透明。
    //取值为LWA_ALPHA crkey无效 bAlpha是透明度[0,255]
}

猜你喜欢

转载自blog.csdn.net/qq_36323837/article/details/84527494