Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 2 của 2
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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 FreeOpenSource 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á .

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    GF GameFrameWork đơn giản cho dân gà.

    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].

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •