查看: 1840|回复: 12

关于漫游器

[复制链接]

该用户从未签到

发表于 2011-9-7 17:04:41 | 显示全部楼层 |阅读模式
本人新手,照着书上实现了漫游器的操作,w键向前,a向左转弯,d向右转弯,怎么才能实现同时摁住w键和a键完成左转并且向前的功能呢?
我试过
if ((ea.getKey() == 'w')&&(ea.getKey() == 'a'))
{
     //向前移动
     changePosition(osg::Vec3d(m_vStep*cosf(osg:I_2+m_vLookAt._v[2]),
                m_vStep*sinf(osg::PI_2+m_vLookAt._v[2]),0));
   //视角向左移动
     m_vLookAt[2] +=0.1;
     return true;
}

可是不行,只能实现视角的变化。
跪求答案

该用户从未签到

发表于 2011-9-7 20:02:40 | 显示全部楼层
你的这种组合建的语句好像不对吧

该用户从未签到

发表于 2011-9-8 08:48:48 | 显示全部楼层
怎么才能实现同时摁住w键和a键完成左转
Windows的Message机制是做不到这一点的,您也许需要考虑directinput这样的库或者用GetKeyState这样的Windows函数

该用户从未签到

发表于 2011-9-8 09:24:58 | 显示全部楼层
回复 3# array


   锐哥,我也遇到这样的问题,OSG中怎么调用外部函数?谢谢。

该用户从未签到

发表于 2011-9-8 12:07:51 | 显示全部楼层
可以对按键的push/release做一个标志量,然后在frame里去操作,基本就可以实现组合键了
另外楼主也不用跪求

该用户从未签到

发表于 2011-9-8 19:41:42 | 显示全部楼层
回复  array


   锐哥,我也遇到这样的问题,OSG中怎么调用外部函数?谢谢。
Hadse 发表于 2011-9-8 09:24



    windows的标准函数,该怎么用怎么用啊,跟osg什么关系

该用户从未签到

发表于 2011-9-9 09:26:36 | 显示全部楼层
回复 6# tianxiao888


   恩,新手,以前没用过,见谅。

该用户从未签到

