杀手5与孤岛惊魂3玩后感觉

0

这两天在玩《杀手5》,这是款秘密潜入类的游戏,在被敌人发现的时候我习惯从头再来,当然被发现的几率还是挺高的,哈哈,我在考虑为什么我能够不厌其烦的从头再来?
而相对于也正在玩的《孤岛惊魂3》来说却没有这样的感觉,相反却有想放弃的想法了。

曾经看到这么一句话是说,好的设计应该是当玩家失败时玩家想到的是从自身找问题,而不是抱怨游戏机制的问题。
换句话说,如果玩家失败时能明确知道失败的原因是因为自己的操作,而且能够知道怎么避免同样的操作的话,玩家就会乐于再次继续游戏;相反,如果玩家做了正常的操作却失败了,不知道为什么会失败,或明显这样的失败是游戏设计本身的问题,则玩家对该游戏的印象则会大大减分,甚至会将这种印象带到接下来的游戏历程中直到放弃。

《孤岛惊魂3》刚开始玩的时候印象还是不错的,因为相对于我尝试玩过几遍但都没有坚持玩完的《孤岛惊魂2》来说难度减小了不少,但我现在又有想要放弃3的想法了。
3里面有个游戏玩法,是自己可以制作强化能力的药剂,也可以制作增加弹药容量的包裹等,但首先得搜集材料,每个材料占用一个包裹空间,最令人烦恼的就是包裹是有容量的。
当在野外时突然发现包裹满了,你有三种选择:
1. 背着满着的包裹继续朝目标前进,但你将再也不能拿起任何奖励了;
2.飞回商店把东西卖了,但之前的位置算是白跑了,你得再跑回去;
3.仔细分析包裹里的东西,把最不需要的东西扔了,但你能仍几件?
我并不觉得这几个选择哪个更有趣一些,对我来说无论哪个选择都是痛苦的,而且是很频繁地面临这三个选择。。。。

再就是枪械的瞄准星问题,孤岛惊魂游戏的是没有一般FPS的十字准星之类的,是直接真实的使用枪械模型上的准星,这也是难度之一,但也是这个游戏的特点之一,我倒是挺喜欢这样的真实感。但,商店里有卖电子瞄准镜之类的瞄准星的,我花了300买了一个,但坑爹的是瞄准镜上有个丁字蓝色灯光的辅助准星,这个丁字准星之亮、之粗完全将我要瞄准的目标给遮挡住了,开枪的话都不知道自己在打什么。你能说是我操作有问题吗?我的枪法不准吗?我只能说是游戏机制的问题。

再说下捡敌人身上的东西。敌人死亡之后可以搜刮一下敌人的尸体,但常常尸体旁边就是敌人的枪械,搜刮尸体与捡起枪械使用的同一按键,所以想要搜刮尸体而不至于捡起了枪械,就要小心翼翼走到尸体旁边,不断来回左右移动直到出现搜刮尸体的提示,然后才从尸体上搜出2毛钱。。。

技能。在我看来,技能是由很多鸡肋的,居然还有能够一次获得两张皮的技能,还嫌我的包裹不够满嘛?
估计是将很多有用的升级技能放到了制作系统当中了,所以有很多滥竽充数的技能。

现在我一直在直接做主线任务,希望能够尽快结束。玩到现在耗时最多的就是以上这几点,在我看来这几点完全是在拖延游戏时间。

再来看下《杀手5》,首先它就没有包裹的概念,所以就谈不上包裹满了的情况,它只有6个功能明确的道具栏。但游戏过程中他也需要进行选择。
当有个敌人在面前,你可以选择杀了他,也可以绕过他,也可以换上伪装骗过他,这将是你面临的最频繁的选择。这与孤3那三个选择最大的不同在于,这三个选择将会对目标的完成产生影响,也会对这次任务的评价产生影响;而孤3那三个选择,无论你选择哪一个,对当前的任务目标都没有任何影响。
还有一点是,杀手5对你做出的决定而导致的结果会很快的反馈给你,比如如果你杀死了守卫,则评价会立即扣掉一定的分数,这将影响玩家会选择尽量做个沉默杀手。孤3里面并没有类似的机制,所以不做比较,但有一点是需要说明的,那就是杀5会将当前情况简单明确的告诉玩家,而孤3呢?拿包裹里面的叶子与毛皮来说,是比较乱的,你不去一个一个的数一下你是不知道你到底有多少不同的叶子与不同的毛皮。而且不同叶子的图标形状是如此相似,不同毛皮之间的区别更是无法辨别,不得不说这是非常失败的。但话说回来,毕竟是做FPS出身,第一次做包裹、制作这类系统,勉强无可厚非。

