C++游戏手柄编程-基于windowsAPI-JOYSTICKID

我用的是北通宙斯游戏手柄-白金

放几篇非常不错的文章

1.JoyStick游戏杆编程实践_32768的博客-CSDN博客_joystick

2.游戏手柄(JoyStick)编程学习笔记(1)_liyuanbhu的博客-CSDN博客

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

#include<Windows.h>

//添加joystick操作api的支持库
#include<MMSystem.h>
#pragma comment(lib, "Winmm.lib")

int main(int argc, char* argv[])
{
	JOYINFO joyinfo;//定义joystick信息结构体
	JOYINFOEX joyinfoex;
	joyinfoex.dwSize = sizeof(JOYINFOEX);
	joyinfoex.dwFlags = JOY_RETURNALL;
	while(1)
	{
		//读取手柄信息
		UINT joyNums;
		joyNums = joyGetNumDevs();
//		printf("当前手柄数量:%d \n",joyNums);
		if (joyNums>=1)
		{
			MMRESULT joyreturn = joyGetPosEx(JOYSTICKID1, &joyinfoex);
			if(joyreturn == JOYERR_NOERROR)
			{
				printf("0x%09d ", joyinfoex.dwXpos);
				printf("0x%09d ", joyinfoex.dwYpos);
				//printf("0x%09X ", joyinfoex.dwZpos);
				//printf("0x%09X ", joyinfoex.dwPOV);
				//printf("0x%09X ", joyinfoex.dwButtons);
				printf("\n");
			}else
			{
				switch(joyreturn) 
				{
				case JOYERR_PARMS :
					printf("bad parameters\n");
					break;
				case JOYERR_NOCANDO :
					printf("request not completed\n");
					break;
				case JOYERR_UNPLUGGED :
					printf("joystick is unplugged\n");
					break;
				default:
					printf("未知错误\n");
					break;
				}
			}
    	}
    	
		if(kbhit()) break;
		Sleep(300);
	}
	return 0;
}

第一步:需要包含外部库,我用的QT开发,需要在.pro文件中添加

LIBS += -lWinmm

 包含以下的头文件

#include <Windows.h>
#include <WinUser.h>
#include <MMsystem.h>

第二步:查询游戏手柄按键信息

1.方向键(前、后、左、右)

方向键
按键访问方式键值
joyinfoex.dwPOVJOY_POVFORWARD
joyinfoex.dwPOVJOY_POVBACKWARD
joyinfoex.dwPOVJOY_POVLEFT
joyinfoex.dwPOVJOY_POVRIGHT
默认状态joyinfoex.dwPOVJOY_POVCENTERED

默认没有按键的时候发送 JOY_POVCENTERED 信号
 

//方向键
if (joyinfoex.dwPOV == JOY_POVFORWARD)//前
{
	printf("前");
}
if (joyinfoex.dwPOV == JOY_POVCENTERED)//默认没有按键时发送此信号
{
	printf("宫保鸡丁");
}
if (joyinfoex.dwPOV == JOY_POVRIGHT)//右
{
	printf("右");
}
if (joyinfoex.dwPOV == JOY_POVBACKWARD )//后
{
	printf("后");
}
if (joyinfoex.dwPOV == JOY_POVLEFT)//左
{
	printf("左");
}

 2.获取32个按键按下,可以进行组合。

按键访问方式键值
32个组合按键joyinfoex.dwButtons通过函数测

3.获取摇杆、LT\RT信息

(1)、左摇杆,通过xy的坐标来读取,原点是32767

 (2)、右摇杆通过ur的坐标来读取,原点是32767

按键访问方式键值
左摇杆x坐标:joyinfoex.dwXpos0-65535
y坐标:joyinfoex.dwYpos0-65535
右摇杆u坐标:joyinfoex.dwUpos0-65535
r坐标:joyinfoex.dwRpos0-65535
LT\RT

joyinfoex.dwZpos

没有按键按下:

RT按下:

LT按下:

32767

32767 - 128

32767 - 65408

if (joyinfoex.dwXpos<32767 && joyinfoex.dwYpos>32767)
{
	printf("宫保鸡丁");
}
printf("%d", joyinfoex.dwXpos);
printf("%d", joyinfoex.dwYpos);
printf("%d", joyinfoex.dwZpos);
if (joyinfoex.dwZpos == 128)
{
	printf("宫保鸡丁");
}
printf("%d", joyinfoex.dwUpos);
printf("%d", joyinfoex.dwRpos);

这样就可以读取手柄上的按键信息,进行判断。

  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值