easyX实践上手操作小项目
- 效果展示
- 主菜单的装饰
- 玩法介绍界面
- 开始游戏界面
- 制作团队界面
- 排行榜界面
- 注:main()函数
- 拓展数据库
- 小结
这里我们学习过easyX的基础知识后,看看是否能实践操作一下,制作一个属于自己的游戏界面呢?
基础知识入口:
链接: 基础知识哦
效果展示
点击选项也可以进入其对应的界面
注意:这里只是实现了点击切换界面以及一点装饰的功能
主菜单的装饰
这是总的函数
其中png图片我是放在了该项目文件夹里
// 主菜单界面渲染
void menu()
{//设置背景颜色,清屏setbkcolor(WHITE);cleardevice();//加载背景图片IMAGE img_bk,img_kunkun,img_kun1;loadimage(&img_bk, "./kun_bk.png", 800, 640);putimage(0, 0, &img_bk);loadimage(&img_kunkun, "./kunkun.png", 200, 300);putimage(100, 100,&img_kunkun);loadimage(&img_kun1, "./kun1.png", 250, 500);putimage(300, 120, &img_kun1);// 绘制开始界面,菜单setfillcolor(LIGHTGRAY);setlinecolor(BLACK);setbkmode(TRANSPARENT);fillrectangle(500, 110, 720, 180); // 220 70fillrectangle(500, 210, 720, 280);fillrectangle(500, 310, 720, 380);fillrectangle(500, 410, 720, 480);fillrectangle(500, 510, 720, 580);char arr1[] = "开始游戏";char arr2[] = "玩法介绍";char arr3[] = "排行榜";char arr4[] = "制作团队";char arr5[] = "退出游戏";// 文字居中int width = 220 / 2 - textwidth(arr1) / 2;int heigh = 70 / 2 - textheight(arr1) / 2;//打印文字settextcolor(BLACK);outtextxy(width + 500, heigh + 110, arr1);outtextxy(width + 500, heigh + 210, arr2);outtextxy(width + 500, heigh + 310, arr3);outtextxy(width + 500, heigh + 410, arr4);outtextxy(width + 500, heigh + 510, arr5);//音乐开关的按钮setfillcolor(LIGHTRED);fillcircle(80, 70, 30);settextcolor(YELLOW);settextstyle(20, 0, "楷体");outtextxy(55, 65, "音乐");//鼠标键位操作while (1){if (MouseHit()){MOUSEMSG msg = GetMouseMsg();// 左键点击播放音乐 右键停止播放if (msg.x > 65 && msg.x < 95 && msg.y> 55 && msg.y < 85){switch (msg.uMsg){case WM_LBUTTONDOWN://左键mciSendString("open giegie.mp3 alias BGM", 0, 0, 0);mciSendString("play BGM repeat", 0, 0, 0);break;case WM_RBUTTONDOWN://右键mciSendString("pause BGM", 0, 0, 0);break;}}// 制作团队界面if (msg.x > 500 && msg.x < 720 && msg.y> 410 && msg.y < 480){switch (msg.uMsg){case WM_LBUTTONDOWN://左键make_team();break;}}// 开始游戏界面if (msg.x > 500 && msg.x < 720 && msg.y> 110 && msg.y < 180){switch (msg.uMsg){case WM_LBUTTONDOWN://左键game_begin();break;}}// 玩法介绍界面if (msg.x > 500 && msg.x < 720 && msg.y> 210 && msg.y < 280){switch (msg.uMsg){case WM_LBUTTONDOWN://左键game_introduce();break;}}// 排行榜界面if (msg.x > 500 && msg.x < 720 && msg.y> 310 && msg.y < 380){switch (msg.uMsg){case WM_LBUTTONDOWN://左键ranking();break;}}// 退出游戏if (msg.x > 500 && msg.x < 720 && msg.y> 510 && msg.y < 580){switch (msg.uMsg){case WM_LBUTTONDOWN://左键closegraph();exit(0);}}}}getchar();closegraph;
}
玩法介绍界面
void game_introduce()
{// 设置背景颜色为白色,清屏setbkcolor(WHITE);cleardevice();// 返回 框的创建setfillcolor(LIGHTGRAY);setlinecolor(BLACK);setbkmode(TRANSPARENT);fillrectangle(500, 510, 720, 580);char arr3[] = "返回";// 文字居中int width = 220 / 2 - textwidth(arr3) / 2;int heigh = 70 / 2 - textheight(arr3) / 2;// 打印文字settextcolor(BLACK);outtextxy(width + 500, heigh + 510, arr3);// 返回 框的点击操作while (1){if (MouseHit()){MOUSEMSG msg = GetMouseMsg();if (msg.x > 500 && msg.x < 720 && msg.y> 510 && msg.y < 580){switch (msg.uMsg){case WM_LBUTTONDOWN://左键menu();break;}}}}
}
开始游戏界面
void game_begin()
{// 设置背景颜色为白色,清屏setbkcolor(WHITE);cleardevice();// 三个 框的创建setfillcolor(LIGHTGRAY);setlinecolor(BLACK);setbkmode(TRANSPARENT);fillrectangle(500, 110, 720, 180); // 220 70fillrectangle(500, 210, 720, 280);fillrectangle(500, 510, 720, 580);char arr1[] = "新的游戏";char arr2[] = "读取文档";char arr3[] = "返回";// 文字居中int width = 220 / 2 - textwidth(arr3) / 2;int heigh = 70 / 2 - textheight(arr3) / 2;// 打印文字settextcolor(BLACK);outtextxy(width + 500, heigh + 110, arr1);outtextxy(width + 500, heigh + 210, arr2);outtextxy(width + 500, heigh + 510, arr3);// 返回 框的点击操作while (1){if (MouseHit()){MOUSEMSG msg = GetMouseMsg();//返回 操作if (msg.x > 500 && msg.x < 720 && msg.y> 510 && msg.y < 580){switch (msg.uMsg){case WM_LBUTTONDOWN://左键menu();break;}}// 新的游戏界面if (msg.x > 500 && msg.x < 720 && msg.y> 110 && msg.y < 180){switch (msg.uMsg){case WM_LBUTTONDOWN://左键role_select();break;}}}}
}
制作团队界面
void make_team()
{// 设置背景颜色为白色,清屏setbkcolor(WHITE);cleardevice();// kunkun图片加载IMAGE img_kunkun2;loadimage(&img_kunkun2, "./kunkun2.png", 200, 200);putimage(50, 70, &img_kunkun2);// 返回 框的创建setfillcolor(LIGHTGRAY);setlinecolor(BLACK);setbkmode(TRANSPARENT);fillrectangle(500, 510, 720, 580);char arr[] = "返回";// 文字居中int width = 220 / 2 - textwidth(arr) / 2;int heigh = 70 / 2 - textheight(arr) / 2;// 打印文字settextcolor(BLACK);outtextxy(width + 500, heigh + 510, arr);// 返回 框的点击操作while (1){if (MouseHit()){MOUSEMSG msg = GetMouseMsg();if (msg.x > 500 && msg.x < 720 && msg.y> 510 && msg.y < 580){switch (msg.uMsg){case WM_LBUTTONDOWN://左键menu();break;}}}}}
排行榜界面
void ranking()
{// 设置背景颜色为白色,清屏setbkcolor(WHITE);cleardevice();// 返回 框的创建setfillcolor(LIGHTGRAY);setlinecolor(BLACK);setbkmode(TRANSPARENT);fillrectangle(500, 510, 720, 580);char arr3[] = "返回";// 文字居中int width = 220 / 2 - textwidth(arr3) / 2;int heigh = 70 / 2 - textheight(arr3) / 2;// 打印文字settextcolor(BLACK);outtextxy(width + 500, heigh + 510, arr3);// 返回 框的点击操作while (1){if (MouseHit()){MOUSEMSG msg = GetMouseMsg();if (msg.x > 500 && msg.x < 720 && msg.y> 510 && msg.y < 580){switch (msg.uMsg){case WM_LBUTTONDOWN://左键menu();break;}}}}
}
注:main()函数
int main()
{initgraph(800, 640);//创建一个窗口800×640menu();closegraph();return 0;
}
注:
若你的窗口每次点击就会发生窗口闪动,就是因为每个函数之内都有一个创建窗口操作
在整个程序中,只能有一个创建窗口的操作
拓展数据库
举例:展示排行榜信息 第一关
void rank_mysql()
{setbkcolor(BROWN);cleardevice();setbkmode(TRANSPARENT);settextcolor(BLACK);settextstyle(25, 0, "宋体");MYSQL mysql;//一个数据库结构体MYSQL_RES* res;//一个结果集结构体MYSQL_ROW row;//char** 二维数组,存放一条记录//初始化数据库mysql_init(&mysql);mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");;//设置编码方式//连接数据库//判断 如果连接失败就输出连接失败if (mysql_real_connect(&mysql, "localhost", "root", "xie123123", "c_mysql", 3306, NULL, 0)){ //伍什凯电脑ip 数据库名 密码 printf("连接成功\n");}else{printf("连接失败:%s\n", mysql_error(&mysql));}//步数排行榜//执行sql语句 查询整张表的信息//以下,username,step,rank是我建立的steps_rank1表单的列if (mysql_query(&mysql, "SELECT username,step, @rank:=@rank+1 `rank` from steps_rank1 s,(select @rank:=0) q ORDER BY step ;")) {printf("%s\n", mysql_error(&mysql));//return -1;}//得到结果集res = mysql_use_result(&mysql);//一行一行的将数据读出来while ((row = mysql_fetch_row(res)) != NULL) {int count = res->field_count;//得到一行中,有多少列int rows = mysql_num_rows(res);for (int i = 0; i < count; i++) {outtextxy(100 + i * 150, 130 + rows * 30, row[i]);}outtextxy(0, 130 + rows * 30, "");}//打印到easyX创建的窗口上outtextxy(100, 110, "用户名");outtextxy(240, 110, "步数");outtextxy(380, 110, "排行");int q = mysql_num_rows(res) + 1;rectangle(95, 105, 435, 130 + q * 30);//释放结果集mysql_free_result(res);//关闭数据库mysql_close(&mysql);//停留等待system("pause");
}
小结
通过这些练习,我们可以感觉到:
- easyX渲染的代码重复率较高
我们可以创建一个函数,每次都去调用这个函数,省去好多重复的操作 - 几乎所以都是以基础知识为支撑,看着知识讲解就可以
之后,自己就可以尝试着做一款基础easyX窗口的游戏了