算了,我并不是在评论两款游戏,而是想从他们身上找到点什么然后运用一下,总结一下,这里得出的结论是需要验证:
1. 频繁出现的选择要能够影响当前任务目标的结果(不一定是系统给予的任务,也许是玩家自己给自己定的任务)
2. 简单快速地将重要信息反馈显示给玩家(设计心理学)
3.如果怀疑一个系统或功能的作用,立即抛弃(不要鸡肋)。不要将一个系统可以完成的功能分成两个系统,然后再分别在两个系统添加无力的东西用来填空
4. 功能键操作简单,不要有冲突的

其实我最想探讨,最想研究的就是,怎么才能让玩家不厌其烦的重复。

音乐编辑器基本完成了,哇哈哈哈

0

感觉这个这个做的有点快,界面也很山寨,很多代码写的都。。。感觉不太好看,但功能都是有了,哈哈哈。

分了三个页,第一页就是编辑查看各个音乐的配置属性,编辑还没有写,明天写。

第二页是对背景音乐的测试,可以将指定的音乐加入到列表,然后设置FadeIn,FadeOut什么的就可以播放了测试效果了。

第三页是对特效池的测试,将指定的特效加入到列表,然后设置间隔时间范围,播放测试。如果间隔时间太短导致Channel数量迅速达到32,就悲剧了。。。。这个在实际游戏运用中的时候要小心的说。

3e5699ab4d06eb455601e&690

3e5699ab4d06ebb256cf4&amp

 

音乐管理数据完成

0

这两天在做声音相关的管理类,本来在纠结SoundManger的职责,后来还是用了原工程的SoundManger,因为实现的是最基本的功能,而对于区分出来的背景音乐、特效音乐等等都有他们各自的循环特点,所以为了实现其各自的特点,再分背景音乐与特效音乐的管理。

其中背景音乐的主要特点是:可以指定一首音乐播放前的Delay时间,并能够设置FadeIn,FadeOut效果的时间,还要能够播放一个列表,而不只是循环一首曲子而已。

对于特效音乐,有一种功能需要实现,即能够在几个特效音乐中在随机间隔时间随机抽一个播放。比如要描绘一个晚上的音乐场景,可能其中有蛐蛐声,微风吹过的声音等等特效音,就可以使用这种功能。

 

做完这两个管理类之后才发现,其实这是两种功能,并不一定要应用到背景音乐与特效音乐,是完全可以通用的。

在做特效音乐的这个功能时,测试的时候播放了三十几次之后再后面虽然看出也是在播放,但却没有声音,后来查原因是因为FMOD有个Virtual的概念,一次只会有32个Channel播放出声音(每个声卡),其他Channel会根据音量大小、播放位置、优先级等等检测,如果更有优先的权力则会踢掉32个之中优先权力最低的然后它来播放。

但想不通一个特效音只有几秒的时间,怎么播放完了没有释放Channel的句柄?后来才明白,只有当Channel调用了stop之后才会释放句柄。同时也明白Channel::isPlaying获取的bool值是不受paused,mute影响的。

 

明天准备做下音乐数据的编辑器,嗯,这两天做完,音乐的原型就搞定了。。。这个原型有点全啊哈哈哈

从“贴标语”说

0

看到“改作风”的新闻,意思是整理官员作风,“不张贴标语横幅”、“不安排群众迎送”。。。

我当政策一贯是治标不治本,此次发布的条文延续了这样的作风。

既然有“贴标语”这样的现象,那就应该先分析下“贴标语”的原因:给领导面子,说白了就是逗领导开心。

为什么要让领导开心?这才是应该关注的本质问题。因为他掌握了下级的生死,倘若由下级掌握领导的生死,那领导来了咱还有必要“贴标语”逗领导开心吗?

