游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3022|回复: 8

3D游戏如何接受鼠标消息?

[复制链接]

9

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
发表于 2009-11-1 15:42:00 | 显示全部楼层 |阅读模式
我用D3D9画了一个五子棋棋盘,请问用什么方法可以让程序知道用户鼠标的位置,然后和顶点位置比较,再执行落子的步骤。
是一定要用D3D的鼠标拾取吗? 有没有简单一点的办法获得顶点视口变换后的屏幕坐标?
谢谢。

4

主题

30

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2009-11-1 15:55:00 | 显示全部楼层

Re: 3D游戏如何接受鼠标消息?

GetCursorPos
可以获取光标的位置

同时D3D项目中一样可以存在windows的消息循环!
WM_*****

自己组合一下!

9

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2009-11-1 15:55:00 | 显示全部楼层

Re:3D游戏如何接受鼠标消息?

有没有高手给点指示?

9

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2009-11-1 15:57:00 | 显示全部楼层

Re:3D游戏如何接受鼠标消息?

可是,我怎么才能获得视口变换后的顶点屏幕坐标呢?

4

主题

30

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2009-11-1 16:02:00 | 显示全部楼层

Re:3D游戏如何接受鼠标消息?

你的意思是要获取光标针对窗口的坐标是吗?


ClientToScreen
ScreenToClient

窗口坐标和桌面坐标互相转换!

需要窗口的句柄,这个应该不难吧!

9

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2009-11-1 16:18:00 | 显示全部楼层

Re:3D游戏如何接受鼠标消息?

LS: 我的意思是,我用D3DX9 画了个棋盘,那我定义的顶点通过世界变换,观察.投影变换,还有视口变换之后在用户显示区的像素坐标什么获得。

4

主题

30

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2009-11-1 16:29:00 | 显示全部楼层

Re:3D游戏如何接受鼠标消息?

D3DXIntersect 判断一条射线与那些三角面相交!

9

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2009-11-1 19:19:00 | 显示全部楼层

Re:3D游戏如何接受鼠标消息?

D3DXIntersect的第一个参数可不可以设为NULL?

1

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2009-11-6 19:10:00 | 显示全部楼层

Re: 3D游戏如何接受鼠标消息?

bool CGameEngine_Input::CreateDirectInput(HINSTANCE hInst)
{
        if(FAILED(DirectInput8Create(hInst,DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&g_pIDirectInput,NULL)))
        {
                MessageBox(NULL,"建立DirectInput8接口对象失败","警告",MB_OK | MB_ICONINFORMATION);
                return false;
        }
        return true;
}

bool CGameEngine_Input::CreateMouse(HWND hWnd)
{
        //建立鼠标输入对象
        if(FAILED(g_pIDirectInput->CreateDevice(GUID_SysMouse,&m_pMouseDevice,NULL)))
        {
                MessageBox(NULL,"建立鼠标输入设备对象失败","警告",MB_OK | MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //设置鼠标的数据读取格式
        if(FAILED(m_pMouseDevice->SetDataFormat(&c_dfDIMouse)))
        {
                MessageBox(NULL,"设置鼠标的数据读取格式失败","警告",MB_OK | MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //设置鼠标的协调级别
        if(FAILED(m_pMouseDevice->SetCooperativeLevel(hWnd,DISCL_NONEXCLUSIVE | DISCL_FOREGROUND)))
        {
                MessageBox(NULL,"设置鼠标的协调级别失败","警告",MB_OK | MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //设置鼠标设备的属性(缓冲模式)
        DIPROPDWORD dipROPWORD;
        dipROPWORD.diph.dwSize = sizeof(DIPROPDWORD);
        dipROPWORD.diph.dwHeaderSize = sizeof(DIPROPHEADER);
        dipROPWORD.diph.dwObj = 0;
        dipROPWORD.diph.dwHow = DIPH_DEVICE;
        dipROPWORD.dwData = MOUSE_NUM;
        if(FAILED(m_pMouseDevice->SetProperty(DIPROP_BUFFERSIZE,&dipROPWORD.diph)))
        {
                MessageBox(NULL,"设置鼠标设备的属性失败","警告",MB_OK | MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //获取鼠标设备的访问权
        if(FAILED(m_pMouseDevice->Acquire()))
        {
                MessageBox(NULL,"获取鼠标设备的访问权失败","警告",MB_OK | MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        return true;
}
bool CGameEngine_Input::ReadMouse()
{
        DWORD dwReadNum = 1;
        ZeroMemory(m_MouseDate,sizeof(DIDEVICEOBJECTDATA)*MOUSE_NUM);
        int i;
        for(i=0; i<MOUSE_NUM; i++)
        {
                if(m_pMouseDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),&m_MouseDate,&dwReadNum,0) == DIERR_INPUTLOST)
                {
                        m_pMouseDevice->Acquire();
                        if(FAILED(m_pMouseDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),&m_MouseDate,&dwReadNum,0)))
                        {
                                return false;
                        }
                }
                if(m_MouseDate.dwOfs == DIMOFS_X)
                {
                        m_lMouseMoveX += m_MouseDate.dwData;
                }
                if(m_MouseDate.dwOfs == DIMOFS_Y)
                {
                        m_lMouseMoveY += m_MouseDate.dwData;
                }
        }
        return true;
}

bool CGameEngine_Input:ButtonDown()
{
        for(int i=0; i<MOUSE_NUM; i++)
        {
                if((m_MouseDate.dwOfs == DIMOFS_BUTTON0) && (m_MouseDate.dwData & 0x80))
                {
                        return true;
                }
        }
        return false;
}

bool CGameEngine_Input::RButtonDown()
{
        for(int i=0; i<MOUSE_NUM; i++)
        {
                if((m_MouseDate.dwOfs == DIMOFS_BUTTON1) && (m_MouseDate.dwData & 0x80))
                {
                        return true;
                }
        }
        return false;
}

bool CGameEngine_Input::MButtonDown()
{
        for(int i=0; i<MOUSE_NUM; i++)
        {
                if((m_MouseDate.dwOfs == DIMOFS_BUTTON2) && (m_MouseDate.dwData & 0x80))
                {
                        return true;
                }
        }
        return false;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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