游戏编程入门之测试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[ ...
随机推荐
- truffle运行特殊 无法找到module的处理方法
https://blog.csdn.net/SnWJy/article/details/80549227 错误描述: truffle项目根目录执行truffle compile时,报错'modul ...
- DataSet转化为DataTable
. DataTable dt = ds.Tables[]; . DataTable dt = dao.FillTables("GetOptions_DKI_City_HCPName" ...
- C中的除法,商和余数的大小、符号如何确定
对于C中的除法,商和余数的大小.符号是如何确定的呢?在C89中,只规定了如果两个数为正整数,那么余数的符号为正,并且商的值是接近真实值的最大整数.比如5 / 2,那么商就是2,余数就是1.但是,C89 ...
- Java学习个人备忘录之内部类
内部类: 将一个类定义在另一个类的里面,对里面那个类就称为内部类. class Outer { private int num = 3; class Inner //它想访问Outer中的num, 如 ...
- Java中的线程的优先级
Java 中线程优先级简介: 1. Java 提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程. 按照线程的优先级决定应该调度哪个线程来执行. 2. 线程的优先级用数字表示, 范围从 1 到 ...
- Launch Image消失时添加动画
CGSize viewSize = self.window.bounds.size; NSString *viewOrientation = @"Portrait"; //横屏请设 ...
- C++多态实现与继承
面向对象的三个基本特征 面向对象的三个基本特征是:封装.继承.多态.其中, 封装可以隐藏实现细节,使得代码模块化: 继承可以扩展已存在的代码模块(类),它们的目的都是为了——代码重用: 而多态则是为了 ...
- git工具SourceTree工作流
分支模型 master 用来最终上线的分支,最终发布版本,整个项目中有且只有一个 develop 项目中用来开发的分支,原则上项目中有且只有一个,develop 分支下面的分支是经常变化的,会创建新的 ...
- leetcode 整理
1.Two Sum 构造Comparator,KSum 这一类的问题最基本的一题, 解法: 先sort,然后双指针,头尾各一个.进行加逼找值. 对于其余的KSum最终是降次到2次. 如3Sum固定一个 ...
- [剑指Offer] 65.矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...