话说上有政策,下有对策,既然不让“贴标语”了,我自有其他法子同样可以逗领导开心。。

这样的条文的发布,也只是用来逗愚民开心而已。

 

说下今天的进度吧,在公司倒是没做什么,总是在考虑SoundManager的职责,是要负责全部类型的音乐呢还是一个Manger负责一个。。。额。。。

 

然后晚上回家做了FunctionHelpViewer的标签过滤功能,然后CRichEditCtrl对获取的文本如果有回车键的话,保存会有问题,所以对文本中的回车键做了下处理;还有CRichEditCtrl居然输入不了tab键,也对这个问题做了些处理。如果没有其他严重的BUG,这就是最终版了。

明天继续研究SoundManager…

对面的点心店关门了

0

对面的点心店果然关门了,记得两天前去买饼干什么的,老板就说了一句“最后三天”了,这里租金太贵,找了一个月的地方还没找到,还不知道要怎么办呢。。

唉,也许我也早晚有那一天,“还不知道怎么办呢”。

 

今天继续研究下声音系统的概要设计,已经基本完成。然后将FuncHelpViewer的标签部分写完,不过根据标签进行筛选还没有做,这个不急,整个东西已经可以使用了,截个图纪念下:

3e5699ab4cff62e5d8a55&690

 

然后明天准备看下以前写的那个音乐感觉,估计只能参考,不能拿来改了,也要概要设计下程序了,应该先写下编辑器。单机不同于网络游戏,对音乐的选择非常重要,所以完善下音乐感觉用来记录众多音乐的特点,到时候好筛选。

关于公司不能上网这件事

0

来了公司一年多了,这件事当然是早就知道了的,但今天就想说说这个,因为很无聊。

作为一个搞网络游戏的IT公司,电脑居然不能上网,是很让人值得张大一下嘴的,就像是一个说自己人权很好的国家却处处限制言论自由一样。

我估计着,公司不给员工开通网络,主要是两点。

1. 怕公司代码等资源泄露出去。
其实我去公司的第二周就已经把代码拷回家了,根本用不着上传到网络。但公司似乎也是为了防像我这样带个U盘考资料的人,所以机子的USB插口都给封掉了,不能用了。但我是怎么拷回家的呢?那么多机子,总是有漏网之鱼的,先把代码传到这个机子上,然后在用U盘从这个机子上拷走。

这叫什么?这叫小聪明。

你不能怪我小聪明多,如果没有这种种的限制,我怎么会有这种小聪明呢?就像现在的中国人一样,都说咱中国人小聪明特别多,但这并不是天生的,而是因为中国处处都是限制,当人们想要满足某种欲望却又被所谓法律限制的时候,这种小聪明就出来了。

2. 怕大家都在逛网页,聊QQ,影响工作。

其实首先,如果我是刚刚来到公司,你并不了解我是一个什么样的人,你怎么知道我是一个会不工作总是玩的人呢?说白了,就是公司在对你说:“我不信任你,所以不给你开通网络”。虽然没有明确的说出来,但确是有这种态度,这样的感觉已经印在了员工的潜意识里。所谓“印在潜意识”,即虽然员工本人自己不一定意识到这是公司不信任你的态度,但员工在做相关决定时一定是按照这种潜意识做决定的。

所以,既然你不信任我,为什么要求我在你遇到困难的时候帮你一把?你不信任我,那我和你只是我工作你给钱的关系,你给不了钱凭什么要让我理解你?

 

难道还有一个原因:节省开支。

哈哈,这对现在的公司来说那太讽刺了。

 

我记得公司刚开始暴露出现的问题时,老板就召集了一批人去开会。这批人其所谓“如果有这批人公司一定可以东山再起”的。虽然我也在列,但我并没感觉有什么荣耀,但是只和这部分人说公司的情况就已经让我觉得很不理解,其他人就不是公司员工了吗?

况且在老板说的话里面,有一句话彻底让我对眼前这个曾经还有些幻想的人失去希望,他在谈到部分人离职的事情时说道“公司每个月都发给他们那么多工资,不知道给公司报恩,还离职……大家一定要怀着感恩的心……”。

额,我就不说什么了,这很明显是一句很有水平的话,有水平有到可以将他贪婪自私的心态毫无保留地展示在这一批“可以东山再起”的人面前。

 

