Chào!.
Một chủ nhật mát mẻ, không trăng không sao(đang là buổi sáng).
Mình định viết tiếp cái bài hướng dẫn cơ bản về Ogre. Nhưng chợt nhận ra rằng cái bài đó đã quá dài và lằng nhằng, bây giờ lại code tiếp vào đấy nữa thì...
Đã làm thì làm cho chót, chơi hẳn cái FrameWork cho gọn.
Tạo một foder mới ở đâu đó, với tên gì đó. Trong foder đó tạo 2 foder con là Inc và Src(include và source).
Mở VC++2005 or 2008. 2003 trở xuống lởm không chơi. Chọn File->New->Project From Existing Code..., Next -> Ra một cái bảng như sau.
Tên project thích đặt là gì thì tùy, Next, Next -> Ra một cái bảng như sau.
Rồi finish. Được một project mới [IMG]images/smilies/biggrin.png[/IMG]. Thêm các file như sau.
GF.h
Mã:
/*------------------------------------------------------- -Public Header -GF.h -Create by NamVoDang-------------------------------------------------------*/ #pragma once/*------------------------------------------------------- -Public Header include-------------------------------------------------------*/#include "gfCore.h"#include "gfRenderManager.h"#include "gfPhysicManager.h"#include "gfInputManager.h"#include "gfGUIManager.h"/*------------------------------------------------------- -Library include-------------------------------------------------------*/#include <Ogre.h>#include <ODE/ODE.h>#include <OIS/OIS.h>#include <CEGUI/CEGUI.h> /*------------------------------------------------------- -End-------------------------------------------------------*/
Tác dụng include tất cả các header của FrameWork.
gfCore.h
Mã:
/*------------------------------------------------------- -Public Header -GF.h -Create by NamVoDang-------------------------------------------------------*/ #pragma once/*------------------------------------------------------- -Public Header include-------------------------------------------------------*/#include "gfCore.h"#include "gfRenderManager.h"#include "gfPhysicManager.h"#include "gfInputManager.h"#include "gfGUIManager.h" namespace GF{ class Core { private: static Core Singleton; public: static Core& GetInstance(); static Core* GetInstancePtr(); private: /// Private constuctor Core(); public: ~Core(); private: RenderManager * Render_Manager; InputManager * Input_Manager; PhysicManager * Physic_Manager; GUIManager * GUI_Manager; public: RenderManager * GetRenderManager() const ; InputManager * GetInputManager() const ; GUIManager * GetGUIManager() const ; PhysicManager * GetPhysicManager() const ; public: /// Startup framework void Init(); };} /*------------------------------------------------------- -End-------------------------------------------------------*/
Không có gì đặc biệt, nó là một lớp được tạo duy nhất một thể hiện Singleton. Phụ trách việc tạo và cung cấp các manager.
gfCore.cpp
Mã:
/*------------------------------------------------------- -Header include-------------------------------------------------------*/#include "gfCore.h" namespace GF{ /// Static init Core Core::Singleton = Core(); //--------------------------------------------------- Core& Core::GetInstance() { return Singleton; } //--------------------------------------------------- Core* Core::GetInstancePtr() { return &Singleton; } //--------------------------------------------------- Core::Core() { /// Set null for all pointer Render_Manager = 0; Input_Manager = 0; GUI_Manager = 0; Physic_Manager = 0; } //--------------------------------------------------- Core::~Core() { /// Safe delete all manager if(Physic_Manager) delete Physic_Manager; if(GUI_Manager) delete GUI_Manager; if(Input_Manager) delete Input_Manager; if(Render_Manager) delete Render_Manager; } //--------------------------------------------------- void Core::Init() { /// Create all manager, exit if one component fail Render_Manager = new RenderManager(); if(!Render_Manager->Init()) return; Input_Manager = new InputManager(); if(!Input_Manager->Init()) return; GUI_Manager = new GUIManager(); if(!GUI_Manager->Init()) return; Physic_Manager = new PhysicManager(); if(!Physic_Manager->Init()) return; /// Begin game loop Render_Manager->Loop(); } //--------------------------------------------------- RenderManager * Core::GetRenderManager() const { return Render_Manager; } //--------------------------------------------------- InputManager * Core::GetInputManager() const { return Input_Manager; } //--------------------------------------------------- GUIManager * Core::GetGUIManager() const { return GUI_Manager; } //--------------------------------------------------- PhysicManager * Core::GetPhysicManager() const { return Physic_Manager; }} /*------------------------------------------------------- -End-------------------------------------------------------*/
Chỗ method Init() chưa hợp lý lắm nhỉ [IMG]images/smilies/dont_know.gif[/IMG] , game loop nhẽ ra phải ở Core chứ không phải ở Render_Manager [IMG]images/smilies/biggrin.png[/IMG]. Nhưng tại ku Ogre do thằng Render_Manager nó giữ nên đành thế. Tại không có time, có time viết lại phần loop của nó thì hợp lý hơn [IMG]images/smilies/Cry.gif[/IMG] .
Main.cpp
Mã:
/*------------------------------------------------------- -Entry point -Main.cpp -Create by NamVoDang-------------------------------------------------------*/ /*------------------------------------------------------- -Windows SDK include-------------------------------------------------------*/#include <windows.h>/*------------------------------------------------------- -GF include-------------------------------------------------------*/#include <GF.h> INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ){ try { /// Init frame work GF::Core::GetInstance().Init(); return 0; } catch(Ogre::Exception& e) { MessageBox(NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); } catch(CEGUI::Exception& e) { MessageBox(NULL, e.getMessage().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); } catch (std::exception& e) { MessageBox(NULL, e.what(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); } return 1;/// Fail} /*------------------------------------------------------- -End-------------------------------------------------------*/
Ok, tạm thời thế đã, implement chi tiết của các manager post sau.
Mà lúc đầu định làm một cái abstract class Manager để cho mấy cái manager nó kế thừa nhưng sau lại thôi, vì chả có ích lợi gì cả. Chỉ tổ dài code [IMG]images/smilies/dont_know.gif[/IMG] . OOP là tốt nhưng không nên mù quáng, chỗ nào cũng OOP [IMG]images/smilies/biggrin.png[/IMG].
Đính kèm project bên dưới, constructor của các manager mình đều để private vì nó chỉ nên được tạo bởi Core(Core là friend class [IMG]images/smilies/biggrin.png[/IMG]). Còn Core cũng để private nốt vì nó chỉ có mỗi một thể hiện Singleton;
http://www.mediafire.com/?ghk2m0jdxh2
P/S: Tự ngĩ, tự viết, không phải dịch, không phải chép, lần đầu tiên post [IMG]images/smilies/biggrin.png[/IMG].
Thông qua phân tích dữ liệu Google từ 86 quốc gia, mới đây, một công ty tại Anh đã công bố bảng xếp hạng kích tấc "cậu nhỏ" của các nước trên thế giới. Kết quả, hầu hết các nước xếp ở nhóm đầu của...
"Chim" của chàng trai Việt thuộc...