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
原文地址:https://www.cnblogs.com/kirito/p/3084707.html