zoukankan      html  css  js  c++  java
  • irrlicht1.7.0(2):基础接口

    IEventReceiver.h

    定义了irrlicht引擎中的事件类型(struct SEvent)和事件接口(class IEventReceiver)

     1 struct SEvent
     2 {
     3     EEVENT_TYPE EventType;
     4     union
     5     {
     6         struct SGUIEvent GUIEvent;          //UI响应事件
     7         struct SMouseInput MouseInput;        //鼠标输入事件
     8         struct SKeyInput KeyInput;          //键盘输入事件
     9         struct SJoystickEvent JoystickEvent;    //控制杆输入事件
    10         struct SLogEvent LogEvent;          //日志事件
    11         struct SUserEvent UserEvent;         //用户自定义事件
    12     };
    13 //! irrlicht用户自定义事件使用的是两个整型
    14 //! 通过转型可以用作指针和其他类型
    15 struct SUserEvent
    16 {
    17     //! Some user specified data as int
    18     s32 UserData1;
    19 
    20     //! Another user specified data as int
    21     s32 UserData2;
    22 };
    23 };
    View Code

    ILogger.h

    提供了简单的日志输出接口,并定义了日志消息的级别。

    IOSOperator.h

    提供了简单获取操作系统信息的接口。

     1 class IOSOperator : public virtual IReferenceCounted
     2 {
     3 public:
     4 
     5     //! Destructor
     6     virtual ~IOSOperator() {}
     7 
     8     //! 去的操作系统版本(含操作系统名)
     9     virtual const wchar_t* getOperationSystemVersion() const = 0;
    10 
    11     //! 把text信息复制到剪贴板
    12     virtual void copyToClipboard(const c8* text) const = 0;
    13 
    14     //! 从剪贴板获取信息
    15     virtual const c8* getTextFromClipboard() const = 0;
    16 
    17     //! 获取处理器处理速度
    18     virtual bool getProcessorSpeedMHz(u32* MHz) const = 0;
    19 
    20     //! 获取机器内存总数和可用内存数
    21     virtual bool getSystemMemory(u32* Total, u32* Avail) const = 0;
    22 
    23 };
    View Code

    //因为本人没有这方面的知识所以先看一下如何实现(COSOperator.h和COSOperator.cpp)

    COSOperator.h
    COSOperator.cpp

    IReferenceCounted.h

    普通的引用计数类

     1     class IReferenceCounted
     2     {
     3     public:
     4 
     5         //! Constructor.
     6         IReferenceCounted()
     7             : DebugName(0), ReferenceCounter(1)
     8         {
     9         }
    10 
    11         //! Destructor.
    12         virtual ~IReferenceCounted()
    13         {
    14         }
    15 
    16         void grab() const { ++ReferenceCounter; }
    17 
    18         
    19         bool drop() const
    20         {
    21             // someone is doing bad reference counting.
    22             _IRR_DEBUG_BREAK_IF(ReferenceCounter <= 0)
    23 
    24             --ReferenceCounter;
    25             if (!ReferenceCounter)
    26             {
    27                 delete this;
    28                 return true;
    29             }
    30 
    31             return false;
    32         }
    33 
    34         s32 getReferenceCount() const
    35         {
    36             return ReferenceCounter;
    37         }
    38 
    39         const c8* getDebugName() const
    40         {
    41             return DebugName;
    42         }
    43 
    44     protected:
    45 
    46         //! Sets the debug name of the object.
    47         /** The Debugname may only be set and changed by the object
    48         itself. This method should only be used in Debug mode.
    49         \param newName: New debug name to set. */
    50         void setDebugName(const c8* newName)
    51         {
    52             DebugName = newName;
    53         }
    54 
    55     private:
    56 
    57         const c8* DebugName;
    58 
    59         mutable s32 ReferenceCounter;
    60     };
    View Code

    ps:引用计数应设为mutable(const状态下仍可变),ReferenceCounter应为整型指针或把复制函数和复制构造函数设为私有防止复制以避免类复制后引用计数不同步(即使irrlicht仅提供接口,但难以避免用户继承并实现接口导致引用计数问题)

    irrlicht.h

    包含所有接口和常量定义

    IrrlichtDevice.h

    //控制游戏运行和窗口的接口

     1 class IrrlichtDevice : public virtual IReferenceCounted
     2     {
     3     public:
     4      //控制游戏主线程
     5         virtual bool run() = 0;
     6         virtual void yield() = 0;
     7         virtual void sleep(u32 timeMs, bool pauseTimer=false) = 0;
     8 
     9      //取得各种组件
    10         virtual video::IVideoDriver* getVideoDriver() = 0;
    11         virtual io::IFileSystem* getFileSystem() = 0;
    12         virtual gui::IGUIEnvironment* getGUIEnvironment() = 0;
    13         virtual scene::ISceneManager* getSceneManager() = 0;
    14         virtual gui::ICursorControl* getCursorControl() = 0;
    15         virtual ILogger* getLogger() = 0;
    16         virtual video::IVideoModeList* getVideoModeList() = 0;
    17         virtual IOSOperator* getOSOperator() = 0;
    18         virtual ITimer* getTimer() = 0;
    19 
    20      //控制游戏窗口
    21         virtual void setWindowCaption(const wchar_t* text) = 0;
    22         virtual bool isWindowActive() const = 0;
    23         virtual bool isWindowFocused() const = 0;
    24         virtual bool isWindowMinimized() const = 0;
    25         virtual bool isFullscreen() const = 0;
    26      virtual void setResizable(bool resize=false) = 0;
    27      virtual void minimizeWindow() =0;
    28      virtual void maximizeWindow() =0;
    29      virtual void restoreWindow() =0;
    30     //控制消息循环
    31     virtualvoid setEventReceiver(IEventReceiver* receiver) = 0;
    32     virtual IEventReceiver* getEventReceiver() = 0;
    33     virtual bool postEventFromUser(const SEvent& event) = 0;
    34     virtual void setInputReceivingSceneManager(scene::ISceneManager* sceneManager) = 0;
    35     virtual void clearSystemMessages() = 0;
    36      //控制常规信息
    37      virtual video::ECOLOR_FORMAT getColorFormat() const = 0;
    38      virtualvoid closeDevice() = 0;
    39      virtual const c8* getVersion() const = 0;
    40      virtual bool activateJoysticks(core::array<SJoystickInfo>& joystickInfo) =0;
    41         //控制屏幕gamma值
    42      virtual bool setGammaRamp(f32 red, f32 green, f32 blue,
    43                     f32 relativebrightness, f32 relativecontrast) =0;
    44         virtual bool getGammaRamp(f32 &red, f32 &green, f32 &blue,
    45                     f32 &brightness, f32 &contrast) =0;
    46         virtual E_DEVICE_TYPE getType() const = 0;
    47         static bool isDriverSupported(video::E_DRIVER_TYPE driver)
    48         {
    49             switch (driver)
    50             {
    51                 case video::EDT_NULL:
    52                     return true;
    53                 case video::EDT_SOFTWARE:
    54 #ifdef _IRR_COMPILE_WITH_SOFTWARE_
    55                     return true;
    56 #else
    57                     return false;
    58 #endif
    59                 case video::EDT_BURNINGSVIDEO:
    60 #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_
    61                     return true;
    62 #else
    63                     return false;
    64 #endif
    65                 case video::EDT_DIRECT3D8:
    66 #ifdef _IRR_COMPILE_WITH_DIRECT3D_8_
    67                     return true;
    68 #else
    69                     return false;
    70 #endif
    71                 case video::EDT_DIRECT3D9:
    72 #ifdef _IRR_COMPILE_WITH_DIRECT3D_9_
    73                     return true;
    74 #else
    75                     return false;
    76 #endif
    77                 case video::EDT_OPENGL:
    78 #ifdef _IRR_COMPILE_WITH_OPENGL_
    79                     return true;
    80 #else
    81                     return false;
    82 #endif
    83                 default:
    84                     return false;
    85             }
    86         }
    87     };
    View Code

    ITimer.h

    //控制游戏的时间类(irrlicht缺少一个时钟事件)

    //构想:以一个真实时钟作为游戏运行的主时钟,在主时钟上可以套接多个自定义时钟(拥有一个主时钟指针,来共享主时钟循环)

     1 class ITimer : public virtual IReferenceCounted
     2 {
     3 public:
     4 
     5     //! destructor
     6     virtual ~ITimer() {}
     7 
     8     virtual u32 getRealTime() const = 0;
     9 
    10     virtual u32 getTime() const = 0;
    11 
    12     virtual void setTime(u32 time) = 0;
    13 
    14     virtual void stop() = 0;
    15 
    16     virtual void start() = 0;
    17 
    18     virtual void setSpeed(f32 speed = 1.0f) = 0;
    19 
    20     virtual f32 getSpeed() const = 0;
    21 
    22     virtual bool isStopped() const = 0;
    23 
    24     virtual void tick() = 0;
    25 };
    View Code

    Keycodes.h

    //定义了irrlicht的虚拟键

    SIrrCreationParameters.h

    //定义了创建irrDevice所需要的属性和默认值

      1 struct SIrrlichtCreationParameters
      2     {
      3         //! Constructs a SIrrlichtCreationParameters structure with default values.
      4         SIrrlichtCreationParameters() :
      5             DeviceType(EIDT_BEST),
      6             DriverType(video::EDT_BURNINGSVIDEO),
      7             WindowSize(core::dimension2d<u32>(800, 600)),
      8             Bits(16),
      9             ZBufferBits(16),
     10             Fullscreen(false),
     11             Stencilbuffer(false),
     12             Vsync(false),
     13             AntiAlias(0),
     14             WithAlphaChannel(false),
     15             Doublebuffer(true),
     16             IgnoreInput(false),
     17             Stereobuffer(false),
     18             HighPrecisionFPU(false),
     19             EventReceiver(0),
     20             WindowId(0),
     21             LoggingLevel(ELL_INFORMATION),
     22             SDK_version_do_not_use(IRRLICHT_SDK_VERSION)
     23         {
     24         }
     25 
     26         SIrrlichtCreationParameters(const SIrrlichtCreationParameters& other) :
     27             SDK_version_do_not_use(IRRLICHT_SDK_VERSION)
     28         {*this = other;}
     29 
     30         SIrrlichtCreationParameters& operator=(const SIrrlichtCreationParameters& other)
     31         {
     32             DeviceType = other.DeviceType;
     33             DriverType = other.DriverType;
     34             WindowSize = other.WindowSize;
     35             Bits = other.Bits;
     36             ZBufferBits = other.ZBufferBits;
     37             Fullscreen = other.Fullscreen;
     38             Stencilbuffer = other.Stencilbuffer;
     39             Vsync = other.Vsync;
     40             AntiAlias = other.AntiAlias;
     41             WithAlphaChannel = other.WithAlphaChannel;
     42             Doublebuffer = other.Doublebuffer;
     43             IgnoreInput = other.IgnoreInput;
     44             Stereobuffer = other.Stereobuffer;
     45             HighPrecisionFPU = other.HighPrecisionFPU;
     46             EventReceiver = other.EventReceiver;
     47             WindowId = other.WindowId;
     48             LoggingLevel = other.LoggingLevel;
     49             return *this;
     50         }
     51 
     52         //! Type of the device.
     53         /** This setting decides the windowing system used by the device, most device types are native
     54         to a specific operating system and so may not be available.
     55         EIDT_WIN32 is only available on Windows desktops,
     56         EIDT_WINCE is only available on Windows mobile devices,
     57         EIDT_COCOA is only available on Mac OSX,
     58         EIDT_X11 is available on Linux, Solaris, BSD and other operating systems which use X11,
     59         EIDT_SDL is available on most systems if compiled in,
     60         EIDT_CONSOLE is usually available but can only render to text,
     61         EIDT_BEST will select the best available device for your operating system.
     62         Default: EIDT_BEST. */
     63         E_DEVICE_TYPE DeviceType;
     64 
     65         //! Type of video driver used to render graphics.
     66         /** This can currently be video::EDT_NULL, video::EDT_SOFTWARE,
     67         video::EDT_BURNINGSVIDEO, video::EDT_DIRECT3D8,
     68         video::EDT_DIRECT3D9, and video::EDT_OPENGL.
     69         Default: Software. */
     70         video::E_DRIVER_TYPE DriverType;
     71 
     72         //! Size of the window or the video mode in fullscreen mode. Default: 800x600
     73         core::dimension2d<u32> WindowSize;
     74 
     75         //! Minimum Bits per pixel of the color buffer in fullscreen mode. Ignored if windowed mode. Default: 16.
     76         u8 Bits;
     77 
     78         //! Minimum Bits per pixel of the depth buffer. Default: 16.
     79         u8 ZBufferBits;
     80 
     81         //! Should be set to true if the device should run in fullscreen.
     82         /** Otherwise the device runs in windowed mode. Default: false. */
     83         bool Fullscreen;
     84 
     85         //! Specifies if the stencil buffer should be enabled.
     86         /** Set this to true, if you want the engine be able to draw
     87         stencil buffer shadows. Note that not all drivers are able to
     88         use the stencil buffer, hence it can be ignored during device
     89         creation. Without the stencil buffer no shadows will be drawn.
     90         Default: false. */
     91         bool Stencilbuffer;
     92 
     93         //! Specifies vertical syncronisation.
     94         /** If set to true, the driver will wait for the vertical
     95         retrace period, otherwise not. May be silently ignored.
     96         Default: false */
     97         bool Vsync;
     98 
     99         //! Specifies if the device should use fullscreen anti aliasing
    100         /** Makes sharp/pixelated edges softer, but requires more
    101         performance. Also, 2D elements might look blurred with this
    102         switched on. The resulting rendering quality also depends on
    103         the hardware and driver you are using, your program might look
    104         different on different hardware with this. So if you are
    105         writing a game/application with AntiAlias switched on, it would
    106         be a good idea to make it possible to switch this option off
    107         again by the user.
    108         The value is the maximal antialiasing factor requested for
    109         the device. The cretion method will automatically try smaller
    110         values if no window can be created with the given value.
    111         Value one is usually the same as 0 (disabled), but might be a
    112         special value on some platforms. On D3D devices it maps to
    113         NONMASKABLE.
    114         Default value: 0 - disabled */
    115         u8 AntiAlias;
    116 
    117         //! Whether the main framebuffer uses an alpha channel.
    118         /** In some situations it might be desireable to get a color
    119         buffer with an alpha channel, e.g. when rendering into a
    120         transparent window or overlay. If this flag is set the device
    121         tries to create a framebuffer with alpha channel.
    122         If this flag is set, only color buffers with alpha channel
    123         are considered. Otherwise, it depends on the actual hardware
    124         if the colorbuffer has an alpha channel or not.
    125         Default value: false */
    126         bool WithAlphaChannel;
    127 
    128         //! Whether the main framebuffer uses doublebuffering.
    129         /** This should be usually enabled, in order to avoid render
    130         artifacts on the visible framebuffer. However, it might be
    131         useful to use only one buffer on very small devices. If no
    132         doublebuffering is available, the drivers will fall back to
    133         single buffers. Default value: true */
    134         bool Doublebuffer;
    135 
    136         //! Specifies if the device should ignore input events
    137         /** This is only relevant when using external I/O handlers.
    138         External windows need to take care of this themselves.
    139         Currently only supported by X11.
    140         Default value: false */
    141         bool IgnoreInput;
    142 
    143         //! Specifies if the device should use stereo buffers
    144         /** Some high-end gfx cards support two framebuffers for direct
    145         support of stereoscopic output devices. If this flag is set the
    146         device tries to create a stereo context.
    147         Currently only supported by OpenGL.
    148         Default value: false */
    149         bool Stereobuffer;
    150 
    151         //! Specifies if the device should use high precision FPU setting
    152         /** This is only relevant for DirectX Devices, which switch to
    153         low FPU precision by default for performance reasons. However,
    154         this may lead to problems with the other computations of the
    155         application. In this case setting this flag to true should help
    156         - on the expense of performance loss, though.
    157         Default value: false */
    158         bool HighPrecisionFPU;
    159 
    160         //! A user created event receiver.
    161         IEventReceiver* EventReceiver;
    162 
    163         //! Window Id.
    164         /** If this is set to a value other than 0, the Irrlicht Engine
    165         will be created in an already existing window. For windows, set
    166         this to the HWND of the window you want. The windowSize and
    167         FullScreen options will be ignored when using the WindowId
    168         parameter. Default this is set to 0.
    169         To make Irrlicht run inside the custom window, you still will
    170         have to draw Irrlicht on your own. You can use this loop, as
    171         usual:
    172         \code
    173         while (device->run())
    174         {
    175             driver->beginScene(true, true, 0);
    176             smgr->drawAll();
    177             driver->endScene();
    178         }
    179         \endcode
    180         Instead of this, you can also simply use your own message loop
    181         using GetMessage, DispatchMessage and whatever. Calling
    182         IrrlichtDevice::run() will cause Irrlicht to dispatch messages
    183         internally too.  You need not call Device->run() if you want to
    184         do your own message dispatching loop, but Irrlicht will not be
    185         able to fetch user input then and you have to do it on your own
    186         using the window messages, DirectInput, or whatever. Also,
    187         you'll have to increment the Irrlicht timer.
    188         An alternative, own message dispatching loop without
    189         device->run() would look like this:
    190         \code
    191         MSG msg;
    192         while (true)
    193         {
    194             if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    195             {
    196                 TranslateMessage(&msg);
    197                 DispatchMessage(&msg);
    198 
    199                 if (msg.message == WM_QUIT)
    200                     break;
    201             }
    202 
    203             // increase virtual timer time
    204             device->getTimer()->tick();
    205 
    206             // draw engine picture
    207             driver->beginScene(true, true, 0);
    208             smgr->drawAll();
    209             driver->endScene();
    210         }
    211         \endcode
    212         However, there is no need to draw the picture this often. Just
    213         do it how you like. */
    214         void* WindowId;
    215 
    216         //! Specifies the logging level used in the logging interface.
    217         /** The default value is ELL_INFORMATION. You can access the ILogger interface
    218         later on from the IrrlichtDevice with getLogger() and set another level.
    219         But if you need more or less logging information already from device creation,
    220         then you have to change it here.
    221         */
    222         ELOG_LEVEL LoggingLevel;
    223 
    224         //! Don't use or change this parameter.
    225         /** Always set it to IRRLICHT_SDK_VERSION, which is done by default.
    226         This is needed for sdk version checks. */
    227         const c8* const SDK_version_do_not_use;
    228     };
    View Code
  • 相关阅读:
    列表组件抽象(5)-简洁易用的表格组件
    列表组件抽象(4)-滚动列表及分页说明
    列表组件抽象(3)-分页和排序管理说明
    列表组件抽象(2)-listViewBase说明
    列表组件抽象(1)-概述
    简单实用的进度条加载组件loader.js
    简单封装分页功能pageView.js
    为什么不能用速度与时间的关系去实现动画
    java开发面试题目及答案(持续更新)
    Java Web目前主流比较成熟的框架以及正在兴起的框架
  • 原文地址:https://www.cnblogs.com/kirito/p/3084707.html
Copyright © 2011-2022 走看看