当前位置:   article > 正文

easyx学习笔记(五):键盘消息_easyx获取键盘输入

easyx获取键盘输入

 学习视频【C/C++/EasyX】学编程,做游戏,小白快速入门图形编编程

目录

getch();需要使用返回值来判断

        控制圆形移动:

        代码问题1:

        代码问题2:

GetAsyncKeyState(键值);


easyx函数:

 用于获取键盘消息的函数

 getch();                                需要头文件conio.h

GetAsyncKeyState(键值);  需要头文件windows.h,由于EasyX包含了Windows头文件,所以无需自己包含

getch();需要使用返回值来判断

        与非ASCII表字符的按键比较,需要使用虚拟键值        上:72        下:80        左:75        右:77

        与字母比较直接写字母

        getch()函数只支持上下左右移动

        如:

  1. char key = _getch();
  2. switch (key)
  3. {
  4. //上键
  5. case 72: //对应向上箭头
  6. case 'w':
  7. case 'W':
  8. cout << "上" << endl;
  9. break;
  10. //下键
  11. case 80: //对应向下箭头
  12. case 's':
  13. case 'S':
  14. cout << "下" << endl;
  15. break;
  16. //左键
  17. case 75: //对应向左箭头
  18. case 'a':
  19. case 'A':
  20. cout << "左" << endl;
  21. break;
  22. //右键
  23. case 77: //对应向右箭头
  24. case 'd':
  25. case 'D':
  26. cout << "右" << endl;
  27. break;
  28. }

        控制圆形移动:

  1. #include<iostream>
  2. #include<graphics.h>//包含图形库头文件
  3. #include<easyx.h>//包含图形库头文件
  4. #include<conio.h>//使用_getch()
  5. using namespace std;
  6. //绘制按钮 x,y为左上角坐标 w为按钮宽度,h为按钮高度
  7. void button(int x, int y, int w, int h,const char* text)
  8. {
  9. setfillcolor(RGB(0, 162, 232));//圆角矩形填充颜色
  10. fillroundrect(x, y, x + w, y + h, 10, 10);//绘制圆角矩形
  11. char arr[50];
  12. strcpy_s(arr, text);//将text中的字符拷贝到arr里
  13. setbkmode(TRANSPARENT);//文字背景透明
  14. settextstyle(30, 0, "楷体");//文字样式
  15. outtextxy(x + ((w - textwidth(arr) )/2), y + (h-textheight(arr))/2, arr);//居中绘制文字
  16. }
  17. //绘制图片
  18. void image()
  19. {
  20. IMAGE img;
  21. loadimage(&img, "./图片1.png",200,150);
  22. putimage(0, 0, &img);
  23. }
  24. int main()
  25. {
  26. //创建一个窗口,确定窗口大小
  27. initgraph(640, 480,EW_SHOWCONSOLE);
  28. ExMessage msg;//结构体 用于保存鼠标消息
  29. int x = 0, y = 0;
  30. //控制球移动
  31. while (1)
  32. {
  33. setbkcolor(RGB(225, 127, 39));//设置背景颜色
  34. cleardevice();//清屏 设置背景颜色后要清屏才能将背景颜色设置好
  35. button(200, 200, 150, 100, "button");//绘制按钮 用于测试
  36. image();//绘制图片 用于引出BeginBatchDraw() EndBatchDraw() FlushBatchDraw()三个函数
  37. setfillcolor(BROWN);
  38. fillcircle(x, y, 50);//绘制圆
  39. char key = _getch();
  40. //控制圆移动
  41. switch (key)
  42. {
  43. //上键
  44. case 72:
  45. case 'w':
  46. case 'W':
  47. cout << "上" << endl;
  48. y-=5;//如果按上键 y坐标向上移动5 因为向下为正所以是-5
  49. break;
  50. //下键
  51. case 80:
  52. case 's':
  53. case 'S':
  54. cout << "下" << endl;
  55. y+=5;
  56. break;
  57. //左键
  58. case 75:
  59. case 'a':
  60. case 'A':
  61. cout << "左" << endl;
  62. x-=5;
  63. break;
  64. //右键
  65. case 77:
  66. case 'd':
  67. case 'D':
  68. cout << "右" << endl;
  69. x+=5;
  70. break;
  71. }
  72. //鼠标操作
  73. if (peekmessage(&msg, EM_MOUSE))
  74. {
  75. switch (msg.message)
  76. {
  77. //如果左键按下
  78. case WM_LBUTTONDOWN:
  79. if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
  80. {
  81. cout << "点击了左键" << endl;
  82. }
  83. break;
  84. case WM_RBUTTONDOWN:
  85. if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
  86. {
  87. cout << "点击了右键" << endl;
  88. }
  89. break;
  90. }
  91. }
  92. }
  93. //防止闪退
  94. getchar();
  95. //关闭窗口
  96. closegraph();
  97. return 0;
  98. }

       

        代码问题1:

        设备在不断进行绘图操作时会出现闪屏现象(图片闪烁)可使用

                                BeginBatchDraw()        // 开始批量绘图。

                                        绘图代码

                                EndBatchDraw()        //用于结束批量绘制,并执行未完成的绘制任务。

        以解决这个问题

  1. //前面的代码就不重复啦直接从while开始
  2. //控制球移动
  3. while (1)
  4. {
  5. //绘制操作前加上BeginBatchDraw();
  6. BeginBatchDraw();
  7. setbkcolor(RGB(225, 127, 39));//设置背景颜色
  8. cleardevice();//清屏 设置背景颜色后要清屏才能将背景颜色设置好
  9. button(200, 200, 150, 100, "button");//绘制按钮 用于测试
  10. image();//绘制图片 用于引出BeginBatchDraw() EndBatchDraw() FlushBatchDraw()三个函数
  11. setfillcolor(BROWN);
  12. fillcircle(x, y, 50);//绘制圆
  13. //绘制完成后加上 EndBatchDraw();或者FlushBatchDraw();
  14. EndBatchDraw();//或者FlushBatchDraw();
  15. char key = _getch();
  16. //控制圆移动
  17. switch (key)
  18. {
  19. //上键
  20. case 72:
  21. case 'w':
  22. case 'W':
  23. cout << "上" << endl;
  24. y-=5;//如果按上键 y坐标向上移动5 因为向下为正所以是-5
  25. break;
  26. //下键
  27. case 80:
  28. case 's':
  29. case 'S':
  30. cout << "下" << endl;
  31. y+=5;
  32. break;
  33. //左键
  34. case 75:
  35. case 'a':
  36. case 'A':
  37. cout << "左" << endl;
  38. x-=5;
  39. break;
  40. //右键
  41. case 77:
  42. case 'd':
  43. case 'D':
  44. cout << "右" << endl;
  45. x+=5;
  46. break;
  47. }
  48. if (peekmessage(&msg, EM_MOUSE))
  49. {
  50. switch (msg.message)
  51. {
  52. //如果左键按下
  53. case WM_LBUTTONDOWN:
  54. if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
  55. {
  56. cout << "点击了左键" << endl;
  57. }
  58. break;
  59. case WM_RBUTTONDOWN:
  60. if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
  61. {
  62. cout << "点击了右键" << endl;
  63. }
  64. break;
  65. }
  66. }
  67. }

        代码问题2:

        getch()为阻塞函数,不输入就一直在getch()处等待(运行上文代码的时候可以发现,鼠标在按钮处点击没有反应)

        解决方案

        使用kbhit()函数:检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。

  1. //继续修改while内代码 将switch部分用if(kbhit())包含起来
  2. //控制球移动
  3. while (1)
  4. {
  5. //绘制操作前加上BeginBatchDraw();
  6. BeginBatchDraw();
  7. setbkcolor(RGB(225, 127, 39));//设置背景颜色
  8. cleardevice();//清屏 设置背景颜色后要清屏才能将背景颜色设置好
  9. button(200, 200, 150, 100, "button");//绘制按钮 用于测试
  10. image();//绘制图片 用于引出BeginBatchDraw() EndBatchDraw() FlushBatchDraw()三个函数
  11. setfillcolor(BROWN);
  12. fillcircle(x, y, 50);//绘制圆
  13. //绘制完成后加上 EndBatchDraw();或者FlushBatchDraw();
  14. EndBatchDraw();//或者FlushBatchDraw();
  15. //如果检测到有键盘输入再读入
  16. if (_kbhit())
  17. {
  18. char key = _getch();
  19. //控制圆移动
  20. switch (key)
  21. {
  22. //上键
  23. case 72:
  24. case 'w':
  25. case 'W':
  26. cout << "上" << endl;
  27. y -= 5;//如果按上键 y坐标向上移动5 因为向下为正所以是-5
  28. break;
  29. //下键
  30. case 80:
  31. case 's':
  32. case 'S':
  33. cout << "下" << endl;
  34. y += 5;
  35. break;
  36. //左键
  37. case 75:
  38. case 'a':
  39. case 'A':
  40. cout << "左" << endl;
  41. x -= 5;
  42. break;
  43. //右键
  44. case 77:
  45. case 'd':
  46. case 'D':
  47. cout << "右" << endl;
  48. x += 5;
  49. break;
  50. }
  51. }

GetAsyncKeyState(键值);

需要传入一个键值,如果按下返回真                上:VK_UP        下:VK_DOWN        左:VK_LEFT        右:VK_RIGHT

GetAsyncKeyState()函数支持斜向移动

  1. #include<iostream>
  2. #include<graphics.h>//包含图形库头文件
  3. #include<easyx.h>//包含图形库头文件
  4. #include<conio.h>//使用_getch()
  5. using namespace std;
  6. //绘制按钮 x,y为左上角坐标 w为按钮宽度,h为按钮高度
  7. void button(int x, int y, int w, int h,const char* text)
  8. {
  9. setfillcolor(RGB(0, 162, 232));//圆角矩形填充颜色
  10. fillroundrect(x, y, x + w, y + h, 10, 10);//绘制圆角矩形
  11. char arr[50];
  12. strcpy_s(arr, text);//将text中的字符拷贝到arr里
  13. setbkmode(TRANSPARENT);//文字背景透明
  14. settextstyle(30, 0, "楷体");//文字样式
  15. outtextxy(x + ((w - textwidth(arr) )/2), y + (h-textheight(arr))/2, arr);//居中绘制文字
  16. }
  17. //绘制图片
  18. void image()
  19. {
  20. IMAGE img;
  21. loadimage(&img, "./图片1.png",200,150);
  22. putimage(0, 0, &img);
  23. }
  24. int main()
  25. {
  26. //创建一个窗口,确定窗口大小
  27. initgraph(640, 480,EW_SHOWCONSOLE);
  28. ExMessage msg;//结构体 用于保存鼠标消息
  29. int x = 0, y = 0;
  30. //控制球移动
  31. while (1)
  32. {
  33. //绘制操作前加上BeginBatchDraw();
  34. BeginBatchDraw();
  35. setbkcolor(RGB(225, 127, 39));//设置背景颜色
  36. cleardevice();//清屏 设置背景颜色后要清屏才能将背景颜色设置好
  37. button(200, 200, 150, 100, "button");//绘制按钮 用于测试
  38. image();//绘制图片 用于引出BeginBatchDraw() EndBatchDraw() FlushBatchDraw()三个函数
  39. setfillcolor(BROWN);
  40. fillcircle(x, y, 50);//绘制圆
  41. //绘制完成后加上 EndBatchDraw();或者FlushBatchDraw();
  42. EndBatchDraw();//或者FlushBatchDraw();
  43. //上键
  44. if (GetAsyncKeyState(VK_UP))
  45. {
  46. cout << "上" << endl;
  47. y -= 1;//如果按上键 y坐标向上移动5 因为向下为正所以是-5
  48. }
  49. //下键
  50. if (GetAsyncKeyState(VK_DOWN))
  51. {
  52. cout << "下" << endl;
  53. y += 1;
  54. }
  55. //左键
  56. if (GetAsyncKeyState(VK_LEFT))
  57. {
  58. cout << "左" << endl;
  59. x -= 1;
  60. }
  61. //右键
  62. if (GetAsyncKeyState(VK_RIGHT))
  63. {
  64. cout << "右" << endl;
  65. x += 1;
  66. }
  67. if (peekmessage(&msg, EM_MOUSE))
  68. {
  69. switch (msg.message)
  70. {
  71. //如果左键按下
  72. case WM_LBUTTONDOWN:
  73. if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
  74. {
  75. cout << "点击了左键" << endl;
  76. }
  77. break;
  78. case WM_RBUTTONDOWN:
  79. if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
  80. {
  81. cout << "点击了右键" << endl;
  82. }
  83. break;
  84. }
  85. }
  86. }
  87. //防止闪退
  88. getchar();
  89. //关闭窗口
  90. closegraph();
  91. return 0;
  92. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/94112
推荐阅读
相关标签
  

闽ICP备14008679号