之所以今天才要写下网络问题,是因为最近又因没有网络而导致的种种不方便而已,其实我是无所谓,我能在这里呆着,就是看中的可以一边做自己想做的一边拿钱,有什么资源就做什么工作而已呀。

抽空休息了一天

0

今天醒来的时候快12点了,哈哈。

functionHelpViewer搜索做了,不过做的很简单,只对输入的字符串进行字符串匹配搜索,忽略大小写的。

然后做下Editor,用来编辑或添加函数,不过没做完,用PropertySheet做的,一页一页的,还挺麻烦的,哈哈,明天继续搞。

昨晚上就开始从头看下海贼王,找找感觉。。。

晚上准备去买晚饭的时候刚开家门就看到个外国MM说着平音普通话问有没有电,她家没电了,让我帮忙看下。。其实我估计是保险丝烧了,但,换保险丝不值钱,知道在哪换保险丝才值钱。。。那么多盒子不知道哪个,怕随便找个再把别人的给搞没电了那就好玩了哈哈,之后对面一个大叔出来了,让他修的。。。

3e5699ab4cfa49de83217&amp

函数查询对话框

0

昨晚上已经将黑条对话模式模型完成,其实只是模型的话与一般对话框还是没什么区别的,就是多了两个黑条而已,关键还是在于对玩家焦点的掌控。

今天已经可以开始写关于声音系统模型的概述案子了,但想到在之后的开发中,尤其是脚本的编写上,会需要用到大量的函数,所以需要一个类型VS的帮助文档之类的东西能够快速查找所需的函数原型及说明的工具。

记得在1,2个月前就做个一个版本的FuncHelp,但后来在一个测试中发现有问题,就去忙别的了。今天拿来本来想改下看看,但实际这个太简单,只是一个函数名映射一段说明,而且配置文件用的txt,直接满足不了现在的需求,想不通当时是怎么设计的。

还好这个东西的数据逻辑不难,很快又写了个,包括函数名、说明、参数、参数说明、返回值、备注等一般VS帮助文档中看到的东西。

晚上回来写了个Viewer,将数据显示出来,本来也想用Html格式将内容输出出来,。。。额,不过感觉好麻烦啊。。。HTML,CSS之类的早忘了八百年了。。而且还有各种控件要看。。。就没用,用RichEdit来显示的详细页面,从CodeProject上下的一个方便的扩展,用来设置文字大小之类的属性。

显示部分已经写完了,明天要写下搜索索引之类的,应该不好搞吧,哈哈。

然后写个Editor了。

正好明天说是公司那片停电,所以休息一天,调到周六上班。最后截个Viewer的图:

3e5699ab4cf90d1b41cb0&690

继续硬翻——FMOD_NONBLOCKING标签与数据的异步加载

0

介绍

FMOD_NONBLOCKING使用后,就可以不被应用程序的帧速影响而加载了。

通常情况下的加载都会需要很长的时间,但是如果使用这个标签特性,声音就可以在后台加载了,而不会根据应用程序的节拍。

创建声音

和你平常创建声音的步骤一样,不过这时要加上FMOD_NONBLOCKING标记:

FMOD::Sound *sound;

Result = system->createStream(“…wave.mp3”,FMOD_NONBLOCKING, 0, &sound);

ERRCHECK(result)

现在声音就在后台打开了,并且立即获得了这个声音的句柄。在你调用这个函数之前你不能使用这个句柄做任何事:Sound::getOpenState.任何其他尝试使用这个句柄的操作都将返回FMOD_ERR_NOTREADY.

当声音加载时获得一个回调函数

当声音或流打开,你可以指定一个函数来配置到这个FMOD_CREATESOUNDEXINFO的nonblockcallback成员,在加载结束时会调用。首先,这个函数的定义:

FMOD_RESULT F_CALLBACK nonblockcallback(FMOD_SOUND *sound,FMOD_RESULT result)

{

FMOD::Sound *snd = (FMOD::SOUND*)sound;

Printf(“Sound loaded! (%d) %sn”, result,FMOD_ErrorString(result));

Return FMOD_OK;

}

然后:

FMOD_RESULT result;

