游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3770|回复: 7

怎么在OGRE里获得KeyRelease消息?

[复制链接]

32

主题

232

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
发表于 2007-3-5 14:10:00 | 显示全部楼层 |阅读模式
1.首先我先继承了KeyListener这个类,实现了KeyPressed和KeyReleased

class  MykeyListener:public OIS::KeyListener
{
public:
        bool keyPressed( const OIS::KeyEvent &arg )
        {
                if((arg.key==OIS::KC_J)||(arg.key==OIS::KC_L))
                        MessageBox(0,"keypressed","",0);
                   translate=0;
                return true;

        }

        bool keyReleased( const OIS::KeyEvent &arg )
        {

                //实现动画
                return true;
        }

};

2.然后我将我的我的listener告诉FrameListener.

class MyFrameListener : public ExampleFrameListener
{
protected:
  MykeyListener *listener;       
public:
        MyFrameListener(RenderWindow* win, Camera* cam, SceneNode* fountainNode)
                : ExampleFrameListener(win, cam)
        {
           MyNode=fountainNode;
           listener=new MykeyListener();
          
           mKeyboard->setEventCallback(listener);
        }

        ~MyFrameListener()
        {
                delete listener;
        }
}

3.最后将FrameListener加到ExampleApplication里.

lass MyApplication : public ExampleApplication
{
protected:

public:
    MyApplication() {


   
    }

    ~MyApplication() { }

protected:
   
        void createFrameListener(void)
        {
                mFrameListener= new MyFrameListener(mWindow, mCamera, MyNode);
                mRoot->addFrameListener(mFrameListener);
        }
    // Just override the mandatory create scene method
    void createScene(void)
    {

     
          
    }

};



最后问题是:在keyPressed和keyReleased里无法得到消息?也就是说根本就没有回调这两个函数.
哪位高手告诉我漏掉什么了??怎么修改??
十分感谢!!

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2007-3-6 10:43:00 | 显示全部楼层

Re: 怎么在OGRE里获得KeyRelease消息?

1,每一frame要更新OIS
2,ois一定要配置到主窗口上(而Ogre可以渲染到子窗口)
一般来说 这两个问题居多。

32

主题

232

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
 楼主| 发表于 2007-3-6 17:26:00 | 显示全部楼层

Re:怎么在OGRE里获得KeyRelease消息?

呵呵,谢谢免费打工仔.问题已经解决了,要把键盘设置为Buffer模式就可以了.
对了,顺便再问下免费打工仔,怎么创建曲线路径动画啊(曲率可以随时改变的)

比如:摄影机器饶一个物体圆形围绕,但摄影机总是朝向物体的

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2007-3-6 19:01:00 | 显示全部楼层

Re:怎么在OGRE里获得KeyRelease消息?

ogre的demo中就有这样的例子阿,好像叫做摄像机轨迹之类的名字,应该是通过控制器调度摄像机所挂接的场景节点,然后通过lookAt方法来让摄像机一直朝向物体
其中创建曲线动画的方法可以看看控制器的使用方法。可以用它来操作物体节点

32

主题

232

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
 楼主| 发表于 2007-3-6 19:33:00 | 显示全部楼层

Re:怎么在OGRE里获得KeyRelease消息?

呵呵,你说的那个摄影机轨迹的例子我知道,但是我这里的情况是这样的,创建了个CameraNode用来绑定Camera,CameraNode下面创建了个RobotNode用于绑定一个机器人模型.当我按下"I"键时,摄影机往前走,模型播放骨骼动画;当我按下"J"时,摄影机往后走,模型播放骨骼动画;按下"J"和"L"分别使模型旋转,当释放"J"和"L"的时候,摄影机按照弧线旋转,并且摄影机在旋转的时候,永远朝向一点(这个好做,的确是设置LookAt就可以了).

还有,使用AnimateNodeTrack需要挂接到Node,而如果我把它挂接到Camera的Node,这样就会导致CameraNode下的RobotNode跟着一起动了.
我看了下<<OGRE一起学>>文章,上面有讲用SinpleSpline的方法实现路径,但我看了例子只能用来创建直线运动,我就再找找到了RotationalSpline,现在头都被转晕了.
是不是在OGRE里面,用Controller容易实现些??

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2007-3-7 13:07:00 | 显示全部楼层

Re: Re:怎么在OGRE里获得KeyRelease消息?

billwillman: Re:怎么在OGRE里获得KeyRelease消息?

呵呵,你说的那个摄影机轨迹的例子我知道,但是我这里的情况是这样的,创建了个CameraNode用来绑定Camera,Came...

我能想到的问题就是对节点的使用可能并不是很合理,应该在摄像机上面增加一个节点。

如果你的摄像机能单独移动,从道理上来讲,这时候人物也不应该是摄像机的子节点。

比如,A节点表示控制节点,B在下面为摄像机节电挂载到A上面,C为人物节点也挂接到A上,这样就不会因为移动摄像机而影响人物了。

32

主题

232

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
 楼主| 发表于 2007-3-7 13:52:00 | 显示全部楼层

Re:怎么在OGRE里获得KeyRelease消息?

恩,谢谢你,我也感觉我的接点设计有问题,没有想到再引入一个接点,当时感觉摄影机接点放模型接点上面也不是,下面也不是.
你说的结构应该是这样的吧:
              A(控制接点)
(摄影机接点)B    C(模型接点)

32

主题

232

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
 楼主| 发表于 2007-3-7 13:56:00 | 显示全部楼层

Re:怎么在OGRE里获得KeyRelease消息?

哦,对了,Controller用途是不是在控制接点物体内部属性的改变(随时间动态变化)?就是例如,光源的颜色随时间改变
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 15:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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