游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4145|回复: 9

按下鼠标右键,拖动鼠标,摄象机也随着移动,代码怎么写呀?

[复制链接]

48

主题

142

帖子

142

积分

注册会员

Rank: 2

积分
142
发表于 2007-7-27 16:52:00 | 显示全部楼层 |阅读模式
比如
LPDIRECTINPUTDEVICE8        lpdimouse        =NULL;
DIMOUSESTATE mouse_state;

bool Display(float timeDelta)
{

lpdimouse->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mouse_state);
        if(Device)
        {

                if(WM_RBUTTONDOWN)
                //Camera         TheCamera(Camera:ANDOBJECT);灵活的摄象机类
                      TheCamera.walk(((float)mouse_state.lY) );



                D3DXMATRIX V;
                TheCamera.getViewMatrix(&V);
                Device->SetTransform(D3DTS_VIEW,&V);

                //
                //Draw the scene
                //

                Device->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0xff000000,1.0f,0);
                Device->BeginScene();

                D3DXMATRIX I;
                D3DXMatrixIdentity(&I);

                if(TheTerrain)
                        TheTerrain->Render();

                Device->EndScene();
                Device-&gtresent(0,0,0,0);
        }
        return true;
}

这里if(WM_RBUTTONDOWN)好象形同虚设,只要鼠标移动摄象机就前后走动.
偶想要的就是按下鼠标右键后实现上面的效果.
怎么办?

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2007-7-27 17:29:00 | 显示全部楼层

Re:按下鼠标右键,拖动鼠标,摄象机也随着移动,代码怎么写

得到鼠标位置 类似
if(LastX > CurX) do 调用对应的旋转移动摄象机的函数

48

主题

142

帖子

142

积分

注册会员

Rank: 2

积分
142
 楼主| 发表于 2007-7-27 19:21:00 | 显示全部楼层

Re:按下鼠标右键,拖动鼠标,摄象机也随着移动,代码怎么写

我的意思是
if(按下鼠标右键)
do 调用对应的旋转移动摄象机的函数

问题的关键是如何有效地表达鼠标右键被按下

48

主题

142

帖子

142

积分

注册会员

Rank: 2

积分
142
 楼主| 发表于 2007-7-31 17:30:00 | 显示全部楼层

Re:按下鼠标右键,拖动鼠标,摄象机也随着移动,代码怎么写

是不是提问的方式不对呀?

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2007-7-31 17:42:00 | 显示全部楼层

Re:按下鼠标右键,拖动鼠标,摄象机也随着移动,代码怎么写

你用winAPI 或者 dxinput都可以得到按下的消息啊?你别说你不知道就开始做游戏了.如果是,先去学习这些知识比较好

48

主题

142

帖子

142

积分

注册会员

Rank: 2

积分
142
 楼主| 发表于 2007-7-31 18:12:00 | 显示全部楼层

Re:按下鼠标右键,拖动鼠标,摄象机也随着移动,代码怎么写

谢谢楼上的.
你看这个函数怎么样
void ProcessMouse()
{
DIMOUSESTATE MouseState;

        if(FAILED(lpMouse->GetDeviceState(sizeof(MouseState),(LPVOID)&MouseState)))
    {
                return;
    }

        //Is the left mouse button down?
        if(MOUSEBUTTONDOWN(MouseState.rgbButtons[MOUSEBUTTON_LEFT]))
        {
                m_nMouseLeft = 1;
        }
        else
        {
                m_nMouseLeft = 0;
        }

        //Is the right mouse button down?
        if(MOUSEBUTTONDOWN(MouseState.rgbButtons[MOUSEBUTTON_RIGHT]))
        {
                m_nMouseRight = 1;
        }
        else
        {
                m_nMouseRight = 0;
        }
   
        m_nMouseX += MouseState.lX;
        m_nMouseY += MouseState.lY;
}

在下面的函数中被调用
VOID SetupMatrices()
{

        D3DXMatrixIdentity(&g_matWorld);

        g_pd3dDevice->SetTransform( D3DTS_WORLD,&g_matWorld);
   
        ProcessMouse();

    if(m_nMouseRight == 0 )
        {
        g_pCamera->walk((float)m_nMouseY);
            g_pCamera->yaw((float)m_nMouseX);
                g_pCamera->getViewMatrix(&matView);
        }
       
        else
        {
           D3DXMatrixLookAtLH( &matView,&vEyePt, &vLookatPt , &vUpVec );
        }
       g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

        D3DXMATRIXA16 matProj;
    D3DXMatrixPerspectiveFovLH( &matProj,D3DX_PI/4,  1.0f, 1.0f, 1000.0f);
    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}


但是这句if(FAILED(lpMouse->GetDeviceState(sizeof(MouseState),(LPVOID)&MouseState)))又引起访问冲突
一下子陷入困惑与迷茫当中,找不出哪里的原因.

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2007-8-1 13:56:00 | 显示全部楼层

Re:按下鼠标右键,拖动鼠标,摄象机也随着移动,代码怎么写

太乱懒得看,把我引擎代码给你
HRESULT hr = S_FALSE;
        //得到当前的鼠标状态
        hr = m_pInputDeviceMouse->GetDeviceState(sizeof(DIMOUSESTATE),       
                (LPVOID)m_pMouse);

        if(S_OK != hr)
        {
                return false;
        }
        //0x80是测试码
        if(m_pMouse->rgbButtons[1] & 0x80)
        {

                return true;
        }
        else
        {
                return false;
        }
        return true;这样就好了

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2007-8-1 14:04:00 | 显示全部楼层

Re:按下鼠标右键,拖动鼠标,摄象机也随着移动,代码怎么写

你判断上一次的鼠标坐标 和这一针的位置 变化.移动摄象机向哪个变化的方向就好了
如果你那句出错了,说明你前面声请设备的时候失败了.或者你没有得到设备.检查一下!

48

主题

142

帖子

142

积分

注册会员

Rank: 2

积分
142
 楼主| 发表于 2007-8-4 14:10:00 | 显示全部楼层

Re:按下鼠标右键,拖动鼠标,摄象机也随着移动,代码怎么写

谢谢楼上的.
看来是我没有得到设备的原因.
因为下面的代码
    HRESULT hr;

    // 创建一个 DIRECTINPUT 对象
    hr = DirectInput8Create(hInstanceCopy, DIRECTINPUT_VERSION,IID_IDirectInput8, (void**)&lpDirectInput, NULL);

    if FAILED(hr)
    {
                ::MessageBox(0,"Create-FAILED",0,0);
         
        return FALSE;       
               

    }
引出一个错误框带有Create-FAILED
怎么会这样,这又如何是好?

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-12-24 09:34:00 | 显示全部楼层

Re:OSFG

这代码是没问题,但最近才发现,如果放在帧更新函数里面调用这方法,当你鼠标按下时,就会执行if(m_pMouse->rgbButtons[1] & 0x80)
{
TO DO...
return true;
}

10多次左右,我想是不是因为帧更新的太快,鼠标弹起还没有清除对应按键信息导致执行多次呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-4 22:41

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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