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 70
fillrectangle(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 70
fillrectangle(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×640
menu();
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窗口的游戏了