游戏开发论坛

 找回密码
 立即注册
搜索
查看: 10376|回复: 39

菜鸟求教,我接下来该做些什么?

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2006-11-30 21:47:00 | 显示全部楼层 |阅读模式
我自己写了一些代码了,现在已经能做到的包括:
1.网络通信
2.从动态链接库中载入类
3.多线程的封装
4.能够让现有代码与OPAL和OGRE一起运行

因为我缺乏经验,所以想问问大家,我接下来该做些什么呢?
[em1]

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2006-12-1 17:16:00 | 显示全部楼层

Re:菜鸟求教,我接下来该做些什么?

你一点也不菜,你可以把你写的东西放出来,写写经验心得,和人家多交流。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2006-12-1 18:26:00 | 显示全部楼层

Re:菜鸟求教,我接下来该做些什么?

我的那个在这里:
http://www.blog.163.com/sjinny/
里面有介绍和源代码,不过源代码是上传到新浪那里的,不知道现在还能不能下载了,而且那个是2006.10.16的,和现在这个有一些差别了,我把现在这个版本的基本完善之后会把新的源代码上传,不过不知道那会是什么时候了……

我的心得……简单的说就是下面这些:
1.网络通信:对象序列化+Command模式已经不错了,实现不很复杂,用起来也比较方便
2.实现引擎与内容的分离:引擎放在可执行文件里,内容放在动态链接库里(以类的形式),我的设计是把内容分成两大块,一块是场景类,一块是对象类;场景负责在游戏程序开始时载入游戏内容对应的类,实例化一些类以载入初始场景;对象类,负责实现游戏场景里的内容,包括道具、角色,任务,技能等。网络通信时传送的是Command对象及其派生类的实例,它们也放在动态链接库里,并且在外部放一个文本文件,给出每个Command类的ID(整数),序列化时记录下所属类的ID,重建对象时根据此ID生成新的实例,然后根据从网络受到的数据对该实例初始化,做好这些之后调用其基类的接口process(),通过参数把一些必要的数据传进去,这样这个数据包就可以被解析了,而且解析的代码是从动态链接库载入的,因此比较灵活。
3.多线程的封装,我是在boost.thread库的基础上封装的,主要是我有自己的一个Module类:

  1. typedef enum{
  2.     SHUT_DOWN= 0,
  3.     RUNNING,
  4.     PAUSE,
  5. } State;

  6. class EXPORT Module
  7. {
  8.     friend class World;
  9. public:
  10.     Module();
  11.     virtual ~Module();
  12. public:
  13.     int load( Module* __module );
  14.     void unload( Module* __module );
  15.     virtual void operator () (void);
  16.     bool getThreaded(void)
  17.     {
  18.         recursive_mutex::scoped_lock lock( _mutex );
  19.         return _threaded;
  20.     }
  21.     void setThreaded( bool __threaded )
  22.     {
  23.         _threaded= __threaded;
  24.     }
  25.     void setSelfFirst( bool __self_first )
  26.     {
  27.         if( __self_first ){
  28.             moduleBreathe= moduleBreathe_self_first;
  29.         }else{
  30.             moduleBreathe= moduleBreathe_self_last;
  31.         }
  32.     }
  33.     static World& getWorld(void);
  34.     static void setWorld( World* __world );
  35.     State getState(void)
  36.     {
  37.         recursive_mutex::scoped_lock lock( _mutex );
  38.         return _state;
  39.     }
  40.     void setState( const State __state )
  41.     {
  42.         recursive_mutex::scoped_lock lock( _mutex );
  43.         _state= __state;
  44.         _cond.notify_all();
  45.         for( list<Module*>::iterator itor= _modules.begin(); itor!=_modules.end(); ++itor ){
  46.             Module& module= *(*itor);
  47.             try{
  48.                 module.setState( __state );
  49.             }catch( exception& e ){
  50.                 cerr << "Setting State error: " << __state << "\t" << e.what() << endl;
  51.             }catch( ... ){
  52.                 cerr << "Setting State error: " << __state << "\t" << "Unknown exception" << endl;
  53.             }
  54.         }
  55.         for( list<Module*>::iterator itor= _threaded_modules.begin(); itor!=_threaded_modules.end(); ++itor ){
  56.             Module& module= *(*itor);
  57.             try{
  58.                 module.setState( __state );
  59.             }catch( exception& e ){
  60.                 cerr << "Setting State error: " << __state << "\t" << e.what() << endl;
  61.             }catch( ... ){
  62.                 cerr << "Setting State error: " << __state << "\t" << "Unknown exception" << endl;
  63.             }
  64.         }
  65.     }
  66. protected:
  67.     void moduleBreathe_self_first(void);
  68.     void moduleBreathe_self_last(void);
  69.     void moduleShutdown(void);
  70.     virtual int init(void) { return 0; }
  71.     virtual void breathe(void)
  72.     {
  73.         if( _threaded && _state!=SHUT_DOWN && _modules.empty() ){
  74.             recursive_mutex::scoped_lock lock( _mutex );
  75.             _cond.wait( lock );
  76.         }
  77.     }
  78.     virtual void shutdown(void)
  79.     {
  80.     }
  81. protected:
  82.     bool _have_shutdown;
  83.     static recursive_mutex _world_mutex;
  84.     static World* _world;
  85.     bool _running;
  86.     State _state;
  87.     bool _threaded;
  88.     recursive_mutex _mutex;
  89.     condition _cond;
  90.     void (Module::*moduleBreathe)(void);
  91.     list<Module*> _modules;
  92.     list<Module*> _threaded_modules;
  93.     thread_group _threads;
  94. };
复制代码


  1. #include "module.h"

  2. recursive_mutex Module::_world_mutex;
  3. World* Module::_world= NULL;


  4. Module::Module()
  5. {
  6.     _have_shutdown= false;
  7.     _running= true;
  8.     _state= RUNNING;
  9.     _threaded= false;
  10.     moduleBreathe= moduleBreathe_self_first;
  11. }


  12. Module::~Module()
  13. {
  14. }


  15. void module_main( Module* __module )
  16. {
  17.     (*__module)();
  18. }


  19. int Module::load( Module* __module )
  20. {
  21.     int ret= 0;
  22.     try{
  23.         ret= __module->init();
  24.     }catch( exception& e ){
  25.         cerr << "Init failed: " << e.what() << endl;
  26.         __module->moduleShutdown();
  27.     }catch( ... ){
  28.         cerr << "Init failed: " << "Unknown exception" << endl;
  29.         __module->moduleShutdown();
  30.     }
  31.     if( ret ){//error occurs
  32.         __module->moduleShutdown();
  33.         return ret;
  34.     }else{
  35.         if( __module->_threaded ){
  36.             _threads.create_thread( boost::bind(&module_main, __module) );
  37.             _threaded_modules.push_back( __module );
  38.         }else{
  39.             _modules.push_back( __module );
  40.         }
  41.     }
  42.     return 0;
  43. }


  44. void Module::unload( Module* __module )
  45. {
  46.     __module->shutdown();
  47.     if( __module->getThreaded() ){
  48.         _threaded_modules.remove( __module );
  49.     }else{
  50.         _modules.remove( __module );
  51.     }
  52. }


  53. void Module::operator () (void)
  54. {
  55.     try{
  56.         while( _running ){
  57.             switch( _state ){
  58.                 case RUNNING:
  59.                     (this->*moduleBreathe)();
  60.                     break;
  61.                 case PAUSE:
  62.                     break;
  63.                 case SHUT_DOWN:
  64.                     moduleShutdown();
  65.                     break;
  66.                 default:
  67.                     break;
  68.             }
  69.         }
  70.     }catch( exception& e ){
  71.         cerr << "Runtime error: " << e.what() << endl;
  72.         moduleShutdown();
  73.     }catch( ... ){
  74.         cerr << "Runtime error: " << "Unknown exception" << endl;
  75.         moduleShutdown();
  76.     }
  77. }


  78. void Module::moduleBreathe_self_first(void)
  79. {
  80.     breathe();
  81.     for( list<Module*>::iterator itor= _modules.begin(); itor!=_modules.end(); ++itor ){
  82.         Module& module= *(*itor);
  83.         (module.*moduleBreathe)();
  84.     }
  85. }


  86. void Module::moduleBreathe_self_last(void)
  87. {
  88.     for( list<Module*>::iterator itor= _modules.begin(); itor!=_modules.end(); ++itor ){
  89.         Module& module= *(*itor);
  90.         (module.*moduleBreathe)();
  91.     }
  92.     breathe();
  93. }


  94. void Module::moduleShutdown(void)
  95. {
  96.     if( !_have_shutdown ){
  97.         recursive_mutex::scoped_lock lock( _mutex );
  98.         _running= false;
  99.         _have_shutdown= true;
  100.         _state= SHUT_DOWN;
  101.         for( list<Module*>::iterator itor= _modules.begin(); itor!=_modules.end(); ++itor ){
  102.             Module& module= *(*itor);
  103.             try{
  104.                 module.moduleShutdown();
  105.             }catch( exception& e ){
  106.                 cerr << "Shutdown Module error: " << e.what() << endl;
  107.             }catch( ... ){
  108.                 cerr << "Shutdown Module error: " << "Unknown exception" << endl;
  109.             }
  110.         }
  111.         for( list<Module*>::iterator itor= _threaded_modules.begin(); itor!=_threaded_modules.end(); ++itor ){
  112.             Module& module= *(*itor);
  113.             try{
  114.                 module.moduleShutdown();
  115.             }catch( exception& e ){
  116.                 cerr << "Shutdown Module error: " << e.what() << endl;
  117.             }catch( ... ){
  118.                 cerr << "Shutdown Module error: " << "Unknown exception" << endl;
  119.             }
  120.         }
  121.         _threads.join_all();
  122.         if( _threaded ){
  123.             _cond.notify_all();
  124.         }
  125.         shutdown();
  126.         _have_shutdown= true;
  127.     }
  128.     _running= false;
  129. }


  130. World& Module::getWorld(void)
  131. {
  132.     recursive_mutex::scoped_lock lock( _world_mutex );
  133.     return *_world;
  134. }


  135. void Module::setWorld( World* __world )
  136. {
  137.     recursive_mutex::scoped_lock lock( _world_mutex );
  138.     _world= __world;
  139. }
