赞
踩
学习视频【C/C++/EasyX】学编程,做游戏,小白快速入门图形编编程
目录
非easyx函数:
用于获取键盘消息的函数
getch(); 需要头文件conio.h
GetAsyncKeyState(键值); 需要头文件windows.h,由于EasyX包含了Windows头文件,所以无需自己包含
与非ASCII表字符的按键比较,需要使用虚拟键值 上:72 下:80 左:75 右:77
与字母比较直接写字母
getch()函数只支持上下左右移动
如:
- char key = _getch();
-
- switch (key)
- {
- //上键
- case 72: //对应向上箭头
- case 'w':
- case 'W':
- cout << "上" << endl;
- break;
-
- //下键
- case 80: //对应向下箭头
- case 's':
- case 'S':
- cout << "下" << endl;
- break;
-
- //左键
- case 75: //对应向左箭头
- case 'a':
- case 'A':
- cout << "左" << endl;
- break;
-
- //右键
- case 77: //对应向右箭头
- case 'd':
- case 'D':
- cout << "右" << endl;
- break;
- }

- #include<iostream>
- #include<graphics.h>//包含图形库头文件
- #include<easyx.h>//包含图形库头文件
- #include<conio.h>//使用_getch()
- using namespace std;
-
- //绘制按钮 x,y为左上角坐标 w为按钮宽度,h为按钮高度
- void button(int x, int y, int w, int h,const char* text)
- {
- setfillcolor(RGB(0, 162, 232));//圆角矩形填充颜色
- fillroundrect(x, y, x + w, y + h, 10, 10);//绘制圆角矩形
-
- char arr[50];
- strcpy_s(arr, text);//将text中的字符拷贝到arr里
-
- setbkmode(TRANSPARENT);//文字背景透明
- settextstyle(30, 0, "楷体");//文字样式
- outtextxy(x + ((w - textwidth(arr) )/2), y + (h-textheight(arr))/2, arr);//居中绘制文字
- }
-
- //绘制图片
- void image()
- {
- IMAGE img;
- loadimage(&img, "./图片1.png",200,150);
- putimage(0, 0, &img);
- }
-
-
- int main()
- {
- //创建一个窗口,确定窗口大小
- initgraph(640, 480,EW_SHOWCONSOLE);
-
- ExMessage msg;//结构体 用于保存鼠标消息
-
- int x = 0, y = 0;
-
- //控制球移动
- while (1)
- {
- setbkcolor(RGB(225, 127, 39));//设置背景颜色
- cleardevice();//清屏 设置背景颜色后要清屏才能将背景颜色设置好
- button(200, 200, 150, 100, "button");//绘制按钮 用于测试
- image();//绘制图片 用于引出BeginBatchDraw() EndBatchDraw() FlushBatchDraw()三个函数
-
- setfillcolor(BROWN);
- fillcircle(x, y, 50);//绘制圆
-
-
- char key = _getch();
-
- //控制圆移动
- switch (key)
- {
- //上键
- case 72:
- case 'w':
- case 'W':
- cout << "上" << endl;
- y-=5;//如果按上键 y坐标向上移动5 因为向下为正所以是-5
- break;
-
- //下键
- case 80:
- case 's':
- case 'S':
- cout << "下" << endl;
- y+=5;
- break;
-
- //左键
- case 75:
- case 'a':
- case 'A':
- cout << "左" << endl;
- x-=5;
- break;
-
- //右键
- case 77:
- case 'd':
- case 'D':
- cout << "右" << endl;
- x+=5;
- break;
- }
-
-
- //鼠标操作
- if (peekmessage(&msg, EM_MOUSE))
- {
- switch (msg.message)
- {
- //如果左键按下
- case WM_LBUTTONDOWN:
- if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
- {
- cout << "点击了左键" << endl;
- }
- break;
- case WM_RBUTTONDOWN:
- if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
- {
- cout << "点击了右键" << endl;
- }
- break;
- }
- }
-
- }
-
-
- //防止闪退
- getchar();
-
- //关闭窗口
- closegraph();
-
- return 0;
- }

设备在不断进行绘图操作时会出现闪屏现象(图片闪烁)可使用
BeginBatchDraw() // 开始批量绘图。
绘图代码
EndBatchDraw() //用于结束批量绘制,并执行未完成的绘制任务。
以解决这个问题
- //前面的代码就不重复啦直接从while开始
-
- //控制球移动
- while (1)
- {
- //绘制操作前加上BeginBatchDraw();
- BeginBatchDraw();
-
- setbkcolor(RGB(225, 127, 39));//设置背景颜色
- cleardevice();//清屏 设置背景颜色后要清屏才能将背景颜色设置好
- button(200, 200, 150, 100, "button");//绘制按钮 用于测试
- image();//绘制图片 用于引出BeginBatchDraw() EndBatchDraw() FlushBatchDraw()三个函数
-
- setfillcolor(BROWN);
- fillcircle(x, y, 50);//绘制圆
-
- //绘制完成后加上 EndBatchDraw();或者FlushBatchDraw();
- EndBatchDraw();//或者FlushBatchDraw();
-
-
- char key = _getch();
-
- //控制圆移动
- switch (key)
- {
- //上键
- case 72:
- case 'w':
- case 'W':
- cout << "上" << endl;
- y-=5;//如果按上键 y坐标向上移动5 因为向下为正所以是-5
- break;
-
- //下键
- case 80:
- case 's':
- case 'S':
- cout << "下" << endl;
- y+=5;
- break;
-
- //左键
- case 75:
- case 'a':
- case 'A':
- cout << "左" << endl;
- x-=5;
- break;
-
- //右键
- case 77:
- case 'd':
- case 'D':
- cout << "右" << endl;
- x+=5;
- break;
- }
-
- if (peekmessage(&msg, EM_MOUSE))
- {
- switch (msg.message)
- {
- //如果左键按下
- case WM_LBUTTONDOWN:
- if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
- {
- cout << "点击了左键" << endl;
- }
- break;
- case WM_RBUTTONDOWN:
- if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
- {
- cout << "点击了右键" << endl;
- }
- break;
- }
- }
-
- }

