游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2667|回复: 6

鼠标与键盘输入应当采用何种方式处理?

[复制链接]

2

主题

29

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2011-4-7 10:58:00 | 显示全部楼层 |阅读模式
RT,dx sdk指出directinput组件不再推荐使用,应该改用WM_MOUSEMOVE与WM_INPUT进行鼠标处理,但文中没有探讨键盘输入,我只知道有个GetAsyncKeyState,由于我没学过windows编程,稍微看了一些相关的资料似懂非懂,不知道大家都是怎么处理的,有没有什么例子可以给借鉴学习下,谢谢~

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20515
发表于 2011-4-7 16:46:00 | 显示全部楼层

Re:鼠标与键盘输入应当采用何种方式处理?

需求不是很高的话,一般用用windows的消息事件就可以了。

2

主题

29

帖子

29

积分

注册会员

Rank: 2

积分
29
 楼主| 发表于 2011-4-7 20:52:00 | 显示全部楼层

Re:鼠标与键盘输入应当采用何种方式处理?

额。。ls可否具体点,我没学过windows编程,去哪里找相关资料呢?

9

主题

62

帖子

62

积分

注册会员

Rank: 2

积分
62
发表于 2011-4-8 00:16:00 | 显示全部楼层

Re:鼠标与键盘输入应当采用何种方式处理?

dx sdk指出directinput组件不再推荐使用?
哪里提到的?

2

主题

29

帖子

29

积分

注册会员

Rank: 2

积分
29
 楼主| 发表于 2011-4-8 09:51:00 | 显示全部楼层

Re:鼠标与键盘输入应当采用何种方式处理?

回ls,sdk自带文档DirectX Documentation for C++中DirectX Input里的Directinput开篇陈述:
This section provides information about the Microsoft DirectInput component of the Microsoft DirectX application programming interface (API). The DirectInput API is used to process data from a joystick, or other game controller. (就是这里)The use of DirectInput for keyboard and mouse input is not recommended, Windows messages should be used instead (see Taking Advantage of High-Definition Mouse Movement for additional information). Note that the XInput API has been introduced for Xbox 360 controller support on Windows, see XInput and DirectInput for additional information.
文章《Taking Advantage of High-Definition Mouse Movement for additional information》里解释了原因,如果ls会windows编程的话可否给个具体使用示例,光是这篇文章里介绍的那些东西我实在没法直接拿来使用,谢谢。。。

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2011-4-10 02:33:00 | 显示全部楼层

Re:鼠标与键盘输入应当采用何种方式处理?

void HaWinGameHost::UpdateInput(UINT msg,WPARAM wParam,LPARAM lParam)
{
        switch(msg)
        {
        case WM_KEYDOWN:
                {
                        HaVirtualKey key = MappingKeyCode(wParam,it_Down);
                        _input._AddInputAction(key,(HaInputType)(it_KeboardAction|it_Down),0,0,(int16)lParam);
                        break;
                }
        case WM_KEYUP:
                {
                        HaVirtualKey key = MappingKeyCode(wParam,it_Up);
                        _input._AddInputAction(key,(HaInputType)(it_KeboardAction|it_Up),0,0,0);
                        break;
                }
        case WM_LBUTTONDOWN:
                {
                        uint16 x = (uint16)lParam;
                        uint16 y = (lParam>>16);
                        _input._AddInputAction(vk_LeftButton,(HaInputType)(it_MouseAction|it_Down),x,y,0);
                        break;
                }
        case WM_LBUTTONUP :
                {
                        uint16 x = (uint16)lParam;
                        uint16 y = (lParam>>16);
                        _input._AddInputAction(vk_LeftButton,(HaInputType)(it_MouseAction|it_Up),x,y,0);
                        break;
                }
        case WM_MBUTTONDOWN:
                {
                        uint16 x = (uint16)lParam;
                        uint16 y = (lParam>>16);
                        _input._AddInputAction(vk_MiddleButton,(HaInputType)(it_MouseAction|it_Down),x,y,0);
                        break;
                }
        case WM_MBUTTONUP:
                {
                        uint16 x = (uint16)lParam;
                        uint16 y = (lParam>>16);
                        _input._AddInputAction(vk_MiddleButton,(HaInputType)(it_MouseAction|it_Up),x,y,0);
                        break;
                }
        case WM_RBUTTONDOWN:
                {
                        uint16 x = (uint16)lParam;
                        uint16 y = (lParam>>16);
                        _input._AddInputAction(vk_RightButton,(HaInputType)(it_MouseAction|it_Down),x,y,0);
                        break;
                }
        case WM_RBUTTONUP:
                {
                        uint16 x = (uint16)lParam;
                        uint16 y = (lParam>>16);
                        _input._AddInputAction(vk_RightButton,(HaInputType)(it_MouseAction|it_Up),x,y,0);
                        break;
                }
        case WM_XBUTTONDOWN:
                {
                        uint16 x = (uint16)lParam;
                        uint16 y = (lParam>>16);
                        int32 mask = (wParam & 0xffff);
                        if(mask == MK_XBUTTON1)
                        {
                                _input._AddInputAction(vk_XButton1,(HaInputType)(it_MouseAction|it_Down),x,y,0);
                        }
                        else if(mask == MK_XBUTTON2)
                        {
                                _input._AddInputAction(vk_XButton2,(HaInputType)(it_MouseAction|it_Down),x,y,0);
                        }
                        break;
                }
        case WM_XBUTTONUP:
                {
                        uint16 x = (uint16)lParam;
                        uint16 y = (lParam>>16);
                        int32 mask = (wParam>>16);
                        if(mask == XBUTTON1)
                        {
                                _input._AddInputAction(vk_XButton1,(HaInputType)(it_MouseAction|it_Up),x,y,0);
                        }
                        else if(mask == XBUTTON2)
                        {
                                _input._AddInputAction(vk_XButton2,it_Down,x,y,0);

                        }
                        break;
                }
        case WM_MOUSEWHEEL:
                {
                        int32 delta = (int16)(wParam>>16);
                        delta /=120;
                        _input._AddInputAction(vk_MouseWheel,(HaInputType)(it_MouseAction|it_MouseScroll),0,0,delta);
                        break;
                }
        case WM_MOUSEMOVE:
                {
                        uint16 x = (uint16)lParam;
                        uint16 y = (lParam>>16);
                        _input._AddInputAction(vk_UndefinedKey,
                                (HaInputType)(it_MouseMove|it_MouseAction),x,y,0);
                        break;
                }
        }
}

--------------------------------
上面这段代码基本的输入消息类型都有了
初学用直接在一个线程里处理windows消息就可以了,可以有需要了再考虑用GetAsyncKeyState或者单独开一个线程处理输入
windows编程的书可以参考Programming Windows 5th Edition(Petzold)经典之作,看前面几章就ok了

2

主题

29

帖子

29

积分

注册会员

Rank: 2

积分
29
 楼主| 发表于 2011-4-11 10:04:00 | 显示全部楼层

Re:鼠标与键盘输入应当采用何种方式处理?

多谢ls。。。这个问题困扰我多事了,再次感谢。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 05:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表