学习视频【C/C++/EasyX】学编程,做游戏,小白快速入门图形编编程
目录
getch();需要使用返回值来判断
控制圆形移动:
代码问题1:
代码问题2:
GetAsyncKeyState(键值);
非easyx函数:
用于获取键盘消息的函数
getch(); 需要头文件conio.h
GetAsyncKeyState(键值); 需要头文件windows.h,由于EasyX包含了Windows头文件,所以无需自己包含
getch();需要使用返回值来判断
与非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;
}
代码问题1:
设备在不断进行绘图操作时会出现闪屏现象(图片闪烁)可使用
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;
}
}
}
代码问题2:
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;
}
}
GetAsyncKeyState(键值);
需要传入一个键值,如果按下返回真 上:VK_UP 下:VK_DOWN 左:VK_LEFT 右:VK_RIGHT文章来源:https://www.toymoban.com/news/detail-773955.html
GetAsyncKeyState()函数支持斜向移动文章来源地址https://www.toymoban.com/news/detail-773955.html
#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;
}
到了这里,关于easyx学习笔记(五):键盘消息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!