摘要: 剛給引擎設備新加了一個函數GetLuaStateOwner();用于獲取引擎中的lua上下文看起來似乎沒多大必要但是我有自己的考慮!另外:我修改了粒子腳本如下:
1 2 -- 這是蓋莫引擎中使用lua腳本的測試粒子 3 4 -- 定義粒子池粒子...
閱讀全文
摘要: 初步做完粒子系統想著如何從腳本中載入數據,配送方法這樣不是很好腳本我打算首先支持lua和天使腳本等引擎成熟了再支持python首先來看使用lua語言改寫上篇的粒子系統代碼.(不過鄙人的lua,python都很菜的,其原因就是一直沒有練習的機會)對于Lua,其擴展有luabind,tolua++,luaplus,前2著都與boost有關所以就使用luaplus,簡單些開始了先上lua腳本代碼(我把l...
閱讀全文
摘要: 引擎的粒子系統我一直在考慮,以前也設計過,但是感覺以前做過的過于復雜,這里我本著讓粒子系統的接口盡可能的簡單,功能盡可能的強大,我把粒子系統設計成了這樣的形式:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 2...
閱讀全文
今天由于要寫一些東西,遇到了需要把成員函數作為函數參數的問題
總結有以下幾個辦法:
1.使用類的靜態成員:
最簡單的.只是這種辦法與使用普通函數沒有什么區別
2.模板的方法
1 template<class T>
2 void Call(T* ptr,void(T::*MenFn)())
3 {
4 (ptr->*MenFn)();
5 }
1 class MyClass
2 {
3 public:
4 void Call()
5 {
6 
7 }
8 };
9
10 MyClass cs;
11 Call(&cs,&MyCall::Call);
3. 虛擬繼承的方法
1 class Base
2 {
3 public:
4 virtual void Call() = 0;
5 };
6
7 class SubClass :public Base
8 {
9 public:
10 void Call(){
}
11 };
12
13 void Call(Base *ptr)
14 {
15 ptr->Call();
16 }
4.use boost.
1
#include <boost/bind.hpp>
2
#include <iostream>
3
using namespace std;
4
struct MyClass
5

{
6
void Print(const char* str)
7
{
8
cout<<"holle "<<str<<endl;
9
}
10
};
11
12
template<class _Fun>
13
void CallBackFun(_Fun a,const char* str)
14

{
15
t(n);
16
}
17
18
int main()
19

{
20
MyClass mc;
21
CallBackFun(boost::bind(boost::mem_fn(&MyClass::Print),&mc,_1),"world")
22
return 1;
23
}
24
5.使用靜態成員函數或者聯合體模擬之
1 union
2 {
3 void(G_CALL ParticleSystem::*PhysicsThreadFun)(void *arg);
4 ThreadFun f;
5 }fn;
6 fn.PhysicsThreadFun = &ParticleSystem::PhysicsThreadFun;
7 thread_id = CreateThread(fn.f,&ps);
6.也許.
對loki庫不太熟悉也許上面也有答案吧
我所知的c++插槽系統由3個boost的,sigslot的,sigc++的
這里介紹sigc++的使用
最基本的使用方法:
1.回調函數為一般函數:
代碼如下:
1 #include <iostream>
2 #include <string>
3 #include <sigc++/sigc++.h>
4
5 //! 普通函數
6 void Print(const std::string& str)
7 {
8 std::cout << str;
9 }
10
11 int main()
12 {
13 //! 返回值void,參數const std::string&
14 sigc::signal<void, const std::string&> signal_print;
15 //! 鏈接函數
16 signal_print.connect( sigc::ptr_fun(&Print));
17 //! 發射信號
18 signal_print.emit("hello world\n");
19
20 system("pause");
21 return 0;
22 }
2.回調函數為成員函數
1 #include <iostream>
2 #include <string>
3 #include <sigc++/sigc++.h>
4
5 class Printer :public sigc::trackable
6 {
7 public:
8 void Work(){slot.emit("work\n");}
9 typedef sigc::signal<void, const std::string&> Slot;
10 Slot slot;
11 void Print(const std::string& str){std::cout<<str;}
12 };
13
14 int main()
15 {
16 Printer printer;
17 Printer::Slot::iterator iter = printer.slot.connect(sigc::mem_fun(&printer,&Printer::Print));
18 printer.Work();
19 iter->disconnect();
20 printer.Work();
21
22 system("pause");
23 return 0;
24 }
在sigc++中sigc::ptr_fun負責綁定一般函數
而sigc::men_fun負責綁定成員函數.
可以看到一般的信號插槽系統都具備以下幾個函數
a.插槽連接
b.插槽斷開
c.信號發射
當然有的插槽信號庫還提供其它一些函數
比如對信號設定優先級等等
這是簡單實用sigc++的例子
不過若論簡單性的話還是sigslot比較好,只有一個頭文件
游戲引擎的粒子系統設計大致有2個方式:或者是雪,雨,煙花的具體類實現,或者是類似ogre的那種由粒子發射器,粒子效果器等組成的具有簡明數學,物理意義的通用粒子系統。
蓋莫引擎采用的是類似于ogre的這種模型
粒子系統由粒子發射器,粒子效果器,粒子開發等組成。
下面這是一個粒子系統的貼圖:

這個粒子場景是采用的點狀粒子發射器+重力粒子效果器(當然這是最簡單的模式了)
由于粒子系統比較龐大,代碼還在修改中故不上代碼
摘要: 如何軟件設計中總有那么幾個比較小巧卻比較有用的小段代碼比如boost中的utility蓋莫游戲引擎也一樣有幾個比較小的代碼片段:如下這是關于指針的:
1 //! 定義一個檢測指針是否為空的宏 2 /*! 3 當指針為空的話則返回指定值 4 &nb...
閱讀全文
剛改造了以前做的蓋莫游戲引擎渲染md2的代碼.
對于md2模型來說
一個模型由若干動畫組成
一個動畫由若干幀構成
每個動畫都有自己的名字
具體渲染的時候是對幀做插值的
具體測試例子如下:
1 #include <cstdlib>
2 #include <iostream>
3 #include <GEngine/Main.hpp>
4
5 using namespace std;
6 using namespace core;
7 core::RefPtr<core::Image> skyimage[5];
8 core::RefPtr<core::Texture> skytexture[5];
9 core::RefPtr<core::Image> terrainimage[2];
10 core::RefPtr<core::Texture> terraintexture[2];
11
12
13 int main(int argc, char *argv[])
14 {
15 Device *device = InitDevice("蓋莫引擎md2模型測試");
16 device->SetClearColor(core::Color(80,90,255));
17
18 //! 獲取場景管理器
19 RefPtr<SceneManager> scenemanager = SceneManager::GetSceneManager();
20
21 //! 獲取資源管理器
22 ResourceManager* resourcemanager = device->GetResourceManager();
23 //! 獲取天空圖片資源
24 //! 獲取天空圖形指針
25 skyimage[0] = resourcemanager->GetImage("sky_front","..\\image//sky//front.jpg");
26 skyimage[1] = resourcemanager->GetImage("sky_back","..\\image//sky//back.jpg");
27 skyimage[2] = resourcemanager->GetImage("sky_left","..\\image//sky//left.jpg");
28 skyimage[3] = resourcemanager->GetImage("sky_right","..\\image//sky//right.jpg");
29 skyimage[4] = resourcemanager->GetImage("sky_top","..\\image//sky//top.bmp");
30
31 skytexture[0] = resourcemanager->GetTexture("sky_front",skyimage[0]);
32 skytexture[1] = resourcemanager->GetTexture("sky_back",skyimage[1]);
33 skytexture[2] = resourcemanager->GetTexture("sky_left",skyimage[2]);
34 skytexture[3] = resourcemanager->GetTexture("sky_right",skyimage[3]);
35 skytexture[4] = resourcemanager->GetTexture("sky_top",skyimage[4]);
36 //! 獲取天空盒指針
37 RefPtr<SceneNode> skybox = scenemanager->GetSkyBox(NULL,skytexture[0],skytexture[1],skytexture[2],skytexture[3],skytexture[4],500,500,600);
38
39 //! 設置地形數據
40 terrainimage[0] = resourcemanager->GetImage("terrain_image","..\\terrain//terrain.bmp");
41 terrainimage[1] = resourcemanager->GetImage("terrain_detail","..\\terrain//detail.bmp");
42 terraintexture[0] = resourcemanager->GetTexture("terrain_texture1",terrainimage[0]);
43 terraintexture[1] = resourcemanager->GetTexture("terrain_texture2",terrainimage[1]);
44 RefPtr<Terrain> terrain = scenemanager->GetTerrain(NULL,"..\\terrain//terrain.raw",1024,terraintexture[0],terraintexture[1]);
45
46 int height = terrain->GetHeight(440,370);
47 height += 40;
48 //! 獲取新的攝像機并設置為活動攝像機
49 RefPtr<Camera> camera = scenemanager->CreateCamera("mycamera", Vector3f(10,height,10),
50 Vector3f(512,height - 30,512),
51 Vector3f(0,1,0));
52 //! 設置當前活動攝像機
53 scenemanager->SetActiveCamera(camera);
54 camera->SetViewport(0,0,640,480);
55
56 //! 霧設置
57 RefPtr<Fog> fog = scenemanager->GetFog();
58 fog->SetColor(core::Color(0.3f,0.5f,0.2f));
59 fog->SetDensity(0.0012f);
60 fog->SetQuality(0.004f);
61 fog->SetBound(0.2f,1000.0f);
62 fog->Render();
63
64 RefPtr<ActiveModel3D> model = scenemanager->GetActiveModel("md2model");
65 model->Load("..\\model\\hobgoblin.md2");
66 RefPtr<Image> md2image = resourcemanager->GetImage("md2image","..\\model//hobgoblin.bmp");
67 RefPtr<Texture> md2texture = resourcemanager->GetTexture("md2texture",md2image);
68 model->LoadTexture(md2texture);
69 model->SetTranslate(Vector3f(180,10+terrain->GetHeight(112,512),180));
70
71 std::vector<AnimationFrame> frames;
72 model->GetFrameList(frames);
73
74 BEGIN_LOOP(device);
75 camera->SetPerspective(45,640.0f/480.0f,6.0f,1000);
76 camera->Render();
77 skybox->Render();
78 terrain->Render();
79 model->Render();
80 static int begin_frame = 0;
81 static int end_frame = begin_frame+1;;
82 static float t = 0.0f;
83 t+=0.02;
84 if(t>1)
85 {
86 t = 0;
87 end_frame++;
88 begin_frame++;
89 }
90 if(begin_frame == frames.back().frame_end)
91 end_frame = begin_frame = 0;
92 model->SetCurrentFrame(begin_frame,end_frame,t);
93
94 static float angle = 0.0f;
95 skybox->SetRotate(core::AXIS_Z,angle);
96
97 angle+=0.000003;
98 if(angle>360)
99 angle-=360;
100 END_LOOP(device);
101
102 device->Close();
103 device->Drop();
104
105 system("PAUSE");
106 return EXIT_SUCCESS;
107 }
108
109

貼圖如下:這里的模型是源于opengl游戲開發一書
再來一個Opengl3d游戲開發中士兵的模型例子如下(當然我拿走了他的槍):

我會先讓引擎具備常見的功能
之后我就會考慮加入引擎自己的亮點和消除引擎存在的Bug
當然了各類編輯器的設計也是遲早的了
再來一個機器人的md2模型
摘要: 以前早就看過了如何使用opengl繪制3ds靜態對象的材料現在總把這個加入到引擎里面了具體代碼如下:
1 #include <cstdlib> 2 #include <iostream> 3 #include <GEngine/Main.hpp> 4 ...
閱讀全文
這是蓋莫游戲引擎中的坐標系統和輸入系統測試的小例子代碼如下所示:
1 #include <cstdlib>
2 #include <iostream>
3 #include <GEngine/Main.hpp>
4
5 using namespace std;
6 using namespace core;
7
8 int main(int argc, char *argv[])
9 {
10 Device *device = InitDevice("蓋莫引擎坐標系統測試");
11 device->SetClearColor(core::Color(80,100,230));
12 int x,y,z;
13 //! 使用Opengl坐標系統
14 core::CoordinateSystem cs(COORDINATE_OPENGL);
15 device->SetCoordinateSystem(cs);
16
17 //! 啟用2D渲染模式
18 device->Ortho2D();
19 //! 獲取資源管理器
20 core::ResourceManager* resmgr = device->GetResourceManager();
21 core::RefPtr<core::Text> defont= resmgr->GetText("default_font");
22
23 char text[255];
24 char fpstext[20];
25 float fps = device->GetFPS();
26 BEGIN_LOOP(device);
27 device->GetInput()->GetMousePosition(x,y,z);
28 sprintf(text,"mouse position is :x = %d, y = %d,z = %d",x,y,z);
29 fps = device->GetFPS();
30 sprintf(fpstext,"fps is:%f",fps);
31 defont->Render(20,20,text);
32 defont->Render(540,20,fpstext);
33 END_LOOP(device);
34
35 device->Close();
36 device->Drop();
37
38 system("PAUSE");
39 return EXIT_SUCCESS;
40 }
41
對于opengl坐標系,其原點位于屏幕左下角
當前字體的渲染坐標固定為x軸向右,y軸向下,以屏幕左上角為原點
這是貼圖 不過看上去幀速有點偏低