getch()为阻塞函数,不输入就一直在getch()处等待(运行上文代码的时候可以发现,鼠标在按钮处点击没有反应)
解决方案
使用kbhit()函数:检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。
- //继续修改while内代码 将switch部分用if(kbhit())包含起来
-
- //控制球移动
- while (1)
- {
- //绘制操作前加上BeginBatchDraw();
- BeginBatchDraw();
-
- setbkcolor(RGB(225, 127, 39));//设置背景颜色
- cleardevice();//清屏 设置背景颜色后要清屏才能将背景颜色设置好
- button(200, 200, 150, 100, "button");//绘制按钮 用于测试
- image();//绘制图片 用于引出BeginBatchDraw() EndBatchDraw() FlushBatchDraw()三个函数
-
- setfillcolor(BROWN);
- fillcircle(x, y, 50);//绘制圆
-
- //绘制完成后加上 EndBatchDraw();或者FlushBatchDraw();
- EndBatchDraw();//或者FlushBatchDraw();
-
- //如果检测到有键盘输入再读入
- if (_kbhit())
- {
- char key = _getch();
-
- //控制圆移动
- switch (key)
- {
- //上键
- case 72:
- case 'w':
- case 'W':
- cout << "上" << endl;
- y -= 5;//如果按上键 y坐标向上移动5 因为向下为正所以是-5
- break;
-
- //下键
- case 80:
- case 's':
- case 'S':
- cout << "下" << endl;
- y += 5;
- break;
-
- //左键
- case 75:
- case 'a':
- case 'A':
- cout << "左" << endl;
- x -= 5;
- break;
-
- //右键
- case 77:
- case 'd':
- case 'D':
- cout << "右" << endl;
- x += 5;
- break;
- }
- }

需要传入一个键值,如果按下返回真 上:VK_UP 下:VK_DOWN 左:VK_LEFT 右:VK_RIGHT
GetAsyncKeyState()函数支持斜向移动
- #include<iostream>
- #include<graphics.h>//包含图形库头文件
- #include<easyx.h>//包含图形库头文件
- #include<conio.h>//使用_getch()
- using namespace std;
-
- //绘制按钮 x,y为左上角坐标 w为按钮宽度,h为按钮高度
- void button(int x, int y, int w, int h,const char* text)
- {
- setfillcolor(RGB(0, 162, 232));//圆角矩形填充颜色
- fillroundrect(x, y, x + w, y + h, 10, 10);//绘制圆角矩形
-
- char arr[50];
- strcpy_s(arr, text);//将text中的字符拷贝到arr里
-
- setbkmode(TRANSPARENT);//文字背景透明
- settextstyle(30, 0, "楷体");//文字样式
- outtextxy(x + ((w - textwidth(arr) )/2), y + (h-textheight(arr))/2, arr);//居中绘制文字
- }
-
- //绘制图片
- void image()
- {
- IMAGE img;
- loadimage(&img, "./图片1.png",200,150);
- putimage(0, 0, &img);
- }
-
-
- int main()
- {
- //创建一个窗口,确定窗口大小
- initgraph(640, 480,EW_SHOWCONSOLE);
-
-
- ExMessage msg;//结构体 用于保存鼠标消息
-
- int x = 0, y = 0;
-
- //控制球移动
- while (1)
- {
- //绘制操作前加上BeginBatchDraw();
- BeginBatchDraw();
-
- setbkcolor(RGB(225, 127, 39));//设置背景颜色
- cleardevice();//清屏 设置背景颜色后要清屏才能将背景颜色设置好
- button(200, 200, 150, 100, "button");//绘制按钮 用于测试
- image();//绘制图片 用于引出BeginBatchDraw() EndBatchDraw() FlushBatchDraw()三个函数
-
- setfillcolor(BROWN);
- fillcircle(x, y, 50);//绘制圆
-
- //绘制完成后加上 EndBatchDraw();或者FlushBatchDraw();
- EndBatchDraw();//或者FlushBatchDraw();
-
-
- //上键
- if (GetAsyncKeyState(VK_UP))
- {
- cout << "上" << endl;
- y -= 1;//如果按上键 y坐标向上移动5 因为向下为正所以是-5
- }
- //下键
- if (GetAsyncKeyState(VK_DOWN))
- {
- cout << "下" << endl;
- y += 1;
- }
- //左键
- if (GetAsyncKeyState(VK_LEFT))
- {
- cout << "左" << endl;
- x -= 1;
- }
- //右键
- if (GetAsyncKeyState(VK_RIGHT))
- {
- cout << "右" << endl;
- x += 1;
- }
- if (peekmessage(&msg, EM_MOUSE))
- {
- switch (msg.message)
- {
- //如果左键按下
- case WM_LBUTTONDOWN:
- if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
- {
- cout << "点击了左键" << endl;
- }
- break;
- case WM_RBUTTONDOWN:
- if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
- {
- cout << "点击了右键" << endl;
- }
- break;
- }
- }
-
- }
-
-
- //防止闪退
- getchar();
-
- //关闭窗口
- closegraph();
-
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。