复制代码

这样,Module里还可以有子Module,子Module可以是单独的线程,也可以与父Module共用一个线程(通过Module::setThreaded( bool __threaded )来设置)。
4.引入其他的库。我为OPAL和OGRE新建了一个类,比如对于OGRE:

  1. class EXPORT ModuleOgre : virtual public Module, public BaseApplication
  2. {
  3. public:
  4.         ModuleOgre(void);
  5.         virtual ~ModuleOgre();
  6. public:
  7.     void operator () (void);
  8. };
复制代码


  1. #include "modules/moduleogre.h"


  2. ModuleOgre::ModuleOgre(void)
  3. {
  4.     setThreaded( true );
  5. }


  6. ModuleOgre::~ModuleOgre()
  7. {
  8. }


  9. void ModuleOgre::operator () (void)
  10. {
  11.     try{
  12.         SET_TERM_HANDLER;
  13.         go();
  14.         moduleShutdown();
  15.     }catch( Ogre::Exception& e ){
  16.         #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
  17.             MessageBox( NULL, e.getFullDescription().c_str(), "ModuleOgre error", MB_OK | MB_ICONERROR | MB_TASKMODAL );
  18.         #else
  19.             cerr << "ModuleOgre error: " << e.getFullDescription().c_str() << endl;
  20.         #endif
  21.         moduleShutdown();
  22.     }catch( exception& e ){
  23.         cerr << "ModuleOgre error: " << e.what() << endl;
  24.         moduleShutdown();
  25.     }catch( ... ){
  26.         cerr << "ModuleOgre error: " << "Unknown exception" << endl;
  27.         moduleShutdown();
  28.     }
  29. }
复制代码

其中BaseApplication这个类是由Ogre SDK 1.2.x Application Wizard v.1.2提供的。
总是要引入一个新的开发库时,我会新建一个Module的派生类,并且实现/重写这几个基类里的虚函数:

  1.     virtual void operator () (void);
  2.     virtual int init(void);
  3.     virtual void breathe(void);
  4.     virtual void shutdown(void);
复制代码


*^_^*

45

主题

1163

帖子

1165

积分

金牌会员

Rank: 6Rank: 6

积分
1165
发表于 2006-12-1 18:31:00 | 显示全部楼层

Re:菜鸟求教,我接下来该做些什么?

你已经是高手了,已经走到顶峰了吧

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2006-12-1 18:55:00 | 显示全部楼层

Re:菜鸟求教,我接下来该做些什么?

-_-!  不要这样说……
我到现在连一个完整的小游戏都还没做出来……要说失败的经验比较丰富那倒是真的,嘿嘿

言归正传,我下面该做些什么事呢?

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2006-12-2 01:47:00 | 显示全部楼层

Re:菜鸟求教,我接下来该做些什么?

www.gamelaa.com
邀请你过来我们一起做点事。
你那个blog也别搞了,更新那么慢,灌灌水得了。
我们以这个论坛为基础做游戏相关的事情。

6

主题

125

帖子

129

积分

注册会员

Rank: 2

积分
129
发表于 2006-12-2 01:57:00 | 显示全部楼层

111

111

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2006-12-2 10:47:00 | 显示全部楼层

Re:菜鸟求教,我接下来该做些什么?

lights,我那个blog纯粹是为了能够有个地方让感兴趣的人下载我的源代码,如果有个更好的文件共享的方法我就不弄那个了……

wocen,好久不见,领工资没?其实我也不想重复发明轮子啊……要不这样吧,你找个好用实用的游戏开发引擎,把它的源代码以BSD协议开放,这样我就不用自己发明轮子了,我会直接去使用那个引擎做我想做的游戏了,不过貌似目前还没这种引擎……要我买的话,估计把我卖了都买不起,没办法,穷人只好自己造轮子,谁叫人家要做生意赚钱呢,其实别人要赚钱我也没意见,可是不让穷人自己动手丰衣足食,这就不太好了吧……

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2006-12-2 16:41:00 | 显示全部楼层

Re:菜鸟求教,我接下来该做些什么?

小顶一下

29

主题

405

帖子

405

积分

中级会员

Rank: 3Rank: 3

积分
405
发表于 2006-12-2 18:53:00 | 显示全部楼层

Re:菜鸟求教,我接下来该做些什么?

其实你还蛮好的,就是废话太多,如果我们公司有你这样的人负责文档,那应该非常的适合了,呵呵.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 00:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表