FMOD:Sound *sound;

FMOD_CREATESOUNDEXINFO exinfo;

Memset(&exinfo, 0,sizeof(FMOD_CREATESOUNDEXINFO));

Exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);

Exinfo.nonblockcallback = nonblockcallback;

Result = system->createStream(“..wave.mp3”,FMOD_NONBLOCKING, &exinfo,&sound);

ERRCHECK(result);

等待声音准备好并使用它

提到这个,你需要在音乐后台加载的时候调用这个来判断:Sound::getOpenState.

你可以调用一次,也可以不断的调用这个直到加载成功了。

下面这个离自己来说明直到加载完成,然后播放它:

FMOD_RESULT result;

FMOD::Sound *sound;

Result = system->createStream(“..wave.mp3”,FMOD_NOBLOCKING, 0, &sound);

ERRORCHECK(result);

Do

{

FMOD_OPENSTATE state;

Result =tmpsnd->getOpenState(&state, 0,0);

ERRCHECK(result);

If(state == FMOD_OPENSTATE_READY&& !channel)

{

Result = system->playsound(FMOD_CHANNEL_FREE,sound, false, &channel);

ERRCHECK(result);

}

GameCode();

}while(1)

或者:

Do

{

If(!channel)

{

Result = system->palySound(FMOD_CHANNEL_FREE,sound, false, &channel);

If(result != FMOD_ERR_NOTREADY)

{

ERRHECK(result);

}

}

GameCode();

}while(1)

 

创建一个FSB文件或流

没翻

获得子声音

没翻

继续词霸下FMOD——3D混音

0

介绍

在外界环境不同的位置会拥有不同的混音效果。理念上,当听者穿过虚拟环境时,声音混音效果就会改变。要改变混音的属性可以通过FMOD提供的3DReverb API。注意:这个技术需要software channel

3D混音

3d混音系统允许你在3D世界中放置多个虚拟的混音。每个混音的定义:

*它在3D世界中的位置

*区域,也即混音的影响区域(用minnum与maxnum distances)

*这个区域的混音属性

在运行的时候,FMOD会根据听者的位置、混音叠加情况等信息来改变3D混音效果的特性。这个方法允许FMOD使用一个单独的混音DSP单位区提供一个动态的混音。这个处理使用下面的图片表示下:

clip_image002

当听者位于一个或多个混音的区域中时,听者将会听到一个有利的所有混音的混合。当听者在混音影响范围的外面时,混音将恢复回它的默认混音设置。需要特别注意的是这种技术只能用于3D声音的混音。要想2D声音产生这种效果,你需要额外调用下:System::setReverbProperties(这将导致一些CUP与内存的耗费)。

另外对于环境中可能有多少个混音需要先估计下的。在一些情况下,需要更加真实的效果,我们建议使用多物理混音,可以查看章节”Usingmultiple reverbs”

设置默认的周围环境混音

这节将会看到默认的周围环境混音设置(ambient reverbsettings).这是非常重要的,只有当听者没有在任何一个混音区域中时才会调用这个默认的设置,举个例子,我们将使用混音的FMOD_RESET_OFF:

FMOD_REVERB_PROPERTIES prop1 = FMOD_RESET_OFF;

System->setReverbAmbientProperties(&prop1);

创建一个3D混音

现在将创建一个虚拟的混音,调用System::createReverb,然后使用Reverb::SetProperties来设置它的特性:

FMOD::Reverb *reverb;

Result =system->createReverb(&reverb);

FMOD_REVERB_PROPERTIES prop2 = FMOD_RESET_CONCERTHALL;

Reverg->setProperties(&prop2);

设置3D混音属性

现在必须要设置混音的3D属性了。使用reverb::set3DAttributes可以设置源位置、覆盖区域(使用minnum,maxnum).

FMOD_VECTOR pos = {-10.0f, 0.0f, 0.0f};

Float mindist = 10.0f;

Float maxdist = 20.0f;

Reverb->set3DAttributes(&pos,mindist, maxdist);

使用这个方法来设置听者的位置,System::set3dListenerAttributes

FMOD_VECTOR listenerpos = {0.0f, 0.0f, -1.0f};

System->set3DListenerAttributes(0,&listenerpos,0,0,0);