-
19-09-2008, 05:15 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Ogre, Lập trình game với Ogre graphic engine
Homepage: ogre3d.org
Là một trong 2 ông vua của graphic engine mã nguồn mở.
Ogre và Irrlicht.
Ông vua thứ hai Irrlicht thì đã được bạn Trần Đức Huy(hay Huy đọt nét, huytd gì đấy, lắm nick thế ko biết) giới thiệu rồi. Bây giờ mình sẽ giới thiệu với các bạn về ông vua thứ nhất. OGRE.
Hiện tại đã có phiên bản 1.6(khiếp, nó lên như ăn cướp, mới hôm nào 1.48, 1.49. Chú Irrlicht thì vẫn dậm chân tại chỗ 1.4.9 từ hôm nảo hôm nào )
Download
(mình sẽ hướng dẫn trên Visual C++ 2005 Express nên các bạn nên down phiên bản cho Visual C++ 2005 Express SP1 [IMG]images/smilies/biggrin.png[/IMG].
Sau khi down SDK của nó về thì cài thôi [IMG]images/smilies/biggrin.png[/IMG].
Sau khi cài thì bạn tạo một project mới(win32 console, emty project).
Add 1 cái header và 2 cái CPP code cho nó OOP nào [IMG]images/smilies/biggrin.png[/IMG].
Game.h
Mã:#ifndef _Game_H_#define _Game_H_ class Game{public: Game(); ~Game();public: void Run();}; #endif
Mã:#include "Game.h" Game::Game(){} Game::~Game(){} void Game::Run(){}
Mã:#include "Game.h" int main(){ Game game; game.Run(); return 0;}
Bây giờ ta link cái OgreMain.lib và include cái Ogre.h. Những thứ cần thiết cho một chương trình sử dụng Ogre đơn giản.
Thêm đoạn sau vào file Game.h
Mã://! Sau #define _Game_H_ #include <Ogre.h>#pragma comment(lib,"OgreMain.lib")
Mã://!Sau #pragma comment(lib,"OgreMain.lib")#pragma comment(lib,"User32.lib")
View more random threads:
- Dịch Vụ Cài Phần Mềm AutoCad Nhanh Chóng Quận 2 Tận Nơi
- TLS Callback in VC++
- Sử dụng DLL files trong Visual C++ 2005
- Screen Reader Visual C++ | Đọc nội dung trên màn hình viết bằng VC++
- Cách tạo thư viện DLL trong VC++ 6.0
- [Dịch] So sánh sự tối ưu compile giữa VC++ 2010 và DEV C++
- Hướng dẫn thao tác với FTP server theo cách thủ công
- Tìm hiểu về từ khóa const - const với nhiều ý nghĩa
- GF GameFrameWork đơn giản cho dân gà.
- Lập trình mạng trong Visual C++ 6, xây dựng ứng dụng client server đơn giản
-
19-09-2008, 06:03 PM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Hãy chắc chắn là bạn đã build được cái bên trên(thằng này build lâu kinh khủng luôn [IMG]images/smilies/dont_know.gif[/IMG] ).
Có một cái sơ đồ to vật trong manual của nó nhưng NVD thấy có đọc bây giờ cũng ứ hiểu gì nên thôi ko đưa lên(học dần rồi sẽ giới thiệu).
The Root object
Dịch thẳng. Cái object này là entry point của Ogre System. Nó PHẢI được tạo đầu tiên và bị khử cuối cùng.
Thêm vào Game một con trỏ kiểu Ogre::Root.
Mã:private: Ogre::Root* Root;
Mã:Root = NULL;Root = new Ogre::Root("plugins.cfg", "ogre.cfg", "Ogre.log");
Rứa rồi thêm vào Destructor của Game.
Mã:if(Root) delete Root;
Bây giờ chúng ta sẽ hiện hộp thoại để người dùng cấu hình game, tạo một cửa sổ tự động và bắt đầu vòng lặp render.
method Run().
Mã:if(!Root) return;//!Error if(!Root->showConfigDialog()) return; Root->initialise(true, "OgreWindow"); Root->startRendering();
Nhưng phần này lại liên quan tới FrameListener nên phải đợi đến phần sau mình nói tiếp, bây giờ phải đi ngủ [IMG]images/smilies/Cry.gif[/IMG] .
Edit: Bạn phải vào C:\OgreSDK\bin
elease copy hết cái mớ hổ lốn của nó vào cùng thư mục của cái project của bạn(lắm của thế).
-
20-09-2008, 01:23 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Cái sơ đồ bự chảng này nếu ko phải dân từng học làm game rồi thì nhìn vào phần lớn là..chả hiểu mô tê gì luôn.
Bây giờ zoom vào cái(trông như cái foder) SceneManagement.
Trong đó gồm các phần sau.
Mã:SceneManagerSceneNodeMovableObject +Entity. +Camera. +Light.
SceneManager làm cái gì?
Tất cả những gì xuất hện trên màn hình được quản lý bởi "trình quản lý cảnh" SceneManager.
MovableObject là cái gì?
Là một trong những thứ xuất hiện trên màn hình. Gồm các loại là Entity, Camera, Light, Billboard(Cái ảnh 2 chiều luôn luôn quay mặt về phía camera), Particle(hệ thống hạt). (Nếu xem source thì sẽ thấy tất cả đều được kế thừa từ MovableObject).
SceneNode là cái gì?
Là cái "nút cảnh" [IMG]images/smilies/biggrin.png[/IMG]. Cứ tưởng tượng như thế này, nó như một điểm trong không gian, nơi mà có một cái gì đó(nhà cửa, cây cối V.v..). Khi di chuyển cái điểm đó thì cái gì đó cũng đi theo luôn, nói chung nó có cấu trúc dạng cây với một cái Node cao nhất là RootSceneNode. Mỗi node lại có các node con của nó. Khi di chuyển một node thì các node con của nó cũng di chuyển theo, khi một node bị xóa thì các node con cũng theo đó mà đi đời(tận trung với chủ ).
Nói mãi rồi, chán vãi. Nhưng thôi nói thêm một đoạn nữa rồi đi vào thực hành cho nó dễ hiểu, học phải đi đôi với hành, các cụ biểu rứa.
RenderWindow?
SceneManager chứa những thứ để render, vậy những thứ đó sẽ được render vào đâu?. Câu trả lời là vào các render target, RenderWindow là một trong số đó(RenderWindow kế thừa từ render target). Đến đây có thể bạn tự hỏi, thế chả render vào window thì vào cái gì?, thằng nói ngu vãi!. Nhưng thực ra thì ngoài render vào một window thì Ogre còn có thể render vào một cái texture nữa. Ví dụ trong game bạn có một cái tivi, bạn sẽ có hai SceneManager, một cái để chứa thế giới nơi mà cái tivi đó được đặt, cái kia chứa những thứ mà cái tivi đó hiển thị, khi đó thì cái scene manager thứ nhất sẽ render ra cửa sổ, thể hiện cái tivi và cái bàn, còn cái scene manager thứ hai sẽ render "thẳng" vào màn hình cái tivi trong game. Vậy là nhân vật của chúng ta có thể ngồi xem tivi như ai.
Viewport?
Cổng nhìn. Các bạn đã chơi game dạng split screen bao giờ chưa?. Need For Speed chẳng hạn. Vấn đề là đôi khi chúng ta không muốn render lên cả một cái window(chỉ một nửa thôi chẳng hạn). Chúng ta có thể có hai cái camera, một cái bám theo người chơi số một, cái còn lại bám theo người chơi số hai. Và mỗi nửa màn hình sẽ vẽ một camera. Khái niệm viewport được đưa vào, viewport là một phần trên render target, nơi mà ta có thể render vào đó.
Vậy cuối cùng chúng ta có các bước để render một cảnh từ SceneManager ra RenderWindow như sau.
B1.Tạo một cái window, trên cái window đó lại tạo một viewport.
B2. Tạo một scene manager, trong scene manager đó lại tạo một camera.
B3. Attach cái camera đó vào viewport, từ bây giờ, mỗi lần loop, viewport trên window sẽ thể hiện những thứ mà camera thấy.
Oáp!. thực hành!
Game.h
Mã:#ifndef _Game_H_#define _Game_H_ #include <Ogre.h>#pragma comment(lib,"OgreMain_d.lib") class Game{public: Game(); ~Game();public: void Run();private: void LoadResource(); void CreateScene();private: Ogre::Root* Root; Ogre::RenderWindow* RenderWindow; Ogre::Camera* Camera;private: Ogre::SceneManager* SceneManager; Ogre::SceneNode* OgreHeadNode; }; #endif
Game.cpp
Mã:#include "Game.h" Game::Game(){ Root = NULL; Root = new Ogre::Root();} Game::~Game(){ if(Root) delete Root;} void Game::Run(){ if(!Root) return;//!Error if(!Root->showConfigDialog()) return; RenderWindow = Root->initialise(true, "OgreWindow");//!Tự động tạo một window có caption là OgreWindow. SceneManager = Root->createSceneManager(Ogre::SceneType::ST_EXTERIOR_REAL_FAR);//!Tạo một scene manager kiểu EXTERIOR_REAL_FAR. Camera = SceneManager->createCamera("ExampleCamera");//!Tạo một camera có tên là ExampleCamera(các camera trong một scene manager ko được trùng tên). Ogre::Viewport* Viewport = RenderWindow->addViewport(Camera);//Thêm một viewport vào window(ở đây chiếm full luôn), và attach cho nó cái camera vừa tạo ở trên. Viewport->setBackgroundColour(Ogre::ColourValue::Black);//!Đặt màu nền cho cái viewport vừa tạo là màu đen. this->LoadResource(); this->CreateScene(); Root->startRendering();//!Begin loop.} void Game::CreateScene(){} void Game::LoadResource()//!Load các resource chỉ định trong file resources.cfg (Đừng quan tâm nó làm thế nào vội){ Ogre::ConfigFile cf; cf.load("resources.cfg"); Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator(); Ogre::String secName, typeName, archName; while (seci.hasMoreElements()) { secName = seci.peekNextKey(); Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext(); Ogre::ConfigFile::SettingsMultiMap::iterator i; for (i = settings->begin(); i != settings->end(); ++i) { typeName = i->first; archName = i->second; Ogre::ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName); } } Ogre::ResourceGroupManager::getSingletonPtr()->initialiseAllResourceGroups();}
Chả có cái gì mà xem , lần này chạy có vẻ lâu hơn lần trước(tại nó phải load mấy cái resource. Nhớ là khi close cái window đó thì game vẫn chạy, bạn phải close cả cái console nữa thì game mới dừng.
Bây giờ thử mần thêm một số trò nữa cho vui cái nào [IMG]images/smilies/biggrin.png[/IMG].
trong method CreateScene()
Mã:Camera->setPosition(200, 0, 0);//!Đặt lại vị trí camera. Camera->lookAt(0, 0, 0);//! Camera nhìn tới gốc tọa độ. SceneManager->setAmbientLight(Ogre::ColourValue(1, 1, 1)); Ogre::Entity* entity = SceneManager->createEntity("OgreHeadMesh", "ogrehead.mesh");//!Tạo một entity có mesh là hình cái đầu(hình như là đầu trâu, chả biết nữa). OgreHeadNode = SceneManager->getRootSceneNode()->createChildSceneNode();//!Tạo một scene node con từ RootSceneNode. OgreHeadNode->setPosition(0, 0, 0);//!Đặt vị trí của cái node này ở gốc tọa độ. OgreHeadNode->attachObject(entity);//!Attach cái đầu ogre vào node vừa tạo.
Bạn có thể ngĩ entity như một cái vật thể 3D được load từ một mesh(định dạng model của Ogre, tạo = các chương trình như 3dsMax hay Maya hay V.v..). Nó có thể là cái đầu trâu như trên, có thể là con cá, nhân vật, hay thảo nguyên mà nhân vật chạy trên đó(một cái mesh siêu lớn). Entity là một MovableObject, và một movableobject chỉ tham gia vào scene khi nó được attach vào một node. bây giờ bạn di chuyển cái OgreHeadNode thì cái đầu ogre cũng di chuyển theo.
Build and run.
Xuất hiện một cái đầu xấu òm trong không gian, nhưng thôi, khởi đầu thế đã, từ từ rồi nó sẽ đẹp dần.
-
21-09-2008, 01:16 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
À! chúng ta tiếp tục.
Trước hết ....bạn nào có acc premium megaupload thì get direct link hộ mình cái này(cắm torrent từ sáng về được 26 % 2kb/s ?) http://www.megaupload.com/?d=KQP8PLKS
Hô hô, giờ vào chuyên môn.
FrameListener
Trong method Run của class Game, bạn để ý dòng cuối cùng, khi mà chúng ta đã khởi tạo engine và add một cái đầu trâu có dòng này.
Mã:Root->startRendering();//!Begin loop.
-Giai đoạn 1. Root gọi method "frameStarted" trên tất cả các frameListener được đăng ký.
-Giai đoạn 2. Xóa màn hình và vẽ cảnh mới(render một khung hình mới).
-Giai đoạn 3. Root gọi method "frameEnded" trên tất cả các frameListener
Chúng ta sẽ can thiệp vào game qua hai giai đoạn. Là "tiền render" và "hậu render"(xài hẳn từ hán-việt cho mấu [IMG]images/smilies/biggrin.png[/IMG]).
Class Ogre::FrameListener.
Mã:class _OgreExport FrameListener { public: virtual bool frameStarted(const FrameEvent& evt) { return true; } virtual bool frameRenderingQueued(const FrameEvent& evt) { return true; } virtual bool frameEnded(const FrameEvent& evt) { return true; } virtual ~FrameListener() {}};
Bây giờ ta sẽ giải quyết vấn đề trong các ví dụ trước, khi close window thì thoát game. Ý tưởng là mỗi lần loop lại kiểm tra trạng thái cái window xem nó close chưa, nếu close rồi thì return false.
Game.h
Mã:class Game: public Ogre::FrameListener //! <---------------Chú ý{public: Game(); ~Game();public: void Run();private: void LoadResource(); void CreateScene();private: Ogre::Root* Root; Ogre::RenderWindow* RenderWindow; Ogre::Camera* Camera;private: Ogre::SceneManager* SceneManager; Ogre::SceneNode* OgreHeadNode;protected: bool frameStarted(const Ogre::FrameEvent &evt);//! <---------------Chú ý bool frameEnded(const Ogre::FrameEvent &evt);//! <---------------Chú ý};
Mã:#include "Game.h" Game::Game(){ Root = NULL; Root = new Ogre::Root();} Game::~Game(){ if(Root) delete Root;} void Game::Run(){ if(!Root) return;//!Error if(!Root->showConfigDialog()) return; RenderWindow = Root->initialise(true, "OgreWindow");//!Tự động tạo một window có caption là OgreWindow. SceneManager = Root->createSceneManager(Ogre::SceneType::ST_EXTERIOR_REAL_FAR);//!Tạo một scene manager kiểu EXTERIOR_REAL_FAR. Camera = SceneManager->createCamera("ExampleCamera");//!Tạo một camera có tên là ExampleCamera(các camera trong một scene manager ko được trùng tên). Ogre::Viewport* Viewport = RenderWindow->addViewport(Camera);//Thêm một viewport vào window(ở đây chiếm full luôn), và attach cho nó cái camera vừa tạo ở trên. Viewport->setBackgroundColour(Ogre::ColourValue::Black);//!Đặt màu nền cho cái viewport vừa tạo là màu đen. this->LoadResource(); this->CreateScene(); Root->addFrameListener(this);//! <-----------------Chú ý Root->startRendering();//!Begin loop.} void Game::CreateScene(){ Camera->setPosition(200, 0, 0);//!Đặt lại vị trí camera. Camera->lookAt(0, 0, 0);//! Camera nhìn tới gốc tọa độ. SceneManager->setAmbientLight(Ogre::ColourValue(1, 1, 1)); Ogre::Entity* entity = SceneManager->createEntity("OgreHeadMesh", "ogrehead.mesh");//!Tạo một entity có mesh là hình cái đầu(hình như là đầu trâu, chả biết nữa). OgreHeadNode = SceneManager->getRootSceneNode()->createChildSceneNode();//!Tạo một scene node con từ RootSceneNode. OgreHeadNode->setPosition(0, 0, 0);//!Đặt vị trí của cái node này ở gốc tọa độ. OgreHeadNode->attachObject(entity);//!Attach cái đầu ogre vào node vừa tạo.} void Game::LoadResource()//!Load các resource chỉ định trong file resources.cfg (Đừng quan tâm nó làm thế nào vội){ Ogre::ConfigFile cf; cf.load("resources.cfg"); Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator(); Ogre::String secName, typeName, archName; while (seci.hasMoreElements()) { secName = seci.peekNextKey(); Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext(); Ogre::ConfigFile::SettingsMultiMap::iterator i; for (i = settings->begin(); i != settings->end(); ++i) { typeName = i->first; archName = i->second; Ogre::ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName); } } Ogre::ResourceGroupManager::getSingletonPtr()->initialiseAllResourceGroups();} bool Game::frameStarted(const Ogre::FrameEvent &evt)//! <-----------------Chú ý{ return true;} bool Game::frameEnded(const Ogre::FrameEvent &evt)//! <-----------------Chú ý{ return true;}
Trong method frameStarted() thêm vào.
Mã:if(RenderWindow->isClosed()) return false;
Các bạn có thể ngịch thêm cho quen với hệ thống này như mỗi giây di chuyển cái đầu Ogre đi n đơn vị lên trên chẳng hạn(trục Y). Coi như làm một bài kiểm tra kiến thức [IMG]images/smilies/biggrin.png[/IMG].
Gợi ý.
struct "evt" trong frameStarted() và frameEnded() có chứa thời gian kể từ lần render trước.
Tiếp sau sẽ là hệ thống Input.
-
21-09-2008, 03:45 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Cho tui hỏi tí là :
- Cái này có cần kiến thức về graphics nhiều không ?
- Trong Orge có sử dụng nhiều macro không ?
- Cảm giác bài đầu tiên thấy mã code rất sáng( pure C++ ), tuy vậy không biết nó có 1 set các container riêng biệt hay ta có thể sử dụng STL container ?
- Cậu có ebook nào về Orge này không ?
ps : Tut viết rất hay và hấp dẫn [IMG]images/smilies/wink.png[/IMG] !
-
21-09-2008, 04:49 PM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi rox_rook
- Trong Orge có sử dụng nhiều macro không ?
không biết nó có 1 set các container riêng biệt hay ta có thể sử dụng STL container ?
Cậu có ebook nào về Orge này không ?
http://forum.gamedev.vn/index.php?showtopic=1259
-
30-09-2008, 10:53 AM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Về cái vấn đề Input. Một sự thật phũ phàng là thằng Ogre này ứ có hệ thống Input (. Ô thế nhưng mà xét lại thì đấy không những không phải nhược điểm mà lại còn là ưu điểm [IMG]images/smilies/biggrin.png[/IMG]. Vì sao?.
Vì ku Ogre này nó quá nổi tiếng, quá hầm hố trong cái vương quốc FOS mà nó đang trị vì. Thế cho nên..thế cho nên rất nhiều các vương hầu quý tộc muốn về dưới trướng của nó. Về phần Input, nó không cần trực tiếp ra tay, mà chỉ đợi thằng khác ra tay hộ [IMG]images/smilies/biggrin.png[/IMG]. Thậm chí, nó được quyền chọn lựa xem nên cho thằng nào ra tay, thằng nào không đủ tuổi [IMG]images/smilies/biggrin.png[/IMG].
Và trong đám chư hầu của nó về phần Input. Đáng chú ý nhất là OIS.
Thằng này đi kèm Ogre khi release luôn, ngĩa là có sẵn trong SDK của nó, khỏi down chi mất công [IMG]images/smilies/biggrin.png[/IMG]. Bây giờ, header Game.h được viết lại như sau.
Mã:#ifndef _Game_H_#define _Game_H_ #include <Ogre.h>#include <OIS/OIS.h>//<---------------Chú ý#pragma comment(lib,"OgreMain_d.lib")#pragma comment(lib,"OIS.lib")//<---------------Chú ý class Game: public Ogre::FrameListener{public: Game(); ~Game();public: void Run();private: void LoadResource(); void CreateScene();private: Ogre::Root* Root; Ogre::RenderWindow* RenderWindow; Ogre::Camera* Camera;private: Ogre::SceneManager* SceneManager; Ogre::SceneNode* OgreHeadNode;protected: bool frameStarted(const Ogre::FrameEvent &evt); bool frameEnded(const Ogre::FrameEvent &evt);private://<---------------Chú ý, từ đây xuống. OIS::Mouse* Mouse; OIS::Keyboard* Keyboard; OIS::InputManager* InputManager;private: void InputCreate(); void InputDestroy(); void InputCapture();}; #endif
Mã:#include "Game.h" Game::Game(){ Root = NULL; Root = new Ogre::Root();} Game::~Game(){ this->InputDestroy();//<---------------Chú ý if(Root) delete Root;} void Game::Run(){ if(!Root) return;//!Error if(!Root->showConfigDialog()) return; RenderWindow = Root->initialise(true, "OgreWindow");//!Tự động tạo một window có caption là OgreWindow. SceneManager = Root->createSceneManager(Ogre::SceneType::ST_EXTERIOR_REAL_FAR);//!Tạo một scene manager kiểu EXTERIOR_REAL_FAR. Camera = SceneManager->createCamera("ExampleCamera");//!Tạo một camera có tên là ExampleCamera(các camera trong một scene manager ko được trùng tên). Ogre::Viewport* Viewport = RenderWindow->addViewport(Camera);//Thêm một viewport vào window(ở đây chiếm full luôn), và attach cho nó cái camera vừa tạo ở trên. Viewport->setBackgroundColour(Ogre::ColourValue::Black);//!Đặt màu nền cho cái viewport vừa tạo là màu đen. this->InputCreate();//<---------------Chú ý this->LoadResource(); this->CreateScene(); Root->addFrameListener(this); Root->startRendering();//!Begin loop.} void Game::CreateScene(){ Camera->setPosition(200, 0, 0);//!Đặt lại vị trí camera. Camera->lookAt(0, 0, 0);//! Camera nhìn tới gốc tọa độ. SceneManager->setAmbientLight(Ogre::ColourValue(1, 1, 1)); Ogre::Entity* entity = SceneManager->createEntity("OgreHeadMesh", "ogrehead.mesh");//!Tạo một entity có mesh là hình cái đầu(hình như là đầu trâu, chả biết nữa). OgreHeadNode = SceneManager->getRootSceneNode()->createChildSceneNode();//!Tạo một scene node con từ RootSceneNode. OgreHeadNode->setPosition(0, 0, 0);//!Đặt vị trí của cái node này ở gốc tọa độ. OgreHeadNode->attachObject(entity);//!Attach cái đầu ogre vào node vừa tạo.} void Game::LoadResource()//!Load các resource chỉ định trong file resources.cfg (Đừng quan tâm nó làm thế nào vội){ Ogre::ConfigFile cf; cf.load("resources.cfg"); Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator(); Ogre::String secName, typeName, archName; while (seci.hasMoreElements()) { secName = seci.peekNextKey(); Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext(); Ogre::ConfigFile::SettingsMultiMap::iterator i; for (i = settings->begin(); i != settings->end(); ++i) { typeName = i->first; archName = i->second; Ogre::ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName); } } Ogre::ResourceGroupManager::getSingletonPtr()->initialiseAllResourceGroups();} bool Game::frameStarted(const Ogre::FrameEvent &evt){ if(RenderWindow->isClosed()) return false; this->InputCapture();//<---------------Chú ý, mỗi lần lặp phải gọi là "cướp" event(dịch ngu :( ). Nôm na là xem có nút gì được bấm không. return true;} bool Game::frameEnded(const Ogre::FrameEvent &evt){ return true;} void Game::InputCreate(){} void Game::InputDestroy(){} void Game::InputCapture(){}
Mã:OIS::ParamList pl; size_t windowHnd = 0; std::ostringstream windowHndStr; RenderWindow->getCustomAttribute("WINDOW", &windowHnd); windowHndStr << windowHnd; pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str())); InputManager = OIS::InputManager::createInputSystem( pl ); //!Create all devices. Keyboard = static_cast<OIS::Keyboard*>(InputManager->createInputObject( OIS::OISKeyboard, true )); Mouse = static_cast<OIS::Mouse*>(InputManager->createInputObject( OIS::OISMouse, true )); unsigned int width, height, depth; int left, top; RenderWindow->getMetrics(width, height, depth, left, top); Mouse->getMouseState().width = width; Mouse->getMouseState().height = height;
Mã:if(InputManager) { if(Mouse) InputManager->destroyInputObject(Mouse); if(Keyboard) InputManager->destroyInputObject(Keyboard); OIS::InputManager::destroyInputSystem(InputManager); InputManager = 0; }
Mã:if(Mouse) Mouse->capture(); if(Keyboard) Keyboard->capture();
Chúng ta đã tạo được một hệ thống input với OIS, phần tiếp theo sẽ ứng dụng OIS để làm một cái FPS camera.
(Third Person Camera có thể xem tại đây).
http://forum.gamedev.vn/index.php?showtopic=1776
Hix, check code của VHFOS mới được 33/hơn 80 mb (. Viết tiếp phần sau luôn [IMG]images/smilies/biggrin.png[/IMG].
-
30-09-2008, 10:57 AM #8Junior Member
- Ngày tham gia
- Sep 2015
- Đang ở
- Hà Nội
- Bài viết
- 0
Thêm cái này vào nào [IMG]images/smilies/biggrin.png[/IMG].
game.h
Mã:#ifndef _Game_H_#define _Game_H_ #include <Ogre.h>#include <OIS/OIS.h>#pragma comment(lib,"OgreMain_d.lib")#pragma comment(lib,"OIS_d.lib") #include "CameraControler.h"//<---------------Chú ý class Game: public Ogre::FrameListener{public: Game(); ~Game();public: void Run();private: void LoadResource(); void CreateScene();private: Ogre::Root* Root; Ogre::RenderWindow* RenderWindow; Ogre::Camera* Camera;private: Ogre::SceneManager* SceneManager; Ogre::SceneNode* OgreHeadNode;protected: bool frameStarted(const Ogre::FrameEvent &evt); bool frameEnded(const Ogre::FrameEvent &evt);private: OIS::Mouse* Mouse; OIS::Keyboard* Keyboard; OIS::InputManager* InputManager;private: void InputCreate(); void InputDestroy(); void InputCapture();private: CameraControler* cameraControl;//<---------------Chú ý}; #endif
Mã:#include "Game.h" Game::Game(){ InputManager = NULL; Mouse = NULL; Keyboard = NULL; cameraControl = NULL;//<---------------Chú ý Root = NULL; Root = new Ogre::Root();} Game::~Game(){ if(cameraControl)//<---------------Chú ý delete cameraControl; this->InputDestroy(); if(Root) delete Root;} void Game::Run(){ if(!Root) return;//!Error if(!Root->showConfigDialog()) return; RenderWindow = Root->initialise(true, "OgreWindow");//!Tự động tạo một window có caption là OgreWindow. SceneManager = Root->createSceneManager(Ogre::SceneType::ST_EXTERIOR_REAL_FAR);//!Tạo một scene manager kiểu EXTERIOR_REAL_FAR. Camera = SceneManager->createCamera("ExampleCamera");//!Tạo một camera có tên là ExampleCamera(các camera trong một scene manager ko được trùng tên). Ogre::Viewport* Viewport = RenderWindow->addViewport(Camera);//Thêm một viewport vào window(ở đây chiếm full luôn), và attach cho nó cái camera vừa tạo ở trên. Viewport->setBackgroundColour(Ogre::ColourValue::Black);//!Đặt màu nền cho cái viewport vừa tạo là màu đen. this->InputCreate(); this->LoadResource(); this->CreateScene(); Root->addFrameListener(this); Root->startRendering();//!Begin loop.} void Game::CreateScene(){ Camera->setPosition(200, 0, 0);//!Đặt lại vị trí camera. Camera->lookAt(0, 0, 0);//! Camera nhìn tới gốc tọa độ. SceneManager->setAmbientLight(Ogre::ColourValue(1, 1, 1)); Ogre::Entity* entity = SceneManager->createEntity("OgreHeadMesh", "ogrehead.mesh");//!Tạo một entity có mesh là hình cái đầu(hình như là đầu trâu, chả biết nữa). OgreHeadNode = SceneManager->getRootSceneNode()->createChildSceneNode();//!Tạo một scene node con từ RootSceneNode. OgreHeadNode->setPosition(0, 0, 0);//!Đặt vị trí của cái node này ở gốc tọa độ. OgreHeadNode->attachObject(entity);//!Attach cái đầu ogre vào node vừa tạo. cameraControl = new CameraControler(this->Keyboard, this->Mouse, this->Root, this->Camera);//<---------------Chú ý} void Game::LoadResource()//!Load các resource chỉ định trong file resources.cfg (Đừng quan tâm nó làm thế nào vội){ Ogre::ConfigFile cf; cf.load("resources.cfg"); Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator(); Ogre::String secName, typeName, archName; while (seci.hasMoreElements()) { secName = seci.peekNextKey(); Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext(); Ogre::ConfigFile::SettingsMultiMap::iterator i; for (i = settings->begin(); i != settings->end(); ++i) { typeName = i->first; archName = i->second; Ogre::ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName); } } Ogre::ResourceGroupManager::getSingletonPtr()->initialiseAllResourceGroups();} bool Game::frameStarted(const Ogre::FrameEvent &evt){ if(RenderWindow->isClosed()) return false; this->InputCapture(); return true;} bool Game::frameEnded(const Ogre::FrameEvent &evt){ return true;} void Game::InputCreate(){ OIS::ParamList pl; size_t windowHnd = 0; std::ostringstream windowHndStr; RenderWindow->getCustomAttribute("WINDOW", &windowHnd); windowHndStr << windowHnd; pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str())); InputManager = OIS::InputManager::createInputSystem( pl ); //!Create all devices. Keyboard = static_cast<OIS::Keyboard*>(InputManager->createInputObject( OIS::OISKeyboard, true )); Mouse = static_cast<OIS::Mouse*>(InputManager->createInputObject( OIS::OISMouse, true )); unsigned int width, height, depth; int left, top; RenderWindow->getMetrics(width, height, depth, left, top); Mouse->getMouseState().width = width; Mouse->getMouseState().height = height;} void Game::InputDestroy(){ if(InputManager) { if(Mouse) InputManager->destroyInputObject(Mouse); if(Keyboard) InputManager->destroyInputObject(Keyboard); OIS::InputManager::destroyInputSystem(InputManager); InputManager = 0; }} void Game::InputCapture(){ if(Mouse) Mouse->capture(); if(Keyboard) Keyboard->capture();}
Ô!.
Cái class CameraControler ở đâu ra thế này .
Đây đây.
CameraControler.h
Mã:#ifndef _CameraControler_H_#define _CameraControler_H_ #include <OIS/OIS.h>#include <Ogre.h> class CameraControler: public OIS::MouseListener, public OIS::KeyListener, public Ogre::FrameListener{public: CameraControler(OIS::Keyboard* Keyboard, OIS::Mouse* Mouse, Ogre::Root* Root, Ogre::Camera* Camera);protected: bool mouseMoved(const OIS::MouseEvent &arg); bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID ID); bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID ID); bool keyPressed(const OIS::KeyEvent &arg); bool keyReleased(const OIS::KeyEvent &arg); bool frameStarted(const Ogre::FrameEvent &evt);private: OIS::Keyboard* Keyboard; OIS::Mouse* Mouse; }; #endif
CameraControler.cpp
Mã:#include "CameraControler.h" CameraControler::CameraControler(OIS::Keyboard* Keyboard, OIS::Mouse* Mouse, Ogre::Root* Root, Ogre::Camera* Camera){ this->Keyboard = Keyboard; this->Mouse = Mouse; Keyboard->setEventCallback(this); Mouse->setEventCallback(this); Root->addFrameListener(this);} bool CameraControler::mouseMoved(const OIS::MouseEvent &arg){ return true;}bool CameraControler::mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID ID){ return true;}bool CameraControler::mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID ID){ return true;} bool CameraControler::keyPressed(const OIS::KeyEvent &arg){ return true;}bool CameraControler::keyReleased(const OIS::KeyEvent &arg){ return true;} bool CameraControler::frameStarted(const Ogre::FrameEvent &evt){ return true;}
Mã:bool CameraControler::mouseMoved(const OIS::MouseEvent &arg){ Camera->pitch(Ogre::Radian(Ogre::Degree(-arg.state.Y.rel)));//!pitch thì quay quanh Z. Camera->yaw(Ogre::Radian(Ogre::Degree(-arg.state.X.rel)));//!yaw xoay node quanh trục y của chính nó. Local Y-Axis, còn tại sao arg.state.X.rel âm. :) vì thế xoay nó mới thuận. Không quay mouse sang trái mà camera sang phải thì buồn cười. return true;}
Quá đã!, dễ hơn cả ăn cháo, ngĩ gì, code nấy [IMG]images/smilies/biggrin.png[/IMG]. Bây giờ tiếp.
À, khi ấn WASD thì nó thế nào ấy nhỉ?.
Mã:bool CameraControler::frameStarted(const Ogre::FrameEvent &evt){ float speed = 100;//!100 đơn vị trên giây. if(Keyboard->isKeyDown(OIS::KeyCode::KC_A)) { Camera->moveRelative(Ogre::Vector3(-speed, 0, 0)*evt.timeSinceLastFrame); } if(Keyboard->isKeyDown(OIS::KeyCode::KC_D)) { Camera->moveRelative(Ogre::Vector3(speed, 0, 0)*evt.timeSinceLastFrame); } if(Keyboard->isKeyDown(OIS::KeyCode::KC_W)) { Camera->moveRelative(Ogre::Vector3(0, 0, -speed)*evt.timeSinceLastFrame); } if(Keyboard->isKeyDown(OIS::KeyCode::KC_S)) { Camera->moveRelative(Ogre::Vector3(0, 0, speed)*evt.timeSinceLastFrame); } return true;}
À, nếu có thấy camera xoay nhanh quá thì giảm cái hệ số của nó đi nhá. VD.
Mã:Camera->pitch(Ogre::Radian(Ogre::Degree(-0.5*arg.state.Y.rel)));//!pitch thì quay quanh Z. Camera->yaw(Ogre::Radian(Ogre::Degree(-0.5*arg.state.X.rel)));//!yaw xoay node quanh trục y của chính nó. Local Y-Axis, còn tại sao arg.state.X.rel âm. :D vì thế xoay nó mới thuận.
Hô hô check được hơn 70mb rồi [IMG]images/smilies/biggrin.png[/IMG].
-
30-09-2008, 04:11 PM #9Junior Member
- Ngày tham gia
- Sep 2015
- Đang ở
- 24 Rạch Bùng Binh , P10,Q3 , HCM
- Bài viết
- 0
Xin lỗi vì spam [IMG]images/smilies/smile.png[/IMG]
@ NVD: Cố lên Võ Đang, Kid đang cố dịch directX, kill nó xong sẽ vọc Orge Hi vọng những bài viết của NVD hôm nay, sẽ là tiền đề cho rất nhiều người mai sau.
-
07-02-2012, 03:46 PM #10Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
anh NamVoDanh ơi anh có tài liệu nào về ogre ko anh shear lại cho em vói link kia die rồi. thank a nhiều
Bất chấp những lầm tưởng phổ quát, hồ hết những người có âm đạo đều khó lên đỉnh khi bị kích thích âm đạo. Tuy nhiên, điều đó không có tức thị nó không thể vui được! Việc xâm nhập vào âm đạo bằng...
Quý bà giải tỏa bằng việc kích...