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. Thêm các file như sau.
GF.h
Tác dụng include tất cả các header của FrameWork.Visual C++ Code:
/*------------------------------------------------------- -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 -------------------------------------------------------*/
gfCore.h
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.Visual C++ Code:
/*------------------------------------------------------- -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 -------------------------------------------------------*/
gfCore.cpp
Chỗ method Init() chưa hợp lý lắm nhỉVisual C++ Code:
/*------------------------------------------------------- -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 -------------------------------------------------------*/, game loop nhẽ ra phải ở Core chứ không phải ở Render_Manager
. 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
.
Main.cpp
Visual C++ Code:
/*------------------------------------------------------- -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. OOP là tốt nhưng không nên mù quáng, chỗ nào cũng OOP
.
Đí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). 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.
Đã được chỉnh sửa lần cuối bởi NamVoDang : 19-10-2008 lúc 09:02 AM.
Phá toái hư không - Bạch nhật thăng thiên.
Ok, như người ta thường nói, cái gì mà "một khi đã máu lên" ấy nhỉ?. Thôi không nhớ.
Quyết định không viết game framework nữa, mà nâng cấp nó thành game engine.
Từ đó tên cũng phải đổi từ GF(Game FrameWork) sang GF Engine(Guardian Force Game Engine).
Ok biết là hâm, nhưng đã hâm thì hâm cho trót. GameEngine này dự định là tập hợp của mấy cái Free và OpenSource dưới một API chung duy nhất, có ngĩa là từ physic, render, GUI,.... đều chung API tất. Người dùng có thể tùy chọn xem dùng cái gì khi chạy game. Ogre hoặc Irrlicht. ODE hoặc Newton(con này không open). CEGUI hay V.v... OIS hay V.v...
Project đã bắt đầu từ chiều nay. Với Leader NamVoDang(cũng là thành viên duy nhất).
http://code.google.com/p/gfengine/
Hy vọng nó sống được vài tháng, đừng die xớm quá
.
Phá toái hư không - Bạch nhật thăng thiên.