C语言检测某键是否被按下(监视热键)[GetKeyState] (从雷电战机的项目中引入)

雷电战机-BETA版本


http://www.yyycode.cn/index.php/2020/04/29/%e9%9b%b7%e7%94%b5%e6%88%98%e6%9c%ba-beta%e7%89%88%e6%9c%ac/  更好的观看体验【内附源码下载】


更新内容:真实随机+界面enter+键盘读入优化(支持双按键)

最想说的还是 “C语言检测某键是否被按下(监视热键)[GetKeyState]”的读入优化,本来是用kbhit()的

总结:

  • 键盘读入优化可以用GetKeyState函数,比那个垃圾_khbit()好多了,函数内判断的是虚拟键位,这个不用记,用到百度就行了。[主要是网上这个函数的怎么用讲解不是很看得懂和会用,所以这一块卡了好久。需要注意的是要加Sleep函数,因为这个函数读取太快了,按一下键盘就读取几十次了
  • 内存泄漏问题:STL的链表erase 的时候并不会顺手给你释放内存,需要手动delete *iterator,同时要是注意delete删除的是指针的对象,不会删除指针,所以依然放心的erase(iterator)
  • 怎么发现内存泄漏问题呢?可以调试的时候看右测框框的内存变化。还有来自yhy的建议—— “话说内存泄漏建议你用valgrind测一次”。
  • debug和release模式下的区别: https://blog.csdn.net/sac761/article/details/52120262/ 这里面讲得比较全,这次出的问题是release下的子弹是一直发射的,因为k被赋值了没有变回来,可以在GAME.cpp里面末尾k=0,或者在控制函数中加上return 0;(其实还是细心的问题和代码的问题,因为有时候没加return 0 而debug模式下是会帮你优化的)
  • 伪随机数的问题:只用一个rand默认种子1,加一下srand((int)time(NULL));达成随机种子;

键位优化的样例

#include<stdio.h>
#include<windows.h>
#include<iostream>
#include<conio.h>
#include<time.h>
using namespace std;
int main()
{


	while (1)
	{
		//获取某键状态 
		if (GetKeyState(VK_SPACE) < 0)		//如果某键被按下 
		{
		//	cout << "a=" << a << endl;
			printf("0.0\n");
		
		}
		int down = 0;

		down = GetKeyState(VK_DOWN);//获取下箭头键状态   如果down>0 表示被松开  down<0 表示被按下
		if (down < 0)      //如果下箭头键被按下   
		{
			cout << "按下了down" << endl;
		}
		Sleep(50);//到时候实践看看要不要,没有sleep的话太快了,正常按下一次会有很多读入键盘
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zstuyyyyccccbbbb/article/details/105851520