gcc的declaration does not declare anything
是一个很经典的问题
有以下解决方案
1.加上 -fpermissive
2.修改相关头文件次序
3.修改当前变量名
这不一定是程序的问题(O_O)?
发布盖莫音频引擎1.1版本(第二次发布)
盖莫音频引擎1.1版本是在盖莫音频引擎1.0基础上发展而来
支持 ogg,wav,mp33种常见音频格式
使用多线程,流式播放音频
支持低通,次音效等几种音效(没有支持更多音效和xram的原因是机器声卡能力有限)
真3d音效
可使用于 linux,win2,xbox,苹果机等平台
可替代fmod音频引擎
可在以下几个站点下载它:
csdn:http://download.csdn.net/source/2137526代码下载网:http://www.libcode.com.cn/show.php?sid=84程序员联合网:http://www.pudn.com/downloads231/sourcecode/others/detail1090515.htmldemo程序代码如下:
1 #include <cstdlib>
2 #include <iostream>
3 #include <GEngine/AudioDevice.hpp>
4 #include <cmath>
5
6 using namespace std;
7 using namespace core;
8
9 int main(int argc, char *argv[])
10 {
11 core::AudioDevice* device = InitAudioDevice();
12 uint16 number = device->GetAudioDeviceNumber();
13 cout<<"音频设备个数:"<<number<<endl;
14 for(int i = 0; i < number ; i++) //! std::copy(begin.end.ostream)
15 {
16 std::cout<<device->GetDeviceByIndex(i)<<std::endl;
17 }
18
19 cout<<"init is: "<<device->Init(device->GetDeviceByIndex(0),4,0)<<endl;
20 AudioSource* audio = device->GetAudioSource();
21 AudioListener* listener = device->GetAudioListener();
22 audio->AttachLowPassFiler();
23 audio->AttachAuxiliaryEffect();
24 audio->Play("..\\audio//theme2.ogg",true);
25 audio->SetSourcePosition(Vector3f(10,10,10));
26 audio->SetRelative(false);
27 audio->SetMaxDistance(100);
28 audio->SetMinDistance(10);
29 audio->SetVolume(1.2f);
30 listener->SetPosition(Vector3f(100,10,10));
31 float t = 0.0f;
32 int step = 0;
33 while(1)
34 {
35 if(step == 300)
36 {
37 step = 0;
38 t+= 0.01;
39 }
40 listener->Move(Vector3f(100*sinf(t),0,100*cosf(t)));
41 audio->Move(Vector3f(0,1,-1));
42 step++;
43 }
44 device->Deinit();
45 DeinitAudioDevice();
46
47 system("PAUSE");
48 return EXIT_SUCCESS;
49 }
精简版的盖莫音频引擎只包含1个头文件,1个a/lib,一个so/dll文件!
发布版本为win32下的gcc版本
盖莫家园在这里:
盖莫Engine游戏引擎网:www.gaimo.net盖莫论坛:http://bbs.gameres.com/showforum.asp?forumid=113许可证:
本版本使用于非商业完全免费
使用于商业只需要付给少量许可费以供继续开发和维护即可!
有疑问请联系email:ccsdu2009@126.com
成都盖莫软件技术工作室
如果所给例子出现异常请确保已经安装openal,如果异常依然存在则重新编译示例即可运行
1.出现有些组件不一致的问题则打开注册表regedit
删除会话管理器中的PendingFileRenameOperations相
2.安装front page失败则操作如下:
找一个安装好了的vc7.1
复制C:\Program Files\Common Files\Microsoft Shared\web server extensions\40\bin中的dll到目标机器对应位置
3.再次安装
ok
这是盖莫游戏引擎的第一次正式发布
盖莫游戏引擎是在csdu2004私人书写的盖莫游戏引擎基础上发展而成
前期以各种方式发布过0.87,1.03,1.1,1.2,1.3,1.4.1.5,1.6
本次发布版本为2.10版本
当然该版本也是首次正式对外发布
sdk内置16个小demo例子
你可以自由使用本sdk.
当然如果发现任何bug的话请告诉我们以便我们完善之(email:ccsdu2009@126.com)
本次版本采用devc++编写而成
当然你也可以使用codeblock编译器
如果你有兴趣讨论本游戏引擎,你可以加入qq群:20997748 盖莫0群-盖莫引擎讨论
如果你想加入本游戏引擎的开发,请发邮件到ccsdu2009@126.com
下载在这里(<10M):
代码下载网:
http://www.libcode.com.cn/show.php?sid=83csdn:
http://download.csdn.net/source/2121828附注下次版本更新计划:
1.进一步调整引擎构架
2.支持3d音效
3.支持视频播放
4.大幅度使用脚本文件
5.加入公告板
6.二叉树,八叉树,四叉树的使用
7.md2,md3模型的支持
8.物理引擎的进一步强化
9.其他
有些东西由于很少用时间久了就忘了
以后有什么东东的话就放在这里了:
1.vc由dll导出def
e.g:dumpbin /exports avutil.dll /out:avutil.def
2.def 到lib文件
修改生成的def格式如下:
LIBRARY "avformat"
EXPORTS;
av_register_all
guess_format
...
执行
lib /def:avformat.def /machine:i386 /out:avformat.lib
c++纯虚函数方法调用原因:一个可以的原因是由于修改了代码但是编译器并没有及时更新造成的
3.multiple types in one declaration
出现该错误的原因可能在于所在行对象的上个数据结构末尾缺少一个;所致
摘要: 引擎中的光照系统是在就存在了的只是感觉一直有点问题,索性重新设计了.光照系统的有关对象和单元有:渲染基类RenderBase对象基类Object光描述符LightDesc光类Light光管理器LightManager在引擎中我们认识光是一种资源所以光管理器是从资源管理器中获得的也就是:RefPtr<LightManager> lightmanager = resourcem...
阅读全文
游戏引擎中的文件系统是非常重要的一环,基本的文件系统功能不外乎以下功能:
1.打开文件
2.检测文件是否存在
3.获取给定文件目录列表
4.文件其它操作
5.各类文件的处理(日志,xml等等)
盖莫游戏引擎也有必要有自己内置的文件系统来管理引擎所使用的文件或者资源。
以下是简单的测试例子:
1 #include <GEngine/Gaimo.hpp>
2 using namespace std;
3
4 int main(int argc, char **argv)
5 {
6 //! 初始化引擎设备并得到设备指针
7 core::Device* device = core::InitDevice("盖莫引擎文件系统测试");
8 core::Render::SetClearColor(core::Color(0.5f,0.6f,0.6f));
9
10 //! 获取文件系统指针
11 core::RefPtr<core::FileSystem> filesystem = device->GetFileSystem();
12 //! 获取引擎资源管理器
13 core::ResourceManager* resmgr = device->GetResourceManager();
14
15 filesystem->AddToSearchPath("..\\font\\font.zip");
16 bool flag = filesystem->IsExists("accid.ttf");
17 if(flag == false)
18 {
19 ShowMessage(不存在字体文件accid.ttf)
20 device->Close();
21 device->Drop();
22 return -1;
23 }
24
25 //! 读取文件数据
26 core::RefPtr<core::ReadFile> file = filesystem->OpenRead("accid.ttf");
27
28 //! 使用给定字体文件(ttf)
29 core::RefPtr<core::Text> font = resmgr->GetText("newfont",file,18);
30
31 int fps;
32 char text[255];
33 BEGIN_LOOP(device)
34 glClear(GL_COLOR_BUFFER_BIT);
35 fps = device->GetFPS();
36 sprintf(text,"fps is: %d",fps);
37 font->Render(540,0,text);
38 font->Render(200,80, "This demo is testing GEngine's FileySystem.");
39 font->Render(250,105, "GaimoSoft Studio.");
40 END_LOOP(device)
41
42 device->Close();
43 device->Drop();
44
45 return 0;
46 }
47
48
下面是简单的贴图:
从代码中可以看出引擎对zip压缩格式是内置支持的
在盖莫游戏引擎的书写过程中先后书写了资源管理器,场景管理器,模型管理器等管理器类.之后感觉很有必要写一个泛型的管理器类了.这个可以少做一些重复性的工作了。
管理器类无非就是获取当前对象个数,对象生成,对象按名索取等等
经过考虑,草料书写如下:
1 namespace core
2 {
3
4 ////////////////////////////////////////////////////////////
5 //! 定义引擎泛型管理器类
6 ////////////////////////////////////////////////////////////
7 template<class Obj = Object, class Type = std::string>
8 class Manager
9 {
10 public:
11 typedef Type ThisType;
12 typedef Obj ThisObj;
13 typedef std::map<ThisType,RefPtr<ThisObj> > Table;
14 //! typedef std::map<ThisType,RefPtr<ThisObj> >::iterator TableItr;
15
16 ////////////////////////////////////////////////////////
17 //! 构造,析构场景管理器
18 ////////////////////////////////////////////////////////
19 Manager(){}
20 virtual ~Manager() = 0;
21 public:
22
23 ////////////////////////////////////////////////////////////
24 /// 获取当前管理器中的对象个数
25 ////////////////////////////////////////////////////////////
26 inline uint32 GetObjectNumber()const{return objects.size();}
27
28 ////////////////////////////////////////////////////////////
29 /// 检测当前管理器中是否存在对象
30 ////////////////////////////////////////////////////////////
31 inline bool HasObject()const{return !objects.empty();}
32
33 ////////////////////////////////////////////////////////////
34 /// 获取给定索引的对象(如果对象不存在则生成一个新的对象)
35 ////////////////////////////////////////////////////////////
36 inline RefPtr<Object> GetObject(const Type& name)
37 {
38 if(objects.find(name) != objects.end())
39 return objects[name];
40 return NULL;
41 }
42
43 ////////////////////////////////////////////////////////////
44 /// 生成一个新的对象
45 ////////////////////////////////////////////////////////////
46 virtual RefPtr<ThisObj> CreateObject(const Type& name) = 0;
47
48 ////////////////////////////////////////////////////////////
49 /// 销毁指定名字的对象
50 ////////////////////////////////////////////////////////////
51 inline bool KillObject(const Type& name)
52 {
53 std::map<std::string,RefPtr<Model> >::iterator itr = objects.find(name);
54 if(itr == objects.end())
55 return false;
56 objects.erase(name);
57 return NULL;
58 }
59
60 ////////////////////////////////////////////////////////////
61 /// 管理器对象清空
62 ////////////////////////////////////////////////////////////
63 inline void ClearObject(){objects.clear();}
64 protected:
65 Table objects;
66 };
67
68 template<class Obj, class Type>
69 Manager<Obj,Type>::~Manager()
70 {
71 ClearObject();
72 }
73
其中使用std::map作为基本的管理器容器
同时其中CreateObject函数是一个虚拟函数需要重载之
然后我们就可以这样写具体的的管理器了.
比如:
1 class ModelManager : public Manager<Model,std::string>
2 {
3 public:
4 RefPtr<Model> CreateObject(const std::string &);
5 };
这是使用盖莫游戏引擎做的基于ode物理引擎的摩擦力测试的小例子
代码如下:
1 //! 2010.03.05
2 /////////////////////////////////////////////////////
3 /// 盖莫游戏引擎盖莫引擎物理场景测试3
4 /////////////////////////////////////////////////////
5 #include <GEngine/Gaimo.hpp>
6 using namespace std;
7
8 #define LENGTH 4
9 #define MASS 0.4
10 #define FORCE 0.6
11 #define MU 1.0
12 #define GRAVITY 9.8
13
14 //! 盒子纹理
15 int cubeid = 0;
16
17 dGeomID ground;
18 core::PhysicsEngine<dWorldID,dSpaceID,dJointGroupID,dBodyID,dGeomID> engine;
19 core::PhysicsBody<dBodyID,dGeomID,1> box[3];
20
21 //! 碰撞检测回调函数
22 static void nearCallback(void *data, dGeomID o1, dGeomID o2);
23
24 //! 初始化物理场景
25 void Init();
26 //! 物理场景更新
27 void PhysicsLoop();
28
29 int main(int argc, char **argv)
30 {
31 Init();
32
33 //! 初始化引擎设备并得到设备指针
34 core::Device* device = core::InitDevice("盖莫引擎物理场景-摩擦力测试");
35 //! 得到引擎场景指针
36 core::RefPtr<core::SceneManager> scenemanager = device->GetSceneManager();
37 //! 得到引擎资源指针
38 core::ResourceManager* resourcemanager = device->GetResourceManager();
39
40 //! 得到图形和其纹理
41 core::RefPtr<core::Image> box = resourcemanager->GetImage("box","..\\image/tile.tga");
42 core::RefPtr<core::Texture> boxtexture = resourcemanager->GetTexture("box",box);
43 boxtexture->Bind();
44 cubeid = boxtexture->GetTextureId();
45
46 //! 获取全局摄像机
47 core::RefPtr<core::Camera> camera = scenemanager->GetGlobalCamera(Vector3f(-5,100,17),
48 Vector3f(18,1,17),
49 Vector3f(0,1,0));
50 camera->SetViewport(0,0,640,480);
51 camera->SetPerspective(50.0f,640.0f/480.0f,0.1f,1000.0f);
52 glClearDepth(1.0f);
53 glDepthFunc(GL_LEQUAL);
54 glEnable(GL_DEPTH_TEST);
55 glEnable(GL_CULL_FACE);
56 glShadeModel(GL_SMOOTH);
57 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
58 core::Render::SetClearColor(core::Color::Blue);
59
60 BEGIN_LOOP(device)
61 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
62 glLoadIdentity();
63 camera->SetPerspective(45.0f,640.0f/480.0f,0.1f,1000.0f);
64 camera->Render();
65 PhysicsLoop();
66 END_LOOP(device)
67
68 device->Close();
69 device->Drop();
70
71 return 0;
72 }
73
74 //! 初始化物理场景
75 void Init()
76 {
77 engine.SetGravity(0,-GRAVITY,0);
78 ground = engine.SetPlane(0,1,0,0);
79 engine.SetCollideCallBack(&nearCallback);
80
81 box[0].body = engine.GetBody("body1",Vector3f(2*LENGTH,0.25*LENGTH,LENGTH*2));
82 box[1].body = engine.GetBody("body2",Vector3f(2*LENGTH,0.25*LENGTH,LENGTH*6));
83 box[2].body = engine.GetBody("body3",Vector3f(2*LENGTH,0.25*LENGTH,LENGTH*10));
84 for(int i = 0; i < 3; i++)
85 {
86 dMass m;
87 dMassSetBox(&m,1,LENGTH,LENGTH*0.5,LENGTH);
88 dMassAdjust(&m,MASS);
89 dBodySetMass(box[i].body,&m);
90 box[i].geom[0] = dCreateBox(engine.GetSpace(),LENGTH,0.5*LENGTH,LENGTH);
91 dGeomSetBody(box[i].geom[0],box[i].body);
92 }
93 }
94
95 static void nearCallback(void *data, dGeomID o1, dGeomID o2)
96 {
97 int i;
98
99 //! 仅仅考虑和地面的碰撞
100 int g1 = (o1 == ground);
101 int g2 = (o2 == ground);
102 if (!(g1 ^ g2))
103 return;
104
105 dBodyID b1 = dGeomGetBody(o1);
106 dBodyID b2 = dGeomGetBody(o2);
107
108 dContact contact[3];
109 for (i=0; i<3; i++)
110 {
111 contact[i].surface.mode = dContactSoftCFM | dContactApprox1;
112 contact[i].surface.mu = MU;
113 contact[i].surface.soft_cfm = 0.01;
114 }
115 if(int numc = dCollide (o1,o2,3,&contact[0].geom,sizeof(dContact)))
116 {
117 for (i=0; i<numc; i++)
118 {
119 dJointID c = dJointCreateContact(engine.GetWorld(),engine.GetContactGroup(),contact+i);
120 dJointAttach (c,b1,b2);
121 }
122 }
123 }
124
125 //! 物理场景更新
126 void PhysicsLoop()
127 {
128 engine.Simulation();
129
130 const float sides[3] = {2*LENGTH,LENGTH*0.5f,2*LENGTH};
131
132 dBodyAddForce(box[0].body,FORCE*5,0,0);
133 dBodyAddForce(box[1].body,FORCE*7,0,0);
134 dBodyAddForce(box[2].body,FORCE*9,0,0);
135
136 const dReal* pos = dBodyGetPosition(box[0].body);
137 const dReal* mat = dBodyGetRotation(box[0].body);
138 core::Render::RenderCube(cubeid,(const float*)pos,(const float*)mat,sides);
139 pos = dBodyGetPosition(box[1].body);
140 mat = dBodyGetRotation(box[1].body);
141 core::Render::RenderCube(cubeid,(const float*)pos,(const float*)mat,sides);
142 pos = dBodyGetPosition(box[2].body);
143 mat = dBodyGetRotation(box[2].body);
144 core::Render::RenderCube(cubeid,(const float*)pos,(const float*)mat,sides);
145 }
可以看出三个盒子的物理属性都是一致的,除了其位置之外
在模拟过程中给3个盒子施加的力是不同的
本例子是使用盖莫游戏引擎+ode做的第三简单demo
这是对关节合页的测试代码:
1 //! 2010.03.05
2 /////////////////////////////////////////////////////
3 /// 盖莫游戏引擎盖莫引擎物理场景测试3
4 /////////////////////////////////////////////////////
5 #include <GEngine/Gaimo.hpp>
6 using namespace std;
7
8 //! 盒子大小和质量
9 #define SIDE (8.0f)
10 #define MASS (1.0)
11 //! 盒子纹理
12 int cubeid = 0;
13
14 core::PhysicsEngine<dWorldID,dSpaceID,dJointGroupID,dBodyID,dGeomID> engine;
15 core::PhysicsBody<dBodyID,dGeomID,1> object[2];
16 dJointID hinge;
17 const std::string name[] = {"b1","b2"};
18
19 //! 初始化物理场景
20 void Init();
21 //! 物理场景更新
22 void PhysicsLoop();
23
24 int main(int argc, char **argv)
25 {
26 Init();
27
28 //! 初始化引擎设备并得到设备指针
29 core::Device* device = core::InitDevice("盖莫引擎物理场景测试3");
30 //! 得到引擎场景指针
31 core::RefPtr<core::SceneManager> scenemanager = device->GetSceneManager();
32 //! 得到引擎资源指针
33 core::ResourceManager* resourcemanager = device->GetResourceManager();
34
35 //! 得到logo图形和其纹理
36 core::RefPtr<core::Image> box = resourcemanager->GetImage("box","..\\image/logo.jpg");
37 core::RefPtr<core::Texture> boxtexture = resourcemanager->GetTexture("logo",box);
38 boxtexture->Bind();
39 cubeid = boxtexture->GetTextureId();
40
41 //! 获取全局摄像机
42 core::RefPtr<core::Camera> camera = scenemanager->GetGlobalCamera(Vector3f(30,30,30),
43 Vector3f(0,0,0),
44 Vector3f(0,1,0));
45 camera->SetViewport(0,0,640,480);
46 camera->SetPerspective(50.0f,640.0f/480.0f,0.1f,1000.0f);
47 glClearDepth(1.0f);
48 glEnable(GL_DEPTH_TEST);
49 glShadeModel(GL_SMOOTH);
50 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
51
52 BEGIN_LOOP(device)
53 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
54 glLoadIdentity();
55 core::Render::SetClearColor(core::Color::Blue);
56 camera->SetPerspective(45.0f,640.0f/480.0f,0.1f,1000.0f);
57 camera->Render();
58 PhysicsLoop();
59 END_LOOP(device)
60
61 device->Close();
62 device->Drop();
63
64 return 0;
65 }
66
67 //! 初始化物理场景
68 void Init()
69 {
70 //! 设置调整盒子质量
71 dMass m;
72 dMassSetBox(&m,1,SIDE,SIDE,SIDE);
73 dMassAdjust(&m,MASS);
74 //! 从轴和角度获取四元数
75 dQuaternion q;
76 dQFromAxisAndAngle(q,1,1,0,0.25*M_PI);
77 //! 设置盒子1物理参数
78 object[0].body = engine.GetBody(name[0],Vector3f(0.5*SIDE,0.5*SIDE,1));
79 dBodySetMass (object[0].body,&m);
80 dBodySetQuaternion (object[0].body,q);
81 //! 设置盒子2物理参数
82 object[1].body = engine.GetBody(name[1],Vector3f(-0.5*SIDE,-0.5*SIDE,1));
83 dBodySetMass (object[1].body,&m);
84 dBodySetQuaternion(object[1].body,q);
85 //! 生成合页关节并设置参数
86 hinge = dJointCreateHinge(engine.GetWorld(),0);
87 dJointAttach (hinge,object[0].body,object[1].body);
88 dJointSetHingeAnchor(hinge,0,0,1);
89 dJointSetHingeAxis(hinge,1,-1,1.41421356);
90 }
91
92 //! 物理场景更新
93 void PhysicsLoop()
94 {
95 //! 角阻尼常量
96 const dReal kd = -0.3;
97
98 static dReal a=0;
99 const dReal *w = dBodyGetAngularVel(object[0].body);
100 dBodyAddTorque (object[0].body,kd*w[0],kd*w[1]+0.15*cos(a),kd*w[2]+0.15*sin(a));
101 dWorldStep(engine.GetWorld(),0.05);
102 a += 0.01;
103
104 dReal sides1[3] = {SIDE,SIDE,SIDE};
105 dReal sides2[3] = {SIDE,SIDE,SIDE*0.8f};
106 const dReal *pos,*mat;
107 pos = dBodyGetPosition(object[0].body);
108 mat = dBodyGetRotation(object[0].body);
109 core::Render::RenderCube(cubeid,(float*)pos,(float*)mat,(float*)sides1);
110 pos = dBodyGetPosition(object[1].body);
111 mat = dBodyGetRotation(object[1].body);
112 core::Render::RenderCube(cubeid,(float*)pos,(float*)mat,(float*)sides2);
113 }
贴图为:
1.
2.