发表于 2011-9-9 15:48:26 | 显示全部楼层
回复 1# osg穷人


   你好,我的问题解决了,其实很简单,你看看代码就能明白。
  1. bool LOGO_ComboKey::handle(const osgGA::GUIEventAdapter &ea,osgGA::GUIActionAdapter &aa)
  2. {
  3.         switch (ea.getEventType())
  4.         {
  5.         case(osgGA::GUIEventAdapter::KEYDOWN):
  6.                 {
  7.                         if (ea.getKey() == 0xFF52 || ea.getKey () == 0x57 || ea.getKey () == 0x77)//up
  8.                         {
  9.                                 btnUP=true;
  10.                                 return true;
  11.                         }
  12.                         if (ea.getKey() == 0xFF54 || ea.getKey () == 0x53 || ea.getKey () == 0x73 )//down
  13.                         {
  14.                                 btnDOWN=true;
  15.                                 return true;
  16.                         }
  17.                         if (ea.getKey () == 0x41||ea.getKey () == 0x61) //A
  18.                         {
  19.                                 btnLEFT=true;
  20.                                 return true;
  21.                         }

  22.                         if (ea.getKey () == 0x44||ea.getKey () == 0x64)//D
  23.                         {
  24.                                 btnRIGHT=true;
  25.                                 return true;
  26.                         }
  27.                         return false;
  28.         case osgGA::GUIEventAdapter::KEYUP:
  29.                 if (ea.getKey() == 0xFF52 || ea.getKey () == 0x57 || ea.getKey () == 0x77)//up
  30.                 {
  31.                         btnUP=false;
  32.                         return true;
  33.                 }
  34.                 if (ea.getKey() == 0xFF54 || ea.getKey () == 0x53 || ea.getKey () == 0x73 )//down
  35.                 {

  36.                         btnDOWN=false;
  37.                         return true;
  38.                 }
  39.                 if (ea.getKey () == 0x41||ea.getKey () == 0x61) //A
  40.                 {
  41.                         btnLEFT=false;
  42.                         return true;
  43.                 }

  44.                 if (ea.getKey () == 0x44||ea.getKey () == 0x64)//D
  45.                 {
  46.                         btnRIGHT=false;
  47.                         return true;
  48.                 }               
  49.                 }
  50.                 break;
  51.         default:
  52.                 break;
  53.         }
  54.         if (btnUP)
  55.         {
  56.                 m_vPosition += osg::Vec3 (0, m_fMoveSpeed * sinf(osg::PI_2+m_vRotation._v[2]), 0) ;
  57.                 m_vPosition += osg::Vec3 (m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0, 0);
  58.         }

  59.         if (btnDOWN)
  60.         {
  61.                 m_vPosition += osg::Vec3 (0, -m_fMoveSpeed * sinf(osg::PI_2+m_vRotation._v[2]), 0) ;
  62.                 m_vPosition += osg::Vec3 (-m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0, 0);               
  63.         }

  64.         if (btnLEFT) //A
  65.         {
  66.                 m_vPosition += osg::Vec3 (0, m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0) ;
  67.                 m_vPosition += osg::Vec3 (-m_fMoveSpeed * sinf(osg::PI_2+m_vRotation._v[2]), 0, 0) ;
  68.         }

  69.         if (btnRIGHT)//D
  70.         {

  71.                 m_vPosition += osg::Vec3 (0, -m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0) ;
  72.                 m_vPosition += osg::Vec3 (m_fMoveSpeed * sinf(osg::PI_2+m_vRotation._v[2]), 0, 0) ;

  73.         }
  74.         return false;
  75. }
复制代码

该用户从未签到

发表于 2011-9-10 12:32:26 | 显示全部楼层
给你个简单的建议
自己维护一个 key[256] 数组,用KEYDOWN和KEYUP来修改这个数组。
osg中256是明显不够的  你可以考虑设置一个合理的最大值  比如 65535什么的。

nehe的教程都是这么处理key的。
这招最简单。

该用户从未签到

发表于 2011-9-11 00:39:52 | 显示全部楼层
可以使用LIST,在KEY DOWN事件中将案件保存到链表(注意重复值的检查)里,在KEY UP中从链表中去掉
每一帧事件遍历链表,调用相应的函数。
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2011-9-11 01:22:24 | 显示全部楼层
    回复  osg穷人


       你好,我的问题解决了,其实很简单,你看看代码就能明白。
    Hadse 发表于 2011-9-9 15:48


    正解。

    该用户从未签到

    发表于 2011-11-13 20:13:49 | 显示全部楼层
    Hadse 发表于 2011-9-9 15:48
    回复 1# osg穷人

    怎么你这程序运行之后报出一个bug,不知楼主是否遇到这种情况,怎么解决的啊!
    W}SCG$`UZ5G1E5{IMI8RO7A.jpg

    该用户从未签到

    发表于 2013-6-21 11:46:21 | 显示全部楼层
    Hadse 发表于 2011-9-9 15:48
    回复 1# osg穷人

    您好,我有2点不明白,想请教下,1,为什么最后是返回false?刚开始我自己写的是true,一直没用,然后来找到了这篇帖子,发现最后返回的是false?2,一旦有一个键释放则整个操作就停止了,比如说我现在是往左前方移动,我一旦释放左键,就会停止下来。按理说还是往前的啊?怎样才能让他继续往前走呢?谢谢!
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    OSG中国官方论坛-有您OSG在中国才更好

    网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

    联系我们

    • 工作时间:09:00--18:00
    • 反馈邮箱:1315785073@qq.com
    快速回复 返回顶部 返回列表