??xml version="1.0" encoding="utf-8" standalone="yes"?>
class Actor;
class ActorManager
{
public:
void update()
{
for (actors_t::const_iterator itr = m_actors.begin(); itr != m_actors.end(); ++itr)
{
Actir* actor = itr->second;
actor->update();
}
}
void add(Actor* actor)
{
m_actors[actor->get_id()] = actor;
}
void remove(Actor* actor)
{
m_actors.erase(actor->get_id());
}
private:
typedef std::map<int, Actor*> actors_t;
actors_t m_actors;
};
而Actorcȝ实现是这P
class Actor
{
public:
void update()
{
// ...
}
有一天,在给Actord逻辑的时候,update函数变成了这?/font>
void update()
{
// ...
update_buff_effect();
// ...
}
再往?/font>
class Actor
{
// ...
private:
void update_buff_effect()
{
// ...
apply_hp(-100);
if (get_hp() <= 0)
{
die();
return;
}
// ...
}
然后……
private:
void die()
{
// ...
ActorManager::getInstance().remove(this);
// ...
}
在写下ActorManager的时候ƈ没有惛_会在update循环里删除对象,而实际上却有几次遇到cM的问题?/font>
有些问题没有q么明显Q但也都是出在遍历容器对象的q程中,某个执行函数删除了窗口里的对象,从而导致P代器失效?/font>
修改的方法很单,lActorManagerd一个待删除对象列表
在removeҎ中ƈ不真正删除对象,而是{到update中@环结束后再删除对象?/font>
代码看v来会是这P
class Actor;
class ActorManager
{
public:
void update()
{
m_is_looping = true;
for (actors_t::const_iterator itr = m_actors.begin(); itr != m_actors.end(); ++itr)
{
Actir* actor = itr->second;
actor->update();
}
m_is_looping = false;
if (!m_removed_actors.empty())
{
for (removed_actors_t::const_iterator itr = m_removed_actors.begin();
itr != m_removed_actors.end(); ++itr)
{
Actor* actor = *itr;
m_actors.erase(actor->get_id());
}
m_removed_actors.clear();
}
}
void add(Actor* actor)
{
m_actors[actor->get_id()] = actor;
}
void remove(Actor* actor)
{
if (!m_is_looping)
m_actors.erase(actor->get_id());
else
m_removed_actors.push_back(actor);
}
private:
typedef std::map<int, Actor*> actors_t;
actors_t m_actors;
typedef std::vector<Actor*> removed_actors_t;
removed_actors_t m_removed_actors;
bool m_is_looping;
};
没有ladd也加保护的原因是Q不会在update函数内向ActorManagerd新对象?/font>
当然Q有可能在其他地方会有这L需求,同样也做cM的保护即可?/font>
问题虽然不大Q但是几ơ碰到类似的错误了。记录之Qƈ强制要求自己Q?/font>
在遇C对容器内的对象做for…处理Ӟ一定要谨慎的检查一下remove接口?/font>
M来说,如果是想做一个比较简单的虚拟现实服务,拿sfs来做q是很方便的,省去了前期构造服务器|络,实现数据库接?数据同步{等一些基功能的时?可以一上来q奔主?开发自己项目相关的功能.
Sfs的接口封装也比较?基本上看到接口名p知道是做什么用?参数是什么意?而且他的文档也比较详l?对于非服务器开发专业h员也比较方便.sfs的定义也主要在此,比如他最早支持的flash客户端api.
而随着sfs的成?也开始将目标转向了目前新兴的iphone, android, sillverlight, unity{?客户?q次使用c# client api做了一个winform试E序,使用h也是非常的方?
W一ơ拿sfs做商业项?也还是遇C一些问?ȝ一?另外q有一些未完善的地?后面再花旉l箋实现.
CustomLogin的处理在zone extension?必须先join room才能使用xt message.所以需要先写一个zone extension,在这里处理登录验?注意验证成功后需要向客户端发送room list, 客户端必L到room list消息才能做后面的操作,q是sfs限制M?
本来我想在extension里让客户端验证成功后直接join room,未果,调试良久才发?客户端未收到room list,不能join room.
Sfs的user variables只支持bool, integer, stringcd,其他cd的数据不能同?q个问题困扰了我差不多一个小?最后在客户端一步步跟踪属性同步过E时才发?其他cd的variable都被忽略掉了.
于是,Z同步float坐标数据,我不得不加上了float.toString(),数据量又大了不少.
Sfs消息定义的方?不要像sample里那?直接写字W串名字,改用枚D或者常量定?每个extension name和command name都只有一个字?在枚举中也可以定义出128?完全够用.
q样可以省不带宽占用量,可以在client上开启debug message开?看一下一个简单的消息发送会占多字?
如果惛_时在eclipse和netbeans下对一个项目进行开?注意文g~码的问?eclipse下创建的文g默认~码为gbk,netbeans下创建的文g默认为utf-8,而在eclipse下导入文件时他ƈ不会自动文件的~码,所?你需要在文g的属性里手动讄一下编码方?另外,netbeans下要在文件中昄中文字符只能使用utf-8,使用gbk会出q,如果出现此类错误,修改一下文件编码方式以及指定新的编码即?
要关于利用IDE~译环境.在项目最开始的一周里,我用trace来进行调?一ơ次的通过trace打印Z间变?然后再修改代?再启动服务器,再看trace信息……在我快要陷入崩溃绝望之?l于,军_Z个好用的集成调试环境.在尝试eclipsep|?我成功的在netbeans中打下了断点,单kh步跟t?于是,整个世界变得清静多了…?/font> 关于如何在netbeans中调试extension,可以参?a target="_blank">我之前的一文?/a> sfs中服务器与客户关通信的协议有三种:xml,json和raw string,使用json会比xml节省不少字节,但其仍然占用比较大的带宽开销.如果是数据交互量比较的应用,q个问题不会太大,但对于即时战斗类MMO来说,可能会成Z个比较大的问?试了一下用raw string的方式传递结构体,但是没找到比较好的方?以后有机会再l箋,如果可能的话,l合google proto buffer和raw string方式,会是一个比较好的方? 在处理extension message?按照CZ所提供的方?先取出cmd,然后使用equal的方式一个个q行比较,然后转到对应的处理函?对于消息U类比较的应用来说q没发现问题,但是对于有大量自定义消息的应?q里需要修改一下了. Sfs的db extension目前看v来只能在当前U程中处?q且是阻塞式?暂时没有试使用多个U程操作数据?也没有把数据库操作改为异步操?q也是未来需要进一步改q的地方. 暂时不清楚SFS是否会ؓ每个room开启一个单独的U程,或者是每个extension一个线E?如果zone里房间数比较多的?分多个线E处理也是需要的,未来也需要l考虑一下多U程的问? Sfs的实现是把一个room当成了一个广播单?q对于开戉Kcȝ游戏来说没有问题,但是如果相用它来做MMO需要注意一?因ؓuser variables的同步是以整个room为单位的,也就是当一个房间里人数辑ֈ几百人甚臛_千h的时?某个玩家的进入和退出房间消?属性修Ҏ息的q播量都会是巨大?但是在没有源码的情况下想要修改这个不大容?也就是限制了sfs的应用环?
]]>
命名规范Q?/font>
q些只有在用于公开暴露l外界的API时才是必需?/font>
标识W大写规则Q?/font>
1.要把PascalCasing用于由多个单词构成的名字I间Q类型以及成员的名字
2.要把camelCasing用于参数的名?/font>
3.不要把闭合Ş式的复合词中每个单词的首字母大写Q比?callback, endpoint {等Q可以查阅英语词典来定复合词是不是闭合?/font>
4.不要使用匈牙利命名法。原因有几点Q一是发明它的ms公司都已l明要求在新的库在不要使用q种命名法,二是变量名前加类型标识符是个很不好的习惯Q在开发过E中有可能会随时修改q些变量的类型定义,三是新的~辑器中不需要用m_前缀来确定其cdQ不q对于内部实现的变量来说Q用一个前~也许会让变量的查找更方便Q比如用一个_前缀
5.不要使用未被q泛接受的首字母~写词,如何定某个~写词是否众所周知有个好方法,到google上搜索一下,如果前几条都是你所期望的内容,那么它就是众所周知的了
关于命名Q?/font>
1.要用名词或名词短语来l类和结构体命名Q用PascalCasing的大写风格Q类名字不要?CQ但是接口前需要加 IQ这是个特例
2.用Ş容词短语来给接口命名Q在数情况下也可以使用名词或名词短?/font>
3.考虑在派生类的末用基cȝ名字Q比?class FileStream : public Stream
4.用动词或动词短语来命名方法,比如 int CompareTo();
5.要用肯定性的短语(CanSeek而不是CantSeek)来命名布属性,可以加Is,Can,Has{前~Q要保使用时的试语句读v来通顺Q比?/font>
if (collection.Contains(item)) 比 if (collection.IsContained(item)) 要通顺得多
此外Q要优先选择d语态而不是被动语态,比如
if (stream.CanSeek()) 比 if (steam.IsSeekable()) 要强得多
6.要用现在时和q去时来赋予事g名以之前和之后的概念Q不要用Before或Afterq样的前后缀Q比?Closing, Closed而不是AfterClose
使用规范Q?/font>
1.优先使用集合Q避免用数l?/font>
2.考虑使用不规则数l,而不要用多l数l,也就是优先用int [][] jagedArrayq样的数l,避免使用 int [,] multiDimArrayq样的类?/font>
3.要用最泛的cd来作为参数类型,大多C集合为参数的成员都用IEnumerable<T> 接口
如果你也遇到了同L问题Q不防也试试最新的昑֍驱动Q也许可以省下两天的郁闷旉
一个是在InitEGL中调用eglMakeCurrentӞ会报告EGL_DEVICE_LOST错误Q我试着这个消息忽略掉之后没有M问题
另一个是在Draw中调用glGetIntegerv(GL_VIEWPORT, (GLint*)&viewPort);时返回的viewPort值是个错误|我又试着为viewPort直接再赋一ơ|{0,0,480,800}Q又OK?
不过q只是部分OKQSample跑v来后我只能看到变化的背景Ԍcube们哪MQ?/font>
遍了bada的forum也没有遇到同L问题Q只是看到几个同栯EGL_DEVICE_LOST错误的,也同h有找到解x?/font>
忽然_我想会不会跟昑֍有关Q我q新装的win7pȝq没有装q显卡驱动,用的是自带的。于是,下蝲Q安装,再打开bada IDEQ于是,q个困扰了我两天的问题就q么奇般的消失了…?/font>
最后,贴张q行效果图以C纪念,虽然只是Sample的效果图Q没有我的半行代码,不过q也困扰了我两天Q不是么
上一ơ打在Eclipse下进行,不知道哪一个环节出错,没能成功Q这ơ改用NetBeans吧,正好赶上NetBeans新版本发布,来试用一ơ?/font>
按照q里描述的方法,很快把Eclipse下创建的工程导入CNetBeans下,不过遇到了点问题,一堆的q。检查了下发玎ͼEclipse下创建的文g~码为ANSIQ在NetBeans下不识别其中的中文注释,把文件改成UTF-8后问题解冻I可后来我再试囑֜Eclipse下打开q些文g旉题又出现了,Eclipse只识别ANSI~码的文Ӟg不大可能吧,不过一时也没找到解x法,暂时攑ּQ改用NetBeans吧?/font>
按照论坛上的Ҏ做就行,不过可能因ؓ版本更新的原因,实际做的时候还是有点差?/font>
Step 1
Download the Netbeans IDE for java development. (47mb SE version should be fine!)
q一步就是这样了
Step 2
Install and open Netbeans. Create a project from existing java source pointing to where your extensions are. Should be placed in src subfolder to be nice.
(I for sure could not make it work if the source was not in a subfolder)
Right click on project and choose properties->libraries. Add all jar files from your smartfox installation lib dir.
在NetBeans下导入原来Eclipse创徏的文Ӟ只需要src目录卛_
导入libraries时注意,按照q里的方法,只需要导?个jar文gQ就是这?/font>
Step 3
Goto Files tab. Expand nbbuild.xml. Click on -post-compile target.
Copy and paste the following code: (Note: adjust todir to point to your smartfox program extension directory)
<copy todir="C:\Programmer\SmartFoxServerPRO_1.6.6\Server\javaExtensions">
<fileset dir="${build.dir}/classes/"/>
</copy>
我的NetBeans下没有nbbuild.xmlQ倒是有一个build.xmlQ不q里面没内容
再看了下Q原来引用的build-impl.xmlQ上面有个简单的介绍Q在build.xml里添加如下内容即可:
<target name="-post-compile">
<copy todir="D:\SmartFoxServer\Server\javaExtensions">
<fileset dir="${build.dir}/classes/"/>
</copy>
</target>
Ҏ你的SmartFoxServer安装目录q行修改卛_
Step 4
Create a new batchfile called SmartFoxDebug?.bat
Copy and paste the following content into it: (Again adjust to your installation directory)
C:\Programmer\SmartFoxServerPRO_1.6.6\Server\wrapper.exe -c "C:\Programmer\SmartFoxServerPRO_1.6.6\Server\conf\wrapper.conf"
q一步不需要,在我安装的目录下直接有个smarfoxService.bat批处理文Ӟ用它p?/font>
Step 5
Add the following lines to your wrapper.conf
Code:
# runtimedebug
wrapper.java.additional.3=-Xdebug
wrapper.java.additional.4=-Xnoagent
wrapper.java.additional.5=-Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n
q里的意思是要在SmartFoxServer里开戯E调试的监听Q在我安装的SFS版本里原来比q多了一w|,所以最l是q样的:
# Java Additional Parameters
wrapper.java.additional.1=-server
wrapper.java.additional.2=-Dfile.encoding=UTF-8
wrapper.java.additional.3=-Djava.util.logging.config.file=logging.properties
wrapper.java.additional.4=-Xdebug
wrapper.java.additional.5=-Xnoagent
wrapper.java.additional.6=-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n
Step 6
Choose Run->Build main project (F11) in Netbeans.
If build is ok, click the batch file. Now select debug->attach debugger and choose port 8888. Debugger console should say "User program running".
Now you can place breakpoints and trigger your extensions normally.
q里是最l我们要实现的效果了Q挂接SmartFoxServer的远EJVMq行调试Q配|项?调试(D) 下的 q接调试?A) Q如果你跟我一样安装的是中文版NetBeans的话
贴张图,是q样Q注意端口号Q是上面配置的那个,不是SFS对客Lq接的监听商品号9393?/font>
好了Q先启动SFSQ用上面说的那个批处理文Ӟ你会看到一行提CZ息,JVMq程调试的监听已打开
然后q接调试?/font>
在NetBeans里打个断点看看,O?/font>
“Android的应用只是一个虚的概念,q没有实际的入口Q这个不像Windowq_上的应用E序的概念,Android更多的是提供lgQComponentsQ的概念。突求和服务Q突出组件个体,弱化边界Q系l的各个lg可以自由的无边界的交,服务h者直接发求,不论q个对象在何处和属于谁的Q组件是自由独立的个体,一个应用程序可以直接请求用其他的应用的的lgQ这个是Android应用框架设计的核心理念,其他的一切都是在个核心理忉|务。?/font>
“让E序员忽略应用的概念Q甚臛_底的抛弃q程q样的概念,E序员看到的是一个一个的lgQ应用程序员利用q些lg来架构成一个所谓的应用Q那么设计者首先要考虑的是什么呢Q我惛_该是一个抽象的应用模型Q在q个模型下生概念和接口。?/font>
“Android中你可以开始一个ActivityQ但是没有权利消灭一个ActivityQ这是个体权利的体现Q个体的消灭是由pȝ军_的,q个是Android中Activity蕴含的h文意义。?/font>
q段ȝ说的非常好,从我q期对Android开发的一些基本了解来看,也确实是q样。在Androidq_下开发,你不需要从头开始构Z个应用,你可以用系l提供好的一些功能,或者是别h的应用程序中已实现的部分功能Q拿来组装自q应用Q当Ӟ你做好的应用也可以把部分功能暴露l别人来使用。具体说来,是Activity与Intent的用?/font>
Zq样一U模式,Android开发更像是堆积木,当然Q这是理想状态下的。Google最q不是就推出了一N过web上的lg拖拽p生成一个自定义的应用程序的工具么,当然Q我只看了下介绍Q还没有Z亲自体验Q不q,q终是未来的趋ѝ?/font>
当然Q这对于开发h员来说是好事Q你可以更加快速的把自qx变成现实Q你不用亲力亲ؓ的去做每一件细的事情?/font>
对于手机使用者来_q同h好事。用统一的Activity构徏出来的应用,不论是外观还是用方式上都是完全l一的,用户拿到一个新应用时基本上不会有太大的使用斚w的成本?/font>
而对于Google来说Q这当然也是好事。Google可以把他的云计算服务都做成一个个的组Ӟ应用开发者们可以随意l合上自q应用中,q对于Google推广自己的服务将会是一仉常有益的事?/font>
当然Q目前来_lg的提供还q不完,现在来开发一个应用,q是需要自己做很多工作Q仅有少部分服务可以直接调用Google提供的IntentQ而调用别人的Activity很难得到保证Q比如对别h的应用的依赖Q比如接口的保证Q等{。另外,目前各手机厂商在定制Android旉提供了自qUI senceQ而各家也都不一P再加上Android原生的,q也使得UI的统一发的难Q不知道未来会如何处理?/font>
在移动互联网到来的时候,能够做点什么呢Q一点不成熟的想法,单记录之?/font>
门户Q让每个用移动终端设备的人,不论是iphoneQandroidq样的智能手机,q是ipadQ^板,抑或是WebOSQGoogleQMeGoo的上|本Q他们打开讑֤后第一个运行的软gQ门戯Y件?/font>
从这里,他们可以使用Ud互联|的l大多数服务Q比如说Q查找本C息,览感兴的新闻和博客,看看好友们的最新动向,{等。他们不需要打开览器,不需要记住一个个烦h的网址Q也不需要在Google或是Baidu输入一些精挑细选的关键字,他们所要做的仅仅只是打开q个门户软gQ然后,一切尽在眼前,而且Q你使用q个软g的次数越多,他越能了解你的脾性,来能猜到你想q什么?/font>
UCWeb在这斚w已经先走了很大一步。现在的ucweb已不再只是一个单一的浏览器Q打开UCQ你已能如我前面描述的那P完成大部分想做的事,包括新闻聚合Q包括博客订阅,包括生活信息查询Q当然也包括QQQMSN{聊天工L整合以及校内Q开心网{入口?/font>
Z地理位置的信息提供,可以与娱乐相l合Q做成一个集C交、生zM一w的休闲应用Q你可以在这里找C感兴的一些信息,而且Q是Ҏ真实位置qo好的Q也是_你看到的l大多数信息都会是你感兴的?/font>
在机锋上Q找C个叫帮飘信的软gQ有那么一Ҏ思?/font>
q有Q完全娱乐化的社区^収ͼ可以利益于移动互联网的优异特性,随时随地都可以接入,不用花太多时_与认识的不认识的朋友有那么一点交互,比如在地铁上Q睡前Q办公室开差的时候,都可以。内容简单但不失乐趣的娱乐小应用?/font>
Zh|,开心网Q白C会QFacebookQ或者是摩尔庄园Q浪漫庄园,再或者是各类三国web gameQ其实,q些本n都可以从l端讑֤接入Q当Ӟ除了iphone以外。不q,q些专ؓpc设计的娱乐^台到了手Zq是会有些问题,包括视觉效果的问题,交互性的问题。我觉得Q做一个专为移动终端^台设计的摩尔庄园Q嗯Q挺有点意思?/font>
关于TabHost的大多数例子里都是把所有的Tab设|到了同一个ActivityQ而实际制作中我们希望为每个Tab用一个不同的xml布局Q正好Android Tutorials中有一个Tab Layout的例子,可是Google的h漏掉了很重要的一个步骤?/font>
例子在android-sdk目录?docs/resources/tutorials/views/hello-tabwidget.html
按照Tutorial做完后,始终无法正确q行Q尝试着不断修改Q当把TabContent指定为xml中配|的view时就不会有问题,但我希望每个Tab|一个单独的单元Q有自己的xml布局Q有自己的Activitycd现。终于,在l求助于Google之后扑ֈ了问题所在:需要ؓ每个自己定义的Activity到AndroidManifest.xml中声明一下,具体是q样Q?/font>
<activity android:name=".ArtistsActivity"></activity>
<activity android:name=".AlbumsActivity"></activity>
<activity android:name=".SongsActivity"></activity>
上面的name是自己声明的AndroidcdQ做相应的修改即可?/font>
q里有一个详l的说明Q?/font>
http://stackoverflow.com/questions/2209406/issues-with-android-tabhost-example
Google Code上也有h贴出了这个issueQƈ且有解决ҎQ?/font>
http://code.google.com/p/android/issues/detail?id=4183
也许你也遇到了这个同L问题Q希望能走点弯?:)
“约。罗梅洛Q王牌程序员”罗梅洛的第一个称P虽然是他自封的,但绝不过誉。当Ӟ在他遇上卡马克后他也会变得谦虚v来?/font>
卡马克,一个进q少所Q也呆过天才班的奇子兼只上过两个学期大学的火科学家?/font>
天才E序员:
|梅z在他还是孩子时Q就l自q公司取好了名字:思想软g Capital Ideas。雷恩,另外一个听着重金属,看着C漫画Q玩着游戏长大的叛逆程序员Q一h他的公司Q不q与|梅z一P也是公司里的光杆oQ他的公司叫蓝山U技 Blue Mountain?/font>
当他们俩盔R的时候,两个光杆o合ƈ成了一家新公司Q深思Y?Ideas from the DeepQ也是ID的前w?/font>
|梅z,卡马克,hQ这三个E序员在软盘杂志C遇的那一天,也同样开始了PC游戏史上的一D传奇历双Ӏ很快,王牌E序员就领教了天才小子的厉害。天才小子也ƣ赏王牌E序员n上的艺术气质Q还有他的设计创意?/font>
汤姆Q二十五岁的E序员,与罗梅洛一P也是个喜剧演员,同时也是一个优U的游戏设计师Q还是一个不错的现实主义Od?/font>
艑֯d里安Q一个黑色主题艺术家Q他其实只想在Y盘杂志社做个D术师,赚着比其他地方稍多点的薪_直到他遇C|梅z跟卡马克?/font>
Z永远只会留给有所准备的hQ这话一点不假?/font>
MM们的履历Q也׃会憎恶上帝太q于眷顾q群伙子?/font>
走出W一步:
在那个晚上,汤姆与卡马克山寨了超U马里奥Q卡马克的天才技术让另外两位E序员不得不Ҏ?/font>
“罗梅洛被这H如其来的惊喜惊呆了Q他动弹不得Q甚至站都站不v来。直到几个小时后卡马克回到办公室Q他才有力气说话。他只有一件事要告诉他q个朋友Q这个编E天才,q个l配般的搭档Q?/font>
‘不用想了,我们Ch’?/font>
当然Q这只是|梅z的一句冲动话Q就像他以前l常有过的那P不时的会冲动?/font>
可这一ơ,|梅z的冲动开始当真了?/font>
?990q??0可个宿命的早晨Q这个早晨对他们俩都是一个意义重要的时刻。卡马克用他非凡的专注解决了一个迫切紧要的挑战Q罗梅洛则预见了q成果可能带来的一切。就仿佛Q卡马克制作好调色板Q然后罗梅洛用这调色板描l出一个未来。?/font>
“他们已l有了一个梦qd队:卡马克,天才子和图像领域的领头;|梅z,游戏制作的多面手和公司的啦啦队长Q艾德里安,沉迷于黑暗主题的艺术Ӟ汤姆Q游戏设计师和超现实M漫画Ӟq有hQ虽然不那么令h满意Q但也还是个不错的程序员。?/font>
不过冲动归冲动,生活q要l箋?/font>
天才子们的价值在q没有被认可之前Q他们也一栯打工挣钱买盒饭?/font>
所以,与很多的创业团队一P他们“借”用着公司的资源,做着自己的事。在那个时刻QPC机是奢侈品,惌回家自己q都是一仉常困隄事,于是Q他们便在周末把公司的电脑“搬”回家去qӀ?/font>
l于Q指挥官基恩在他们手下诞生了?/font>
不过Q这q只是迈ZW一步,一步而已。这时可不能MD妄动?/font>
有句话说的好Q?/font>
公司的事再大也是事Q?/font>
自己的事再小也是大事?/font>
为未来的Z作好准备Q怎么dQ?/font>
当然不是说在公司里拿着薪水却干着自己的私事,但是Q每天八时之外的时_有没有好好利用v来,q也决定了人生不同的走向?/font>
扑֯好搭档:
|梅z,卡马克与艑֯d里安Q可以称作是ID的铁三角?/font>
而罗梅洛与卡马克二h又是q铁三角里的重心所在,也是游戏合伙人搭档的典范?/font>
“罗梅洛和卡马克在性格上有个很显著的不同,那就是他们对待时光的态度Q正是这U内在秉性的差异Q他们成ؓ最x档,也他们无可挽回的决裂?/font>
卡马克只zd当前时刻。专注,是他力量的源泉?/font>
|梅z则完全相反Q他沉浸在所有时光里Q过去,现在Q将来。他不止是充满激情,他还付诸行动。?/font>
q一静一动的关系正好互补?/font>
不仅如此Q卡马克的技术与|梅z的创意更是天才搭档?/font>
手术师约ͼ被看作是地球上有史以来最牛B的程序员?/font>
引擎师约ͼ被誉为摇滚之,q当然不是因Z的摇滚乐?/font>
当卡马克创造出了新的技术,|梅z总能发现q技术的应用之处Qƈ能把他的潜力挖掘到最深。而当后来|梅z离开ID之后Q卡马克只能失望于他所创作出来的史上最强大的引擎,却没有h能来推动他?/font>
“尽卡马克从未公开表示q他怀念过ȝIDQ怀늽梅洛那o人眼qq构思和设计Q但卡马克清楚地知道Q现在的ID已不再是从前的IDQ现在的ID已经没有了自发的动力。?/font>
不过Q太大的性格差异最l也会生问题,
“罗梅洛惌建立一个帝国,而我只想安静的写E序。”许多年以后Q当卡马克回忆他与罗梅洛的分LQ他q样说道?/font>
我们所看到的,所传诵的,永远只是天才的故事?/em>
自己不是|梅z,当然不敢奢望能与卡马克这L天才合作?/em>
自己也不是卡马克Q于是也找不到罗梅洛q样的伟大设计师?/em>
但是Q在L搭档的时候,一个与自己能够优势互补的h会更合适?/em>
另外Q性格上有一些差异也能让团队未来不至于走向一个死胡同Q至于最l的册Q这个可以进行控制?/em>
一定会有挫折:
与所有充满激情的创业团队一P他们的第一ơ也遭遇了挫折。当他们借用公司的机器,l过几个周末的通宵努力Q把PC版的马里奥寄lQ天堂Ӟ得到的答复却是:伙子们Q干的不错,但我们对PC机没有Q何兴?/font>
没关p,Z一定会降到那些有所准备的hw上?/font>
虽然d堂拒l了q几个天才小子的热情Q但l有看出q群天才们的价倹{?/font>
c_d联系上了|梅z,q向他展CZ׃n软g市场的美好前景,q且l罗梅洛开Z35%的高比例分成Q而且q提前ؓ他们支付了订金?/font>
把游戏按照共享Y件的模式dQ先Z个免费的兛_Q如果还想l玩后面的内容,那么Q付钱。这U模式在现在仍然q流行着?/font>
由此Ql在周末借用着公司的电脑,指挥官基恩诞生了Q这是他们的W一W收入?/font>
当然Q在他们“借”用公司电脑的同Ӟ他们也没有忘了给公司做一些东西,以对得v拿的薪水Q还有不引v老板的注意。也在此ӞW一ơ出C有hdQ雷恩,已经多次掉队的成员,|梅z没有显C更多的宽容?/font>
当指挥官基恩上市以后QID每月的收入ؓ一万到两万元Q这是在1991q_而那一q_卡马克二十岁Q罗梅洛二十三?/font>
最l,ID有了三位创始人:|梅z,卡马克和艑֯d里安?/font>
在遇到重大选择的时候,每个人都有自q出发点,自己的判断标准,应该重q些不同之处。虽然汤姆和C一开始没有走出来Q但他们仍然是朋友,很好的朋友,每个周末仍会来ID玩玩龙与C城。以后的日子里,他们q会走到一赗?/font>
培养出默契:
在ID正式成立后的W一个项目,德军总部3D开发的日子里,卡马克与|梅z的默契正式开始徏立?/font>
“卡马克不是一个多愁善感的人,他的记忆里没有多感情方面的东西Q但他记住了q个画面Q记住了q不同寻常的一刻,以后的日子里Q他愿意回想P在一个暴雨滂q夜晚Q罗梅洛淌过齐腰qxQ只Z赶回来工作?/font>
搭档之间的默契,正是通过q样的小事,通过q肩作战培养出来的?/font>
当然Q默契也不代表Q何时候都能够l一?/font>
在制作d军总部3D的过E中QID的hW一ơ在游戏设计上发生了的分歧。汤姆试图游说卡马克l场景中d可以~进ȝ墙,而卡马克以破坏Y件设计ؓ由拒l添加。当|梅z也试图再次说服Ӟ卡马克的回应是:qg事提都不用提Q?/font>
是的Q在IDq样的梦qd队里Q在天才E序员卡马克那里Q依然也有程序员不能做,或者不愿意做的事。程序员都是固执的,有时候带有很明显的偏见?/font>
不过Q如果你能让他自p识到q事是应该做的,他也很乐于被你说服。最l,卡马克在某个晚上d做好了一个可以羃q去的墙?/font>
让合适的人做合适的事:
在指挥官基恩占据׃n软g排行榜首位一q之后,瑞恩来到了IDQƈ告诉他们Q卡马克的技术在业界是首屈一指的Q公司应该有人来d发掘q技术的价倹{最l,瑞恩成ؓ了ID的经理?/font>
让合适的人做合适的事?/font>
王牌E序员罗梅洛虽然是一个充满激情的多面手,但他最在行的还是游戏业务,q是设计师,q是E序员,关于怎么打理生意Q当焉要更合适的人?/font>
卡马克,永远只爱写他的程序,永远不在意生意那摊子烂事?/font>
汤姆Q这时汤姆终于加入了q来Q他那源源不断的奇思妙惻I使其当之无愧的成ZID的主设计师。他也有他最重要的事要做?/font>
所以,找一个CEOQID不止一ơ找qCEO?/font>
“就像所有艺术家和程序员一P他们不喜Ƣؓ生意上的事情烦心Q他们更乐于专注于自q领域。而且Q他们越投入游戏制作Q他们就厌烦那些堆U如q例行公事。公叔R要有个新的负责hQ这ơ,他们又主动去l自己找CEO了。他们的老朋友,CQ以5%的股分加入了ID。?/font>
理性h的思考应该是以利益最大化为目标,让合适的人做合适的事显然能让利益最大化?/em>
当然Q每一个有心做事的人,或多或少的都有一些野心,有那么一些控制欲Q如何协调好q个关系Q需要费点心思?/em>
每个人都是舵手:
指挥官基恩,汤姆的设计,包括故事的背景,人物的Ş象,q有那些游戏Ҏ。这Ӟ卡马克与|梅z忠实的做着手术师:E序员,让汤姆的奇思妙惛_以实现?
而下一ơ,ID的舵手{Ud了罗梅洛w上?/font>
德军总部3DQ可以说是早期主视角3D游戏的最有媄响力的代表作之一Q这一切的灉|都来自于|梅z,而这天才的实现则卡马克,在这个最Ȁ动h心的时刻Q他们只有四个hQ罗梅洛Q卡马克Q汤姆和艑֯d里安。是的,很多名字已经成ؓ了历双Ӏ?/font>
德军总部3D的巨大成功让ID正式独立出来Q成Z家完全独立的工作室,自己负责从开发到发行的所有事务。但工作室成员还是那么几位?/font>
C一ơ,DOOM的时代,公司的重心{C卡马克?/font>
每一个游戏制作h大概都会有一个理想中最完美的游戏,让每个h都能实现自己的理想也怸大现实,但是Q让每个人都能充当一回舵手,带着大家向自己指引的方向前进一D|_q将会让每个人都觉得自己的h生更有意义?/em>
但是Q每个h做事的风g一Pq里面也会有问题?/font>
卡马克的固执会把主设计师的设计文档骂得一无是处:“游戏的故事背景Q就好比色情片里的情节,虽然要有Q但Ҏ不是关键”,也可以随意更改目标,让汤姆的设计文档变成废纸?/font>
但是Q罗梅洛却能很好的找到自q位置Q充分发挥着天才E序员创造出来的东西Q试验着新引擎的Ҏ,挖掘其潜能?/font>
l于Q没q多久,卡马克向|梅z徏议解雇汤姆,q意味着Q公司将W一ơ出现创始h的离开?/font>
一个合理的保护制度Q?/strong>
早在ID成立之初Q他们就坐在一赯Q所有h都诚心地同意QID的命q,而不是他们Q何h的命q,才是最重要的。无谓的内耗会l公司带来多么致命的伤害Q他们不希望ID毁于q样的事情?/font>
他们达成两点协议Q首先,解雇一个持股h需要公司其他持股h的一致同意,那时Q艾德里安,|梅z,汤姆Q卡马克是最主要的持股hQ凯文和C也有量股分。其ơ,一旦被解雇Q这个h失M所有的股分Q公司的未来和他再没有Q何关pR?/font>
|梅z希望能再给汤姆一ơ机会,他说服了卡马克。可是,没有人再能忍受汤姆,所有h都要求马上解雇汤姆。罗梅洛只好同意?/font>
在全体持股h付方上,汤姆走进ȝ时候,大家都低头坐在桌辏V卡马克开口说刎ͼ公司昄不能再这样下MQ我们要求你职?/font>
汤姆的离开需要一个任者,37岁的桑_来到了ID。他接手|梅z的事,成了ID的游戏设计师Q罗梅洛又回CE序员,兼音效师Q兼打理生意?/font>
什么时候能够收手:
DOOM的成功让ID成就了事业上的辉煌,但也造成了罗梅洛与卡马克的分R罗梅洛不仅x公司做大Q他q有其他动机Q乐。罗梅洛热爱游戏Q他zȝ是Z玩游戏,他现在的生活是DOOM的世界?/font>
卡马克看着屏幕上闪烁的光标Q沉默不语。曾l有多少个夜晚,|梅z就坐在他n边,和他一起完善引擎,和他一赯试排错,直到东方渐白。今夜,卡马克目送着那印有“制作者”的背媄消失在门口?/font>
创业什么时候是个头Q什么时候能够坐享成果。毕竟这么努力是Z有更好的生活Q不是每个h都能做苦行僧Q当团队有了一定的成果Ӟ应该允许大家选择新的生活方式Q不应该太过于苛责?/em>
在罗梅洛dID后曾l评仯卡马克,说他是苦行僧。虽然这时他的言论带有一些偏见,但也能反应一些事实?/font>
“在公司有钱以后Q依然把公司弄的非常陋,依然不懂得n受,q是日夜达旦的在那里写他的程序,最要命的是Q依然还要求别h也如他一栗?/font>
应该清楚Q辛苦努力的目标是什么?/em>
不是每个人都能让自己的一生满是辛苦,我想Q大多数人愿意这么辛苦的Ҏ目的q是希望能够在不久的来不需要再辛苦Q所以,什么时候收手,q也是值得讨论的?/em>
分开不一定是坏事Q?/strong>
在罗梅洛忙于M竞赛的时候,卡以克ؓID扩充了两位新人:囑Ş学泰斗亚伯拉什和关卡设计师麦基?/font>
卡马克的苛责l于让设计师们不堪忍受,|梅z拨通了好朋友汤姆的电话Q打创立一家以设计Z导的公司。麦基,也不再是童麦基Q而是孤独者麦基?/font>
Quake刚结束,|梅z在ID的日子即结束,卡马克觉得他没有到他的工作。虽然艾德里安试囑֏对,但谁让卡马克才是ID的h值核心呢。如果卡马克dQ那么ID不复存在?/font>
卡马克与|梅z之间的分歧太大了,对于什么是制作游戏以及游戏应该如何制作Q他们都有各自的观点Q卡马克认ؓ|梅z已不再是程序员Q罗梅洛认ؓ卡马克不再是玩家Q卡马克只想有一个小公司Q而罗梅洛惛_大?/font>
当卡马克看着|梅z毅然{w离LQ他没有看到一丝留恋或悲伤Q相反,他觉得这对罗梅洛是一U解脱。卡马克相, |梅z又t上了新的征E?/font>
也许Q每个h都有他自己对未来的期望,每个人都有他对如何做好一件事的看法,不一定能够获得完全的认同Q求同存异,当差异实在太大时Q分开其实Ҏ个h都是最好的选择?/em>
两天后,|梅z在ID的办公室告诉世界Q我已决定离开ID软gQ成立一家有着不同目标的游戏公司,我不会从ID带走M人?/font>
W二天,卡马克更C他的日志Q罗梅洛已离开IDQ我会竭全力?/font>
一场死亡竞赛曲lh散?/font>
游戏目前已经不是个h英雄能够全盘搞定的项目,所以,合作是必然的。当Ӟ如果有够的力Q凭着自己的个人品牌h|或者够打动投资h的策划案Q直接拉来投资,然后雇䄦其他人来q活Q这样就不用考虑创始人合作的问题。但是,对于l大多数的技术创业h员来_q还不是那么的靠谱,q是需要与合伙Z道从零开始努力?/font>
合伙Z间面临的W一个问题,也是最重要Q最Ҏ的问题是如何分配利益?/font>
当然Q你可以很容易的_Ҏ付出来分配收益。可事实上,q个的可操作性ƈ不强Q付出如何衡量,每个人的重要性如何界定,q都是很N化评L。很多时候,q大概也只能靠大家来协调Q来让每个h都能基本满意吧。或者,有那么一两个有魅力的合伙人,来给大家上一W明白̎Qƈ且让大家能够怿q个未来实是美好的?/font>
臛_Q很多h的徏议都是,q_分配不是一个好L?/font>
如何分配利益Q我有过一个粗的x?/font>
每个有意合作的hQ拿Z个对未来三年后的最低利益期望,q个期望D比自己在目前工作情况下,所能获得的最大收益要高,具体高多那是自己的预期,另外再有一个稍高一些的期望倹{我惻I如果是诚心合作做事的人,q个期望值的提出不会太离谱。我也认为,有可能在q些人的期望g间获得一个^衡。当Ӟq需要协调者做比较大的努力Q也许在q个q程中会有h因ؓ不满意而退出,但从一开始达成^衡要比将来再扯皮要好得多?/font>
W二个问题,如何做决{的问题?/font>
先不考虑在引入投资h后的投票权问题,单单只说合伙Z间。最乐观的期望是让每个h都能参与到决{的q程中来Q让每个人都真切的感受到自己在创业的核心里。但实际上,q实行v来可能也是不大可能,或者效率会很低下,或者引发的矛盾会更多?/font>
也许Q一两个强有力的决策者能让这个过E更畅Q但是,q个决策l对不能影响到其他每个h的利益?/font>
也许Q找对了人,qƈ不会是多大的一个问题?/font>
然后是成员离开的问题?/font>
看到q一点,我又惌v了DOOM启示录。这本书也是一本好书,我认真的过两遍。如果失M做游戏的Ȁ情,那就看看q本书吧。看看那一伙充满激情的q轻人是怎样走到一P怎样通力合作Q怎样创造出一个又一个奇q,当然Q也要看看最l他们是遇到了怎样的问题而不得不分道扬镳的故事?/font>
对于每一个合伙hQ即使有一天不能再一起合作,不能同时走到最后,那也依然q是非常好的朋友。至,当初是因为相互信任,有共同的理想与目标才走到一L。罗梅洛和卡马克在很多年后不也还是共同走q了那个会场么。当Ӟq个期望也可能太q于理想化,看看业内的情况大概就能知道,一旦离开Q基本就成了ҎQ这q是比较好的情况。不q,期望L好的?/font>
如果真的很不q,有h必须要离开Q不是Z怎样的原因,d的还是被动的Q当然要保证留下来的人和留下来的目不受损害。不论离开的这个h是谁。罗梅洛从id的离开其实也是很友好的Q甚臛_以说是多赢的。这U方法也未尝不可以借鉴?/font>
有关每个人投入的问题?/font>
q个可能会比较棘手一些。尤其是当合伙h中有人面临比较大的生zd力时Q比如有家族Q有孩。这个又涉及到另外一个问题,什么样的h适合创业的问题?/font>
q不是每一个想法的实现都能一帆风,也许q个努力奋斗的过E会相当艰难Q也许在很长的一D|间里大家都只能靠在别的地Ҏ工来生活Q这Ӟ如何去衡量每个h的付出,如何去评h个h有多投入Q会是一个更大的问题。也许,q还会给未来的利益分配埋下争执隐患,也许Q这也会成ؓ一些hd的直接或间接原因。但是,q也可能是一部分创业团队的必l之路吧?/font>