生日到了,用easyx纪念一下,聊表心意
(easyx是一个绘图库,极其简单的语句,可很方便的进行交互)
下面是实现过程:(新手,轻喷)
1.准备工作
使用了clion来写,因此就导致了以后一些意想不到的bug,首先easyx的在clion安装就是一个不小的问题,具体操作方法可参考 clion安装easyx操作 ,以及easyx入门指南。
2.实际操作
想到了一个很合理的流程,并进行了一些合理的操作。开启时使用随机速度的进度条,达到一个加载中的效果,随后主菜单分为三个板块,并埋下彩蛋。具体代码如下:
#include "graphics.h"
#include <conio.h>
#include "string"
#include <cstdlib>
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
using namespace std;
int begin();
int error();
void menu();
int cake();
int music();
void say();
void start();
void end();
int main()
{
int bir;
bir = begin();
initgraph(1000, 650, SHOWCONSOLE);
while(1)
{
if (bir == 1)
{
break;
}
else
bir = error();
}
flushmessage(-1);
menu();
return 0;
}
int begin() //进度条
{
char a[24]="[ ]";
initgraph(1000, 650, SHOWCONSOLE);
settextstyle(70,50,nullptr);
srand((unsigned int)time(nullptr));
int num;
for (int i=1;i<21;i++){
a[i] = '-';
a[i+1] = '>';
outtextxy(250,550,a);
if (i<=10){
num = rand() % 5;
Sleep(num*100);
}
else
Sleep(100);
}
outtextxy(250,550,"[----------------------]");
Sleep(250);
clearcliprgn();
outtextxy(250,550,"Press To Start");
MOUSEMSG msg;
while (1)
{
if (MouseHit())
{
msg = GetMouseMsg();
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
{
flushmessage(-1);
return 1;
}
case WM_RBUTTONDOWN:
{
flushmessage(-1);
return 2;
}
default:
continue;
}
}
}
}
int error()
{
initgraph(1000, 650, SHOWCONSOLE);
settextstyle(50,50,nullptr);
int i,j;
for (i = 1,j = 0;j<25;i=i+10,j++) //仿星战字幕
{
settextstyle(60-j,0,nullptr);
outtextxy(150+i,550-i,"You Need Left Touch!");
settextstyle(60-j+1,0,nullptr);
outtextxy(150+i,550-i-60,"Tap To Again!!");
settextstyle(60-j+1,0,nullptr);
outtextxy(150+i,550-i-120,"Please wait me stop!!!");
Sleep(100);
clearcliprgn();
}
outtextxy(150,400,"Tap To Again!!!");
Sleep(1000);
MOUSEMSG msg;
while(1)
{
msg = GetMouseMsg();//获取鼠标信息
if (msg.uMsg == WM_LBUTTONDOWN || msg.uMsg == WM_RBUTTONDOWN) {
return begin();
}
}
}
void menu() //主菜单
{
initgraph(1000, 650, SHOWCONSOLE);
settextstyle(50, 50, nullptr);
outtextxy(50, 170, "Happy Birthday,My Friend!");
circle(150, 450, 150);
circle(500, 450, 150);
circle(850, 450, 150);
setfillcolor(RED);//设置填充颜色
fillroundrect(0,0,1000,60,10,10);
setbkmode(TRANSPARENT);
settextstyle(30, 0, nullptr);
outtextxy(600, 13, "Touch D To Exit!(Anywhere)");
settextstyle(45, 0, nullptr);
outtextxy(100, 430, "A.A Song");
outtextxy(450, 430, "B.A Cake");
outtextxy(800, 430, "C.A Say");
flushmessage(-1);
char i;
while(1)
{
i = getch();
if (i == 'A' || i == 'a') {
music();
break;
}
else if (i == 'B' || i == 'b') {
cake();
break;
}
else if (i == 'C' || i == 'c') {
say();
break;
}
else if (i == 'D' || i == 'd') {
end();
break;
}
else continue;
}
}
int cake() //图片展现
{
IMAGE img1;
loadimage(&img1,R"(../cake1.png)",1000,650);
putimage(0, 0, &img1);
char ch;
ch = getch();
while(1)
{
if (ch == 'd'||ch == 'D')
menu();
else exit(1);
}
}
int music() //音乐展现
{
initgraph(1000, 650, SHOWCONSOLE);
settextstyle(50, 50, nullptr);
start();
char ch;
ch = getch();
mciSendString("close BGM ",0,0,0);
while(1)
{
if (ch == 'd'||ch == 'D')
menu();
else exit(2);
}
}
void say() //弹出对话框
{
HWND hnd = GetHWnd();
settextstyle(50, 50, nullptr);
outtextxy(50, 170, "say");
int is_ok = MessageBox(hnd, "凡是过去,皆为序章\n愿未来安好,乘骐骥以驰骋", "Hey bro!(Chinese)", MB_OKCANCEL);
if (is_ok == IDOK) {
menu();
}
else if (is_ok == IDCANCEL) {
exit(3);
}
}
void start()
{
outtextxy(50, 170, "A SONG!");
mciSendString("open ../RS020643ANK71H36gh.mp3 alias BGM",0,0,0);
mciSendString("play BGM repeat",0,0,0);
Sleep(1000);
}
void end() //结束,退出
{
initgraph(1000, 650, SHOWCONSOLE);
settextstyle(70,50,nullptr);
outtextxy(70, 170, "Good Bye,My Friend!!!");
outtextxy(70, 230, "Press enter to exit");
getch();
closegraph();
exit(0);
}
3.具体遇到的问题与bug
一定要链接库,一定要链接库,一定要链接库(在此处音乐播放部分卡了很久)
在clion中具体操作是在cmakelists.txt中插入:link_libraries(winmm.dll) ,如果不写的话会报错在音乐部分。
其余部分跟着教程来,基本不会遇到重大问题,最后成功运行。