游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5415|回复: 5

我用OGRE自带的例子程序Demo_Ocean的框架结构,加不了地面怎

[复制链接]

18

主题

78

帖子

165

积分

注册会员

Rank: 2

积分
165
发表于 2008-3-16 22:19:00 | 显示全部楼层 |阅读模式
    我用OGRE自带的例子程序Demo_Ocean的框架结构,自己一步一步写。我成功加了CEGUI和天空盒,以及相应的简单的鼠标键盘事件,仅仅这点点而已。以为可以开始创造游戏世界,但是,当我加人一个OGRE的自带的地面,结果看不到(估计是没有装载成功,但编译无错误,运行无错误)。
   1。 起初怀疑是void chooseSceneManager(void);这个函数的创建管理器选择错误:
原来是:        //mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC, "ExampleSMInstance");
后来改为:        mSceneMgr = mRoot->createSceneManager("TerrainSceneManager");
还是不行。
  2。后来以为是相见放的位置不对,所以看不见。后来设置为:
        // Create the camera 创建相机
        mCamera = mSceneMgr->createCamera(&quotlayerCam");
        // Position it at 500 in Z direction
        mCamera->setPosition(Vector3(128,25,128));
        // Look back along -Z
        mCamera->lookAt(Vector3(0,0,-300));
        mCamera->setNearClipDistance( 1 );
        mCamera->setFarClipDistance( 1000 );
这就是OGRE自带例子里面那个地形的demo程序的相见位置。但是还是不行。

总之失败了。失败的语句是:
        std::string terrain_cfg("terrain.cfg");
        mSceneMgr -> setWorldGeometry( terrain_cfg );

是怎么回事呢?那位兄台帮下忙,先谢过。类结构如下: [em17] [em17]

18

主题

78

帖子

165

积分

注册会员

Rank: 2

积分
165
 楼主| 发表于 2008-3-16 22:22:00 | 显示全部楼层

Re:我用OGRE自带的例子程序Demo_Ocean的框架结构,加不了地面

#pragma once

#ifndef _MyOgreDemo_H_
#define _MyOgreDemo_H_

#include "OgreCEGUIResourceProvider.h"
#include "CEGUI/CEGUI.h"
#include "OgreCEGUIRenderer.h"
#include "OgreCEGUIResourceProvider.h"
#include "ExampleApplication.h"
#include "OgreConfigFile.h"
#include "OgreStringConverter.h"
#include "OgreException.h"
#include "OgreFrameListener.h"
#include "Ogre.h"
#include "CEGUI/CEGUIForwardRefs.h"
#include "OgreString.h"
#include "ExampleLoadingBar.h"
#include <OIS/OIS.h>
#include <cstdlib>

#define UVECTOR2(x, y) UVector2(cegui_reldim(x), cegui_reldim(y))//窗口点换算

//---------------------------------------------------------------------------
enum MovementType
{
        mv_CAMERA, //移动相机,
        mv_MODEL,  //移动模型,
        mv_LIGHT   //移动光
};

class MyOgreDemo;
//public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
class MyOgreDemo_FrameListener : public Ogre::FrameListener, public OIS::MouseListener, public OIS::KeyListener//public Ogre::FrameListener, public OIS::KeyListener,public OIS::MouseListener
{
        //速度定义
#define MINSPEED .150f
#define MOVESPEED 30
#define MAXSPEED 1.800f
protected:
        MyOgreDemo* mMain;
        OIS::Mouse *mMouse;
        OIS::Keyboard *mKeyboard;
        OIS::InputManager* mInputManager;

        CEGUI::Renderer* mGuiRenderer;
        CEGUI::Window* mGuiCurr;
        CEGUI::Window *mExit;

        float mAvgFrameTime;//平均每帧用的时间
        Ogre::Vector3 mTranslateVector;//移动的向量
        bool mMoveFwd;//前移
        bool mMoveBck;//后移
        bool mMoveLeft;//左移
        bool mMoveRight;//右移

        bool mLMBDown;//鼠标左键按下
        bool mRMBDown;//鼠标右键按下
        CEGUI:oint mLastMousePosition;//鼠标的位置
        bool mLastMousePositionSet;//处理鼠标位置设置

        float mRotX;//旋转X轴
        float mRotY;//旋转Y轴
        //float mRotScale ;//旋转速度

        bool mProcessMovement;//是键盘引起的移动否
        bool mUpdateMovement;//是鼠标引起的移动否

        std::string mDebugText;

        CEGUI::MouseButton convertOISButtonToCegui(int ois_button_id);
        void CheckMovementKeys( CEGUI::Key::Scan keycode, bool state );//检测键盘是否被按下
        void updateStats(void);

        bool mQuit;
public:
        MyOgreDemo_FrameListener(MyOgreDemo* main);
        virtual ~MyOgreDemo_FrameListener();
        bool frameStarted(const Ogre::FrameEvent& evt);
        bool Exit(const CEGUI::EventArgs &e)
        {
                mQuit = true;
                return true;
        }
        virtual bool keyPressed ( const OIS::KeyEvent &arg );
        virtual bool keyReleased ( const OIS::KeyEvent &arg );

        virtual bool mouseMoved ( const OIS::MouseEvent &arg );
        virtual bool mousePressed ( const OIS::MouseEvent &arg, OIS::MouseButtonID id );
        virtual bool mouseReleased ( const OIS::MouseEvent &arg, OIS::MouseButtonID id );

        bool handleKeyDownEvent(const CEGUI::EventArgs& e);//键盘按键按下但未弹起事件
        bool handleKeyUpEvent(const CEGUI::EventArgs& e);//键盘按键按下后已经弹起事件
        bool handleMouseMove(const CEGUI::EventArgs& e);//鼠标移动事件
        bool handleMouseButtonUp(const CEGUI::EventArgs& e);//鼠标按下后已经弹起事件
        bool handleMouseButtonDown(const CEGUI::EventArgs& e);//鼠标按下但未弹起事件
        bool handleMouseWheelEvent(const CEGUI::EventArgs& e);//鼠标滚轮移动事件

        MovementType        mMouseMovement;//键盘控制的移动物体类型
        MovementType    getMouseMovement(void) const { return mMouseMovement; }
};

class MyOgreDemo
{
public:
        MyOgreDemo(void);
        ~MyOgreDemo(void);

        void go(void);
        Ogre::Camera* getCamera(void) const { return mCamera; }
        Ogre::SceneManager* getSceneManager(void) const { return mSceneMgr; }
        Ogre::RenderWindow* getRenderWindow(void) const { return mWindow; }
protected:
        Ogre::Root*                          mRoot;
        Ogre::Camera*                  mCamera;
        Ogre::SceneManager*          mSceneMgr;
        // the scene node of the entity
        Ogre::SceneNode*          mMainNode;

        ExampleLoadingBar mLoadingBar;

        MyOgreDemo_FrameListener* mFrameListener;
        Ogre::RenderWindow*          mWindow;
        CEGUI::OgreCEGUIRenderer*    mGUIRenderer;
        CEGUI::System*        mGUISystem;       

        // These internal methods package up the stages in the startup process       
        //以下这些内在的函数方法包含了在初始化过程中不同时期的状态。
    //setup函数初始化程序
        bool setup(void);

        /** 配置程序的环境. */
        bool configure(void);
        void chooseSceneManager(void);
        void createCamera(void);
        void createViewports(void);

        /// Method which will define the source of resources (other than current folder)
        //定位资源的出处(不仅仅是当前目录)
        void setupResources(void);
        void loadResources(void);
        bool setupGUI(void);
        void createScene(void);
        void createFrameListener(void);

        void initDemoEventWiring(void);//注册事件响应函数
};


#endif        // end _MyOgreDemo_H_

18

主题

78

帖子

165

积分

注册会员

Rank: 2

积分
165
 楼主| 发表于 2008-3-17 20:37:00 | 显示全部楼层

Re:我用OGRE自带的例子程序Demo_Ocean的框架结构,加不了地面

怎么办,没有思路了?sos

10

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2008-3-18 14:17:00 | 显示全部楼层

Re:我用OGRE自带的例子程序Demo_Ocean的框架结构,加不了地面

我也遇到过,不过后发现了问题:
修改默认的场景管理器类型;

18

主题

78

帖子

165

积分

注册会员

Rank: 2

积分
165
 楼主| 发表于 2008-3-18 20:42:00 | 显示全部楼层

Re:我用OGRE自带的例子程序Demo_Ocean的框架结构,加不了地面

修改了
   1。 起初怀疑是void chooseSceneManager(void);这个函数的创建管理器选择错误:
原来是: //mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC, "ExampleSMInstance");
后来改为: mSceneMgr = mRoot->createSceneManager("TerrainSceneManager");
还是不行。

请各位赐教!

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2008-9-28 15:48:00 | 显示全部楼层

Re:我用OGRE自带的例子程序Demo_Ocean的框架结构,加不了地面

mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 05:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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