当前位置:首页 > 趣味小程序 > 正文内容

C++使用键盘控制物体移动

亿万年的星光5年前 (2021-01-28)趣味小程序3108
0.前言

在前面几篇文章中,学习了键盘事件和光标移动,在这篇文章中,我们要使用键盘的上下左右键控制在控制台中出现的角色

1.原理

因为我们要通过移动键盘控制光标位置,那么在此之前需要提前获取到光标位置,然后再捕获键盘事件,根据按键给gotoxy函数参数,让光标移动到参数位置,然后刷新控制台,就可以实现“移动”的效果。

2.获取光标当前位置函数

通过下面这个函数可以获取到当前光标。

void getXY() 
{ 
    HANDLE hStdout;
    CONSOLE_SCREEN_BUFFER_INFO pBuffer; 
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
    GetConsoleScreenBufferInfo(hStdout, &pBuffer); 
    cout << pBuffer.dwCursorPosition.X << pBuffer.dwCursorPosition.Y <<endl; 
}

注意:这个函数不是必须用,只是为了保险起见,在移动之前可以先获取一下光标的位置。而且,经过实际测试发现一个小问题,比如我当前gotoxy(5,5),然后我打印一个字符‘a’,再获取光标位置,这个时候光标的位置肯定是变化了,不再是5,5了。

3.通过键盘控制图形移动

我们上一篇说过,gotoxy和二维数组类似,但是实际上有区别。



实际操作中发现了一些问题,

上是 (x,y-d)

下是 (x,y+d)

左是 (x-d,y)

右是 (x+d,y)

也就是符合下面这个规律:



最终发现getXY不是很好用,于是就用了自增自减的方法,而且把按键改成WASD了。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<conio.h>
#include<windows.h>
int X,Y; //光标位置
//移动函数
void gotoxy(int x, int y) {
   COORD pos = {x,y};
   HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
   SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
}
//获取当前光标坐标
//void  getXY()   //弃用,不好用
//{
//    HANDLE hStdout;
//    CONSOLE_SCREEN_BUFFER_INFO pBuffer;
//    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
//    GetConsoleScreenBufferInfo(hStdout, &pBuffer);
//    X=pBuffer.dwCursorPosition.X;
//    Y=pBuffer.dwCursorPosition.Y;
//}
using namespace std;
int main()
{
   system("cls");
   gotoxy(10,10);
   X=10;
   Y=10;
   printf("★");
     int ch;
   while (1){
       if (_kbhit()){//如果有按键按下,则_kbhit()函数返回真
           ch = _getch();//使用_getch()函数获取按下的键值
           if (ch == 119){ //上键 38  
                 system("cls");
                gotoxy(X,Y-1);
                printf("★");
                Y-=1;    
           };
           if (ch == 115){ //下键  40
            system("cls");
            gotoxy(X,Y+1);
            printf("★");
            Y+=1;
           };
           if (ch == 97){ //左  37
            system("cls");
            gotoxy(X-1,Y);
            printf("★");
            X-=1;
           };
           if (ch == 100){   //39
            system("cls");
            gotoxy(X+1,Y);
            printf("★");
            X+=1;
           };
       }
   }
   return 0;
}


    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:

    相关文章

    【C++图形化编程】EasyX函数~图像操作相关函数

    【C++图形化编程】EasyX函数~图像操作相关函数

    图像处理相关函数函数或数据类型描述IMAGE保存图像的对象loadimage读取图片文件saveimage保存绘图内容至图片文件getimage从当前绘图设备种获取图像putimage在当前绘图设备上...

    【C++图形化编程】flappy bird(1)—基础框架及图形图像

    【C++图形化编程】flappy bird(1)—基础框架及图形图像

    0.前言    前面一篇文章,我们简单介绍了鼠标的一些操作, 这篇文章,我们还是一个实战教程,flappy bird的小游戏。1.导入背景和音乐  &...

    【C++图形化编程】C++图形库的引入

    【C++图形化编程】C++图形库的引入

    0.前言前面的文章用C++的控制台完成了小游戏,但是我们平常玩的游戏都是有图形化界面,我们从这篇文章开始就引入一个C++图形库—EasyX。C++的图形库有很多,EasyX是最适合上手的图形库。1.简...

    EasyX—制作复杂动画效果

    这篇文章来简单学习一下复杂动画效果。本文资源下载地址:这里参考代码#include <graphics.h> #include <conio.h> in...

    C++小游戏—贪吃蛇(1)

    0.前言c++小游戏来到了第二个,第二个小游戏是贪吃蛇。首先来分析一下需求。我们需要一个函数专门来绘制地图的。在地图上随机生成“食物”。按键函数,用来监听键盘事件。蛇的状态函数。移动函数等。1.参考代...

    C++实现走迷宫小游戏

    1.简单版本简单版本是利用字符数组实现的,利用字符数组设定入口和出口,用户每次按键就刷新一下当前字符数组。参考代码:#include<stdio.h>#include<stdlib....