游戏编程入门之测试Xbox360控制输入
代码:
#include<Windows.h>
#include<d3d9.h>
#include<d3dx9.h>
#include<Xinput.h>
#include<time.h>
#include<iostream>
using namespace std;
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"xinput.lib")
const string APPTITLE = "XInput Test Program";
const int SCREENW = ;
const int SCREENH = ;
LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;
bool gameover = false;
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) bool XInput_Init(int contNum = )
{
XINPUT_CAPABILITIES caps;
ZeroMemory(&caps, sizeof(XINPUT_CAPABILITIES));
XInputGetCapabilities(contNum, XINPUT_FLAG_GAMEPAD, &caps);
if (caps.Type != XINPUT_DEVTYPE_GAMEPAD)
return FALSE;
return TRUE;
} void XInput_Vibrate(int contNum = , int left = , int right = )
{
XINPUT_VIBRATION vibration;
ZeroMemory(&vibration, sizeof(XINPUT_VIBRATION));
vibration.wLeftMotorSpeed = left;
vibration.wRightMotorSpeed = right;
XInputSetState(contNum, &vibration);
} void XInput_Update()
{
XINPUT_STATE state;
string message = "";
for (int i = ; i < ; i++)
{
ZeroMemory(&state, sizeof(XINPUT_STATE));
message = "";
DWORD result = XInputGetState(, &state);
if (result == )
{
if (state.Gamepad.bLeftTrigger)
message = "Left Trigger";
else if (state.Gamepad.bRightTrigger)
message = "Right Trigger";
else if (state.Gamepad.sThumbLX < - || state.Gamepad.sThumbLX>)
message = "Left Thumb Stick";
else if (state.Gamepad.sThumbRX < - || state.Gamepad.sThumbRX>)
message = "Right Thumb Stick";
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_DPAD_UP)
message = "DPAD Up";
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_DPAD_DOWN)
message = "DPAD Down";
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_DPAD_LEFT)
message = "DPAD Left";
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_DPAD_RIGHT)
message = "DPAD Right";
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_START)
message = "Start Button";
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_LEFT_THUMB)
message = "Left Thumb";
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_RIGHT_THUMB)
message = "Right Thumb";
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_LEFT_SHOULDER)
message = "Left Shoulder";
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_RIGHT_SHOULDER)
message = "Right Shoulder";
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_A)
{
XInput_Vibrate(, , );
message = "A Button";
}
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_B)
{
XInput_Vibrate(, , );
message = "B Button";
}
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_X)
message = "X Button";
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_Y)
message = "X Button";
else if (state.Gamepad.wButtons&XINPUT_GAMEPAD_BACK)
gameover = true;
if (message.length() > )
MessageBox(, message.c_str(), "Controler", );
}
else { }
}
} bool Game_Init(HWND hwnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);
if (d3d == NULL)
{
MessageBox(hwnd, "Error initializing Direct3D", "ERROR", MB_OK);
return FALSE;
}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferCount = ;
d3dpp.BackBufferWidth = SCREENW;
d3dpp.BackBufferHeight = SCREENH;
d3dpp.hDeviceWindow = hwnd;
d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);
if (d3ddev == NULL)
{
MessageBox(hwnd, "Error creating Direct3D device", "Error", MB_OK);
return FALSE;
}
if (!d3ddev)
{
MessageBox(hwnd, "Error creating Direct3D device", "ERROR", MB_OK);
return FALSE;
}
XInput_Init();
return TRUE;
} void Game_Run(HWND hwnd)
{
if (!d3ddev)
return;
d3ddev->Clear(, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(, , ), 1.0f, );
if (d3ddev->BeginScene())
{
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
}
if (KEY_DOWN(VK_ESCAPE))
PostMessage(hwnd, WM_DESTROY, , );
XInput_Update();
} void Game_End(HWND hwnd)
{
if (d3ddev) d3ddev->Release();
if (d3d) d3d->Release();
} LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
gameover = true;
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
} int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
MSG msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = (WNDPROC)WinProc;
wc.style = ;
wc.cbClsExtra = ;
wc.cbWndExtra = ;
wc.hIcon = NULL;
wc.hIconSm = NULL;
wc.hInstance = hInstance;
wc.lpszMenuName = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName = "MainWindowClass";
if (!RegisterClassEx(&wc))
return FALSE;
HWND hwnd = CreateWindow("MainWindowClass", APPTITLE.c_str(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, SCREENW, SCREENH, (HWND)NULL, (HMENU)NULL,
hInstance, (LPVOID)NULL);
if (hwnd == )
return ;
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
if (!Game_Init(hwnd))
return ;
while (!gameover)
{
if (PeekMessage(&msg, NULL, , , PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Game_Run(hwnd);
}
Game_End(hwnd);
return msg.wParam;
}
结果(运行后按下手柄的键位会在红框框中出现相应的提示,博主穷所以就没买手柄,哈哈):

游戏编程入门之测试Xbox360控制输入的更多相关文章
- PC游戏编程(入门篇)(前言写的很不错)
PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...
- 【Visual C++】游戏编程学习笔记之八:鼠标输入消息(小demo)
本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder 微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...
- Python游戏编程入门
<Python游戏编程入门>这些文章负责整理在这本书中的知识点.注意事项和课后习题的尝试实现.并且对每一个章节给出的最终实例进行分析和注释. 初识pygame:pie游戏pygame游戏库 ...
- 【Visual C++】游戏编程学习笔记之七:键盘输入消息
本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder 微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...
- Python游戏编程入门 中文pdf扫描版|网盘下载内附地址提取码|
Python是一种解释型.面向对象.动态数据类型的程序设计语言,在游戏开发领域,Python也得到越来越广泛的应用,并由此受到重视. 本书教授用Python开发精彩游戏所需的[]为重要的该你那.本书不 ...
- DirectX游戏编程入门
刚开始学习D3D,安装完DirectX9后,在VS2008中新建Win32项目· ----------------------------------------------------------- ...
- Python游戏编程入门2
I/O.数据和字体:Trivia游戏 本章包括如下内容:Python数据类型获取用户输入处理异常Mad Lib游戏操作文本文件操作二进制文件Trivia游戏 其他的不说,我先去自己学习文件类型和字符串 ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记3——输入消息处理,物理建模与粒子系统初步
第7章 Windows游戏输入消息处理 1. 键盘消息处理 之前提到的窗口过程函数有两参数与消息输出有关——wParam和llParam LRESULT CALLBACK WindowProc( _I ...
- Unix/Linux环境C编程入门教程(42) 终端控制篇
函数介绍 getopt(分析命令行参数) 相关函数 表头文件 #include<unistd.h> 定义函数 int getopt(int argc,char * const argv[ ...
随机推荐
- linux服务器操作小技巧
python程序后台一直运行,并将打印信息输出到文件中 nohup -u test.py > out.txt & -u 表示无缓冲,直接将打印信息输出带文件中 &表示程序后台运行
- Python3 下安装python-votesmart
在python2下安装python-smart还比较容易,而python3中由于很多函数库的变化直接使用python setup.py install 命令来安装的话会导致错误,而导致错误的原因就是p ...
- HDU 1569 方格取数(2)(最大流最小割の最大权独立集)
Description 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大. ...
- VUE中组件的使用
关于vue组件引用 使用Nodejs的方法 被引用的组件要暴露 module.exports={}; 引用时 用 var abc= require("组件的路径") 然后 就可以用 ...
- 默认初始化&拷贝初始化&直接初始化&值初始化&列表初始化
一.各种初始化的形式 /* 定义变量形式一:不指定初始值 */ int a; // 默认初始化 /* 定义变量形式二:指定初始值 */ int b = 1; // 拷贝初始化 int b(1); // ...
- Median of Two Sorted Arrays(hard)
题目要求: 有两个排序的数组nums1和nums2分别为m和n大小. 找到两个排序数组的中位数.整体运行时间复杂度应为O(log(m + n)). 示例: 我的方法: 分别逐个读取两个数组的数,放到一 ...
- C# 执行bat文件
private void RunBat(string batPath) { Process pro = new Process(); FileInfo file = new FileInfo(batP ...
- HDU 2163 Palindromes
http://acm.hdu.edu.cn/showproblem.php?pid=2163 Problem Description Write a program to determine whet ...
- 解决ueditor编辑器图片在线管理图片无法显示
使用ueditor,点击在线管理,服务器图片路径显示不正确,如下图所示 查看源码,如下: 发现图片src中中间多了一长串的项目跟路径,解决的办法是 把 jsp/controller.jsp 里面 ...
- python urllib使用
Urllib是python内置的HTTP请求库包括以下模块urllib.request 请求模块urllib.error 异常处理模块urllib.parse url解析模块urllib.robotp ...