怎么创建游戏制作

后使用快捷导航没有帐号?
- - - - - -
查看: 130972|回复: 6
零食0 板砖86 至尊币6 性别保密水晶0 PK币0 主题积分6576最后登录小伙伴179 好友
                         ≈ 晓组织
性别保密在线时间193 小时注册时间UID
本文转载自逆战瞬狙吧,只适用于显卡低想要流畅游戏的玩家。对于注重画面质量的,我建议还是更换显卡,最好是N卡。对于PING低的那是网速问题,建议找运营商提高带宽。我的是N卡,经过测试确实可行,现在FPS保持100左右。对于A卡没有测试
下面,就来和大家一起探讨一下如何设置的问题,分为两方面:
一个是电脑、游戏普通设置,属于大众都知道一点的设置,效果一般。
另一个就是显卡设置,属于中高端的调节,效果良好。
对显卡设置很多玩家朋友都毫无了解,所以本文将重点讲解显卡设置问题,会在文中详细地解释每个设置选项的意义和作用,并且文章最后会给出一张最终的设置选项全面截图,希望对大家有所帮助。
一、普通设置:
1.进入游戏大厅,点击右上角的“设置”,把游戏画面分辨率调整为800*600(4:3),然后把画面质量调为低”。
这里要提示一下,如果你对你的低配电脑还有一点信心,可以改为“自定义”,然后提高“阴影效果”“粒子效果”等,同时根据画面感不断调节各个选项的数值,这样能使你的电脑配置得到更为充分的发挥,提高FPS值的同时不会过于降低画面逼真度。
不过如果你只是想更流畅的体验游戏,不考虑画面质量的好坏,直接选“低”就可以了。
2.画面卡顿很有可能是因为内存不足,加多一条内存条就可能会有很大改善。
请注意,是电脑内存,不是显存!
3.CPU负荷过重也会导致显卡效果不能全部发挥,而导致FPS下降,所以关掉其它应用软件,比如录像软件、QQ、YY等也能适当提高FPS。
另外,有时周末人多的时候,不开QT之类的可以减少卡顿。
4.定期清理机箱内灰尘,如果有太多灰尘覆盖主板等,又不清理掉,容易积热,热保护动作会降低系统效率。
5.将桌面的背景图片(壁纸)或动态桌面取消掉,因为他会很大程度的影响图像刷新率。
特别是WIN7用户,特么的动态桌面坑死低配玩家啊。
6.将电脑本身的分辨率适当调小些,具体电脑显示器具体分析,配置比较低的电脑可以考虑用16位色(通常我们用的都是最高32位色)。
7.显卡的驱动程序不是越新越好的,其的更新有时也会导致FPS降低。换回原来的驱动版本一般就可以了。
虽然一般来说,显卡驱动更新能带来新功能、对部分游戏有优化功效。但是有时候会出现不兼容的情况,而且就算兼容也并不见得稳定,造成蓝屏、驱动文件缺失等等麻烦到爆的问题。
8.右键“我的电脑”- 属性 - 高级 - 性能,选择“最佳性能”,把所有视觉效果什么的都关闭。(此项对于只有2G内存却安装了WIN7的玩家效果很明显!)
1.png (26 KB, 下载次数: 48)
10:56 上传
2.png (9.16 KB, 下载次数: 51)
10:56 上传
3.png (19.59 KB, 下载次数: 123)
10:56 上传
下面进入本文重点,显卡设置:
首先是N卡设置:
打开NVIDIA显卡控制面板,方法各种各样:
1.直接右下角打开N卡控制面板托盘按钮,一般来说都是自动隐藏在小箭头里的,点开就可以显示隐藏的图标了。
4.png (2.63 KB, 下载次数: 38)
10:56 上传
点开后出现下面的图片:
这个就是N卡控制面板。
5.jpg (5.79 KB, 下载次数: 29)
10:56 上传
如果右下角箭头那里没有(或者你是xp用户),那么可以通过以下方法调出:
在桌面最下方的工具栏点鼠标右键:
6.jpg (12.3 KB, 下载次数: 32)
10:56 上传
7.jpg (42.64 KB, 下载次数: 38)
10:56 上传
8.jpg (42.6 KB, 下载次数: 25)
10:56 上传
9.png (20.02 KB, 下载次数: 20)
10:56 上传
2.第二种方法是:
开始菜单 - 控制面板
10.png (19.8 KB, 下载次数: 25)
10:56 上传
11.png (41.9 KB, 下载次数: 25)
10:56 上传
可以看到“显卡控制面板”这个选项,进去就行了。如果没有可能是驱动版本的原因,点击“程序和功能”可以查看系统安装的程序、驱动版本号和日期。
12.png (6.61 KB, 下载次数: 23)
10:56 上传
进去显卡控制面板以后,先把“图像设置”页面的活动条拉到最左边“性能”,代表性能优先。
13.png (101.75 KB, 下载次数: 70)
10:56 上传
然后跳下“PhysX设置”页面,把PhysX处理器调成N卡。
(此项是针对双显卡低配玩家而言的,比如八哥就是GT540M + 英特尔核芯显卡。单显卡玩家请无视。)
14.png (19.84 KB, 下载次数: 43)
10:56 上传
然后就进入显卡设置的重头戏了:
“管理3D设置”!
打开以后是不是看见“程序设置”?点开再点右边的“添加”按钮,选择程序。然后就可以在下面的各项细分选项中仔细调节了。
15.png (13.14 KB, 下载次数: 199)
10:56 上传
三重缓冲:关
3重缓冲是一种图象处理技术。3重缓冲使用一个前置缓存和两个后置缓存。在着色完第一个后置缓冲区的数据后,立即开始处理第二个后置缓冲区。
今天,不少新游戏都采用的是3重缓冲,3重缓冲正逐渐成为发展的趋势,因为它没有Vsync(荧幕的垂直刷新频率)等待的时间,游戏也将更加流畅。三重缓冲,有3个缓冲区,显卡无需等待前缓冲区清空进而腾出后缓冲区,随时可以把渲染结果放入第3个缓冲区。
这就是说,可以在打开垂直同步的同时保持应有的帧速了。
ATi和nVidia的驱动中都有打开三重缓冲(triple buffering)的选项。可惜这只能起到一半的作用,因为驱动中的3重缓冲选项只对OpenGL游戏起作用(逆战是D3D游戏)。加上OpenGL游戏远少于D3D游戏,所以事实上驱动的3倍缓冲选项在超过一半情况都不起作用。三级缓冲是低帧速的完美解决办法,不过,这并不是免费的午餐。打开三级缓冲也意味着需要多50%的缓存空间。在某此条件之下,它也可能会对游戏效果产生负面影响。
垂直同步:关闭
主要区别在于那些高速运行的游戏,比如实况,赛车竞速游戏,打开后能防止游戏画面高速移动时画面撕裂现象,当然打开后如果你的游戏画面FPS数能达到或超过你显示器的刷新率,这时你的游戏画面FPS数被限制为你显示器的刷新率。你会觉得原来移动时的游戏画面是如此舒服,如果达不到会出现不同程度的跳帧现象,FPS与刷新率差距越大跳帧越严重。
关闭后除高速运动的游戏外其他游戏基本看不出画面撕裂现象。关闭此选项画面流畅程度会有一定的提高。
游戏中或许强劲的显卡迅速的绘制完一屏的图像,但是没有垂直同步信号的到达,显卡无法绘制下一屏,只有等85单位的信号到达才可以绘制。这样fps自然要受到系统刷新率运行值的制约约。
简单点来说就是,如果你的电脑不是高配,直接“关闭”。
多显示器/混合GPU加速:单一显示器性能模式
该选项只有在使用多个显示设备时有效,也就是你的电脑连接多个显示器。
一般选“单一显示器性能模式 ”即可。
平滑处理模式:性能
平滑处理有两种设置,为性能和质量。分别有利于提高系统性能或改进图象质量。
如果要显示三维动画效果和强调场景的流畅变换,最好使用性能设置。
如果要以显示非常精细和逼真的三维物体为主要目的时,最好使用质量设置。
平滑处理-灰度纠正:关
作用是使GAMMA值相对平滑,让锯齿不那么明显。不开AA的话无多大用,还是关了好。
平滑处理-设置:无
该选项只有当选择了“替换任何应用程序设置”才能调节,2x、4x、8xQ、16xQ为MS取样,8x、16x为CS取样;其中MS取样性能下降比较大,CS取样在效果和性能上取得平衡点;此选项自己按照显卡性能选择;默认“无”。
平滑处理-透明度:关
该选项就是设置透明抗锯齿模式,透明抗锯齿模式可以实现非边缘AA,抗锯齿效果更佳;
多重取样性能较高、画质稍弱,超级取样性能较低、画质较好。
请根据对游戏画面要求选择;默认“关”。
最大渲染帧数:1
就是画面刷新的速度,主要是看你的硬件好坏,显卡在其中占重要地位.
“预先渲染的最大帧”是用于垂直刷新同步模式被关闭后,在显卡处理游戏画面前,所需要准备的帧数目。但并不是准备的帧数越多就越好的,当准备数目过多时,可能会造成显示和键盘或手柄的输入控制不同步。
CPU强悍的就开起,CPU越强悍数字就选越大,具体多大就要看你自己琢磨了.开了后,CPU就会渲染游戏画面,选1就是预先渲染好1帧的画面.但如果开的太高了,CPU占用100%了,那么就会出现画面延迟的现象,表现为鼠标拖过去了,画面比操作要落后一段时间过去.
一般是性能很好的电脑,调大这个来增加流畅度的,保持帧速稳定的。
如果是FPS玩家,建议设置为1。如果是普通用户,建议默认值3。
纹理过滤-三线优化:开
这个可以提高纹理质量,看上去更逼真。该选项效果类似于“各向异性过滤优化”,可按照自己对画面要求进行选择。
三线性是使用NVIDIA专用的三线性过滤优化算法,其实就是使用自动算法,在适当的地方采用更低的过滤方式来提高性能。所以这项打开时会降低画面质量,提高游戏速度。考虑到使用这项时降低的画面质量几乎是可以忽略不计的。建议开启。
纹理过滤-各向异性采样优化:开
关的时候其他无论怎么设置帧数都只有30多,开了后直接稳定在60,无论开抗锯齿还是其他过滤都能在60fps。
该选项确定是否使用优化算法进行各向异性过滤,选择“开”可以提高部分性能、损失一点画质,选择“关”则可以保证最高画质。
纹理过滤-负LOD偏移:锁定
负 LOD 偏移。应用程序有时会使用负 LOD 偏移以锐化纹理过滤。
这样做会锐化静态图象,但在动作场面中会造成失真。各向异性过滤既能够提供纹理锐化,又不会造成讨厌的失真,因此当启用各向异性过滤来获得更好的图象质量时,最好锁定 LOD 偏移(将负 LOD 偏移状态滑块移至锁定值。)否则默认设置为允许。
比如实况就是动作场面,如果你开了异性过滤后也觉得还是有点闪的话,强烈建议锁定。
纹理过滤-质量:高性能
该选项可一步控制其它“纹理过滤”选项,追求画质推荐“高质量”;一般默认“质量”即可,较低端的显卡可以选择“高性能”,提升性能。
低配的玩家建议选:“高性能” ,高配那就不用我说啦。
线程优化:自动
nv显卡芯片中有很多流处理单元,对图形多线程处理,相当于很多人在一起协同办公,人多力量大。1个人做的工作分给50个人去做,其效率不言而喻。但是这50个人如何共同做好这个工作,又是个问题。线程优化相当于用最合理的调度手段充分利用好这50个人去完成工作。
一般来说这个选择默认设置(通常是“自动”)就好。
嗯,对于低配玩家而言,全部调节好了以后,各个细项的设置就应该是这样的了:
16.png (13.19 KB, 下载次数: 127)
10:56 上传
接下来是A卡设置:
要想开启使用A卡控制面板,需要安装并打开CATALYST Control Center。(就是人们常说的CCC控制中心)
如果无法安装,那么你必须首先安装NET framework version 1.1或以上版本,当你安装完这个程序后,就可以安装并打开CATALYST Control Center了。
A卡控制面板的打开方式同样很简单,首先在桌面的任意空白位置点击鼠标右键,出现菜单的最上方,有一个ATI CATALYST(tm) Control Center选项。
17.gif (8 KB, 下载次数: 21)
10:56 上传
3D设置的第一项是标准(Standard Settings)。对于不愿意在设置上花太多时间的朋友来说,这个设置的存在是非常有帮助的。只要去掉Use custom settings前面的勾,然后拉动下面的滑动条就可以在性能与画质之间进行调整了。总的来说,越往左拉,帧率越高,但是画质越差。往右拉则反之。
  然后是抗锯齿AA(AA即“全屏抗锯齿”,英文全称“Anti-aliasing”)了。抗锯齿可以带来清晰亮丽的画面,当然一般情况下,对性能也是个巨大的冲击,低配玩家可以选择关闭了。ATI的显卡的抗锯齿设定的原则是,游戏内建有抗锯齿设定的话,就要用游戏内的选项来设定开关及抗锯齿倍数等。CCC里面的Anti-Aliasing设定里面应该勾上Use application settings。在游戏中没有抗锯齿设定情况下,对于某些游戏,是可以通过驱动强制打开抗锯齿的。
  抗锯齿倍数的滑动条上面多了一个选项,叫做形态滤波,这个就是打开MLAA的开关。
  在滑动条的下面有个名叫Filter的下拉框,里面可以选择Box, Narrow Tent, Wide Tent和Edge-Detect。在这些选项之间调整,可以看到最终的抗锯齿倍数也跟着变化。比如你原来是4x的话,选择Narrow Tent会变成6x,选择Wide tent会变成8x,选择Edge-Detect更会变成12x!不过千万不要被这个倍数被蒙蔽了。Narrow Tent和Wide Tent在消除锯齿的同时会让画面整体变得非常模糊,一般来说只有Box和Edge-Detect两种方式可以真正提供好的画质,低配请无视。
  接下来的选项根据显卡不同会有不同显示,5000系列以下的显卡在这里叫做Adaptive AA。这种AA主要是针对MSAA无法处理游戏中的铁丝网,树叶等透明纹理的锯齿的。打开会使画质进一步提高,但是帧率肯定会继续下降。对于5000系列显卡,这里是叫做AA Mode。把这里的滑动条拉到最右边是Super-Sample AA。也就是SSAA模式。这种模式极耗资源,但是能带来最好的画质。
  再往右是Anisotropic Filter,也就是AF设定。Use application settings设定是由游戏还是驱动来决定AF的设置。下面的滑动条则是倍数的设定。除非你的显卡实在有点老,需要把能关的都关掉。这里高配推荐设为8x或者16x,低配请依旧无视。
  下面就是前面提到过的Catalyst A.I了,去掉Disable Catalyst AI前面的勾就打开了这个功能。它的作用是驱动自动对帧率进行优化,代价是一些画质的损失。这个功能有两档可以调节,一档为Standard,一档为Advanced。显然,设为Advanced时,画质的损失会更大,不过游戏在高负载的时候性能下降也会小一些。如何取舍,就看你是多看重画质了。
  下面一项Mipmap Detail Level是用来调节纹理的清晰度的,一般来说,只要你的显卡属于好显卡,建议把它设在High Quality上。如果是低配,不用我说你都知道选什么了吧。
  最后是All settings,这里包含了前面这些所有的3D选项,另外还有两个前面没有的选项:Wait for vertical refresh(垂直同步),和Triple Buffering(三重缓冲)。
  垂直同步共有四档可以调节:Always off(一直关闭); Off, unless application specifies(关,除非游戏设置中打开); On, unless application specifies(开,除非游戏设置中关闭); Always on(一直开启)。这四种设置给了您比较灵活的控制垂直同步的方法。本人建议是高配一直开启,毕竟不少游戏中,不开启垂直同步会偶尔出现画面撕裂现象。),当然,如果你是低配,肯定需要关闭这个功能。
  这里的三重缓冲功能只对OpenGL游戏有效。这个功能在打开垂直同步的情况下,会对游戏的性能有所帮助,建议在玩OpenGL游戏的时候开启。逆战属于D3D游戏,此选项可以选择“关闭” 。
本版排名:
本版声望:
零食0 板砖0 至尊币0 性别保密水晶0 PK币0 主题积分696最后登录小伙伴0 好友
头像被屏蔽
性别保密在线时间11 小时注册时间UID
提示: 作者被禁止或删除 内容自动屏蔽
本版排名:
本版声望:
零食0 板砖0 至尊币0 性别保密水晶0 PK币0 主题积分2313最后登录小伙伴0 好友
五级玩家, 积分 2313, 距离下一级还需 687 积分
性别保密在线时间141 小时注册时间UID
本版排名:
本版声望:
零食12 板砖627 至尊币0 性别男水晶71 PK币0 主题积分30776最后登录小伙伴117 好友
大家一起水啊水
十二级玩家, 积分 30776, 距离下一级还需 9224 积分
性别男在线时间793 小时注册时间UID
好深奥的东西,果断不看
本版排名:
本版声望:
零食0 板砖0 至尊币0 性别保密水晶0 PK币0 主题积分5最后登录小伙伴0 好友
一级玩家, 积分 5, 距离下一级还需 45 积分
性别保密在线时间0 小时注册时间UID
本版排名:
本版声望:
零食0 板砖0 至尊币0 性别保密水晶0 PK币0 主题积分54最后登录小伙伴52 好友
二级玩家, 积分 54, 距离下一级还需 546 积分
性别保密在线时间3 小时注册时间UID
楼主的方法很好,而且很详细,谢谢楼主
本版排名:
本版声望:
零食0 板砖2169 至尊币202 性别保密水晶4675 PK币0 主题积分3411最后登录小伙伴4480 好友
六级玩家, 积分 3411, 距离下一级还需 589 积分
性别保密在线时间54 小时注册时间UID
顶&&顶&&顶& &顶!!!
本版排名:
本版声望:
红人馆勋章
晓组织红人馆专属勋章
节日勋章,鬼节期间活动发放
活动达人勋章
根据参与论坛活动活跃度进行手动颁发
DNF忍者-毕方之炎
暗夜使者第3职业,忍者。
剑灵版面勋章
剑灵版面勋章
剑灵活动勋章
剑灵版面勋章
幻想神域版面一级勋章
节日勋章,中秋期间活动发放扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
NIVDIA显卡怎样设置玩游戏才不卡
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口|  |   |
 |  |  |   |
|  |  |  |
|   |  |
&>&&>&&>&正文
《刺客信条枭雄》中文设置详细方法 刺客信条枭雄怎么设置中文
12:00:09 来源:游民星空[原创] 作者:Agent 编辑:Agent 
  刺客信条枭雄自带官方简体和繁体中文,可是怎么设置中文的问题可难倒了不少的玩家,下面为大家介绍《刺客信条枭雄》中文设置的详细方法,游民小编亲测,简单有效,一起来看看吧。
《刺客信条:枭雄》精华文章推荐
  进入游戏后在游戏主菜单的“Option”选项内找到游戏语言“language”,改成相应语言即可;第一次进入游戏需看完开场动画后才能退回主菜单修改语言!
  注意:与多数游戏不同,《枭雄》的“字幕语言”和“界面语言”虽然都可以设置简体中文(Simplified Chinese),但要在不同的地方设置。
  设置中文后,在“选项”里删除存档,重新开始,即可看中文的开场动画了。
  下面详细讲设置方法:
  如果是本站下载的游戏,游戏安装目录里会自带localization.lang这个文件,这是用来设置语言的关键文件,请不要删除。
  如果缺少此文件,请下载这个补丁,并覆盖到游戏目录。语言解锁补丁下载地址:
  有了这个文件,才可以按如下方法来设置中文。
一、中文字幕设置(剧情对话语言)
  OPTIONS——&SOUND,找到SUBTITLES LANGUAGE,选择Simplified Chinese(简体中文)。
二、中文界面设置(菜单语言)
  OPTIONS—&GAMEPLAY—&General,找到MENU LANGUAGE,选择Simplified Chinese(简体中文)。
  如果你的游戏没有上面提到的选项,或者语言只有英文,说明你的语言没有解锁。请退出游戏,下载全语言解锁补丁,覆盖到游戏目录,再进游戏设置即可。
  语言解锁补丁下载地址:
更多相关内容请关注:
游戏制作:育碧
游戏发行:育碧
游戏平台:PC/XboxOne/PS4
上市时间:
游戏特色:
--游民指数
近日Youtube专业游戏评测媒体Candyland就为我们带来了《刺客信条:枭雄》各种画面选项所带来的效果对比视频,一起来看看吧。
《刺客信条:枭雄》PC版已经发售,相信很多玩家第一时间玩到了这款年度大作,PC版自然不免被拿出来和早先发售的PS4版进行了一番对比,一起来看看IGN带来的这段对比视频。
今(7)日,《刺客信条:枭雄》曝光了PC版的实机演示画面,创意总监Marc-Alexis Cote讲解了NVIDIA的GameWorks优化。
日前《刺客信条:枭雄》就迎来了一款“蒸汽朋克”风格的服装包,并公布了一段宣传视频,一起来看看吧。
《刺客信条:枭雄》为我们展现了一个处在工业革命时代的伦敦,正因为工业发展,所以整个伦敦总是雾蒙蒙的。不过这也令延时摄影有一种别样的感觉,大家一起来欣赏一下。
Cosplay界的超级明星Rick和Dominique Boer为我们带来了他们的最新作品,这次他们Cos的作品是育碧旗下最新作品《刺客信条:枭雄》。
《刺客信条:枭雄》一改前作《大革命》给玩家的印象,游玩非常稳定,不过尽管如此,本作还是存在一些有趣的bug。
《刺客信条:枭雄》已经正式发售,相信大家正在享受游戏当中,而本作除了精彩的动作场面外,还有沁人心脾的背景音乐,而育碧今日就为我们带来了《刺客信条:枭雄》的原声大碟,玩家们可以免费试听。
英国发明家小哥Colin Furze为我们带来的是两件相当酷炫的装备——《刺客信条:枭雄》当中的袖剑和绳索发射器。
虽然《刺客信条:枭雄》打造了美妙的伦敦,但Bug也是相当多,日前外媒发布了一些搞笑的Bug合集,还搭配解说评论
FERNANDO ACOSTA是一名视觉艺术设计师,他曾参与过《光环4》、《战争机器》等游戏的原画设计,在2014年,他有幸得到了一次机会帮助育碧进行《刺客信条:枭雄》的原画设计。
《刺客信条:枭雄》发布了一批全新游戏截图,展示了男女主人公在解放伦敦运动中的成长经历,出身布衣的兄妹俩也曾历经压迫辛酸!
今日育碧发布了《刺客信条:枭雄》故事预告,让我们梳理出了一些人物关系网络;兄妹VS圣殿骑士上演攻心计。
《刺客信条》如果变成一款像素游戏会是什么样子的?外国的画手Tropeland就实现了这个脑洞,绘制了马赛克版的历代《刺客信条》人物,还是gif版。
育碧公布了《刺客信条:枭雄》中伦敦地区的截图,风景还是非常不错,玩家也不用担心在《刺客信条:枭雄》中环境过于晦暗。
《刺客信条:枭雄》在发布了最新的莱佛兄妹大战伦敦街头的预告后,还公布了一批最新的游戏截图以及人设图。
在演示中出现不少新的元素和细节,看起来像是从alpha测试从曝光的,不过与早先的alpha体验版相对比,要流畅不少。外媒现在就为我们提供了几张动态图来展示泄露的演示。
今日,育碧发布了《刺客信条:枭雄》最新游戏截图,故事主人公雅各.弗莱和妹妹Evie Frye再次联手与恶势力做斗争。
国外的Rick Boer在刚刚E3展上大出风头,他出的《刺客信条:枭雄》中的男主角以极高的还原度让无数在场观众叹为观止。
Ubisoft在发布会后半场公布了《刺客信条:枭雄》的概念图。
单机游戏下载
综合热点资讯查看: 1342|回复: 6
UID2631631QQ阅读权限12最后登录记录积分6贡献度0 VIP0 彩虹碎片0 经验6132 帖子精华0在线时间99 小时注册时间
二年级, 积分 6, 距离下一级还需 4 积分
贡献度0 彩虹碎片0 经验6132 帖子精华0在线时间99 小时注册时间
如题!橙光游戏文字制作工具怎么设置点击封面进行游戏?
教程在此,自己看看吧/thread--5.html
UID7344033阅读权限15最后登录记录积分59贡献度2 VIP0 彩虹碎片216 经验57330 帖子精华0在线时间505 小时注册时间
五年级, 积分 59, 距离下一级还需 16 积分
贡献度2 彩虹碎片216 经验57330 帖子精华0在线时间505 小时注册时间
教程在此,自己看看吧
&告诉你件事吧~我也就昨天才开始玩论坛的...&
&这个月,刚回橙光我已n次看到你了……&
&谢谢夸奖~这是我昨天回哒&
&这孩子= =
好勤奋,又看到你了
今天第十三次看到你了.......= =&
我想,每一位英雄都必定要经历一段孤独的时光
UID3954099阅读权限13最后登录记录积分11贡献度0 VIP0 彩虹碎片9 经验10935 帖子精华0在线时间103 小时注册时间
三年级, 积分 11, 距离下一级还需 9 积分
贡献度0 彩虹碎片9 经验10935 帖子精华0在线时间103 小时注册时间
只要把图片当成按钮导入就行了。
UID6811168阅读权限15最后登录记录积分44贡献度-1 VIP0 彩虹碎片62 经验44764 帖子精华0在线时间417 小时注册时间
五年级, 积分 44, 距离下一级还需 31 积分
贡献度-1 彩虹碎片62 经验44764 帖子精华0在线时间417 小时注册时间
本帖最后由 EXO灿白鹿党男饭 于
13:44 编辑
上楼的解释是大多新手用的方法,真正的是要高级模式。
&初级模式有3种方法可以设定,并不需要高级模式&
误导警告一次
总评分:&经验 -100&
_(:зゝ∠)_
UID694764阅读权限14最后登录记录积分28贡献度-2 VIP0 彩虹碎片15 经验30198 帖子精华0在线时间630 小时注册时间
四年级, 积分 28, 距离下一级还需 12 积分
贡献度-2 彩虹碎片15 经验30198 帖子精华0在线时间630 小时注册时间
把封面图片先如图弄上,然后在把这个封面图弄成按钮,在设置跳转剧情就可以了
(3.28 KB, 下载次数: 9)
22:26 上传
点击文件名下载附件
UID阅读权限10最后登录记录积分0贡献度0 VIP0 彩虹碎片0 经验215 帖子精华0在线时间51 小时注册时间
新生入学, 积分 0, 距离下一级还需 1 积分
贡献度0 彩虹碎片0 经验215 帖子精华0在线时间51 小时注册时间
作者培训区里面有教程的。
UID7344033阅读权限15最后登录记录积分59贡献度2 VIP0 彩虹碎片216 经验57330 帖子精华0在线时间505 小时注册时间
五年级, 积分 59, 距离下一级还需 16 积分
贡献度2 彩虹碎片216 经验57330 帖子精华0在线时间505 小时注册时间
本帖最后由 4VV 于
20:21 编辑
<font color="#VV 发表于
教程在此,自己看看吧
之前回复错误,重新编辑
我想,每一位英雄都必定要经历一段孤独的时光
在论坛新手区累计得到50个认可答案
在店铺区开店并得到了官方认证的用户  在本系列教程的第一部分中,你创造了游戏的基本场景,并使用Box2D的b2RopeJoint和PatrickC的VRope类去创造绳索。
  在今天的第二部分也是最后一部分教程中,你将学会如何割绳子!
  开始:切断Verlet!
  为了割绳子,你需要追踪用户在屏幕上的碰触并检查碰触是否与绳索产生互动。
  当用户在屏幕上拖动手指时,ccTouchesMoved:withEvent:方法会被Cocos2D调用,你可以使用它去检查手指当前的位置以及最后追踪到的位置。之后你可以检查这两个点组成的线是否与你在场景中的任何绳索产生交叉。
  为了明确该割掉哪条绳索,它将帮助你更好地理解VRope是如何运行的。
  VRope是由一系列VPoint对象(使用VStick对象进行连接)所组成的。所以如果你想要割断VRope,最佳方法便是明确用户手指移动所形成的线是否会与场景中的任何VRope的VStick对象产生交叉。
  首先需要做的便是找到一个合理的算法去检测两条线是否交叉。你将在HelloWorldLayer类中执行这一算法。
  继续前进并添加如下代码到HelloWorldLayer.mm最后:
  -(BOOL)checkLineIntersection:(CGPoint)p1
CGPoint)p2
CGPoint)p3
CGPoint)p4
  // http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/
  CGFloat denominator = (p4.y – p3.y) * (p2.x – p1.x) – (p4.x – p3.x) * (p2.y – p1.y);
  // In this case the lines are parallel so you assume they don’t intersect
  if (denominator == 0.0f)
  return NO;
  CGFloat ua = ((p4.x – p3.x) * (p1.y – p3.y) – (p4.y – p3.y) * (p1.x – p3.x)) /
  CGFloat ub = ((p2.x – p1.x) * (p1.y – p3.y) – (p2.y – p1.y) * (p1.x – p3.x)) /
  if (ua &= 0.0 && ua &= 1.0 && ub &= 0.0 && ub &= 1.0)
  return YES;
  return NO;
  }因为你并不关心交叉点,只在意线与线之间是否产生交叉,所以你并不需要计算x和y。你只需要检查ua和ub是否在0和1之间便可。
  你几乎已经准备好执行ccTouchesMoved:withEvent:方法了。在此之前,先呈现你所需要的一些VRope和VPoint实例变量。
  首先你需要呈现VRope的数组。打开VRope.h并在界面组块内部添加如下代码:
  @property (nonatomic, readonly) NSArray *然后在执行组块内部的VRope.mm中综合属性:
  @synthesize sticks = vS现在你需要呈现VPoint类的坐标。添加以下内容到VPoint.h:
  -(CGPoint)并添加如下代码到VPoint.m的最后:
  -(CGPoint)point {
  return CGPointMake(x, y);
  }你基本上准备好了。现在添加ccTouchesMoved:withEvent:的框架到HelloWorldLayer.mm最后:
  -(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
  static CGSize s = [[CCDirector sharedDirector] winSize];
  UITouch *touch = [touches anyObject];
  CGPoint pt0 = [touch previousLocationInView:[touch view]];
  CGPoint pt1 = [touch locationInView:[touch view]];
  // Correct Y axis coordinates to cocos2d coordinates
  pt0.y = s.height – pt0.y;
  pt1.y = s.height – pt1.y;
  for (VRope *rope in ropes)
  for (VStick *stick in rope.sticks)
  CGPoint pa = [[stick getPointA] point];
  CGPoint pb = [[stick getPointB] point];
  if ([self checkLineIntersection:pt0 :pt1 :pa :pb])
  // Cut the rope here
  }这个代码非常简单。对于每条绳索,你检查了用于创造绳索的每个树枝。当你发现一个与线交叉的数值被用户拖动时,你便可以切断绳索并停止循环。
  好吧,所以并没有那么简单,你仍需要明确如何切断绳索!
  在你再次冲向VRope去添加这一函数钱让我们先好好想想。VRope是受到b2RopeJoint的支持,反过来这一绳索节点在每个终端需要一个实体。当你割断VRope,你会想要将其分成两个VRope对象(游戏邦注:或创造一个新的),而为了做到这点你需要另一个b2RopeJoint和两个新实体。
  什么?两个新实体?基于现实条件想一想,这看起来很奇怪。当你割断一条绳索时,两个实体并不会突然存在。
  这可能是真的,但是在你的小小Box2D世界,你的绳索并不是真正的绳索!它只是两个实体间的逻辑连接。所以当你割断你的世界中的绳索时,想象你将附加一个非常小且看不见的对象当割痕的末端,所以绳索将保持它们的重量和绳索般的行为。
  以下是关于你将执行什么的粗略图解:
  stick(from raywenderlich)
  这并不是最棒的图像,但是你能够从中有所领悟。以下的代码和解释将让你更加清楚。
  前往VRope.h并在-(void)reset之后添加这一方法声明:
  -(VRope *)cutRopeInStick:(VStick *)stick newBodyA:(b2Body*)newBodyA newBodyB:(b2Body*)newBodyB;你将用两个新实体和VStick去供给这一方法。让我们看看它是如何做的。。打开VRope.mm并在reset后添加这一方法:
  -(VRope *)cutRopeInStick:(VStick *)stick newBodyA:(b2Body*)newBodyA newBodyB:(b2Body*)newBodyB {
  // 1-First, find out where in your array the rope will be cut
  int nPoint = [vSticks indexOfObject:stick];
  // Instead of making everything again you’ll just use the arrays of
  // sticks, points and sprites you already have and split them
  // 2-This is the range that defines the new rope
  NSRange newRopeRange = (NSRange){nPoint, numPoints-nPoint-1};
  // 3-Keep the sticks in a new array
  NSArray *newRopeSticks = [vSticks subarrayWithRange:newRopeRange];
  // 4-and remove from this object’s array
  [vSticks removeObjectsInRange:newRopeRange];
  // 5-Same for the sprites
  NSArray *newRopeSprites = [ropeSprites subarrayWithRange:newRopeRange];
  [ropeSprites removeObjectsInRange:newRopeRange];
  // 6-Number of points is always the number of sticks + 1
  newRopeRange.length += 1;
  NSArray *newRopePoints = [vPoints subarrayWithRange:newRopeRange];
  [vPoints removeObjectsInRange:newRopeRange];
  // 7-The removeObjectsInRange above removed the last point of
  // this rope that now belongs to the new rope. You need to clone
  // that VPoint and add it to this rope, otherwise you’ll have a
  // wrong number of points in this rope
  VPoint *pointOfBreak = [newRopePoints objectAtIndex:0];
  VPoint *newPoint = [[VPoint alloc] init];
  [newPoint setPos:pointOfBreak.x y:pointOfBreak.y];
  [vPoints addObject:newPoint];
  // 7-And last: fix the last VStick of this rope to point to this new point
  // instead of the old point that now belongs to the new rope
  VStick *lastStick = [vSticks lastObject];
  [lastStick setPointB:newPoint];
  [newPoint release];
  // 8-This will determine how long the rope is now and how long the new rope will be
  float32 cutRatio = (float32)nPoint / (numPoints – 1);
  // 9-Fix my number of points
  numPoints = nPoint + 1;
  // Position in Box2d world where the new bodies will initially be
  b2Vec2 newBodiesPosition = b2Vec2(pointOfBreak.x / PTM_RATIO, pointOfBreak.y / PTM_RATIO);
  // Get a reference to the world to create the new joint
  b2World *world = newBodyA-&GetWorld();
  // 10-Re-create the joint used in this VRope since bRopeJoint does not allow
  // to re-define the attached bodies
  b2RopeJointD
  jd.bodyA = joint-&GetBodyA();
  jd.bodyB = newBodyB;
  jd.localAnchorA = joint-&GetLocalAnchorA();
  jd.localAnchorB = b2Vec2(0, 0);
  jd.maxLength = joint-&GetMaxLength() * cutR
  newBodyB-&SetTransform(newBodiesPosition, 0.0);
  b2RopeJoint *newJoint1 = (b2RopeJoint *)world-&CreateJoint(&jd); //create joint
  // 11-Create the new rope joint
  jd.bodyA = newBodyA;
  jd.bodyB = joint-&GetBodyB();
  jd.localAnchorA = b2Vec2(0, 0);
  jd.localAnchorB = joint-&GetLocalAnchorB();
  jd.maxLength = joint-&GetMaxLength() * (1 – cutRatio);
  newBodyA-&SetTransform(newBodiesPosition, 0.0);
  b2RopeJoint *newJoint2 = (b2RopeJoint *)world-&CreateJoint(&jd); //create joint
  // 12-Destroy the old joint and update to the new one
  world-&DestroyJoint(joint);
  joint = newJoint1;
  // 13-Finally, create the new VRope
  VRope *newRope = [[VRope alloc] initWithRopeJoint:newJoint2
  spriteSheet:spriteSheet
  points:newRopePoints
  sticks:newRopeSticks
  sprites:newRopeSprites];
  return [newRope autorelease];
  }这真的是一串很长的代码。我将通过另一张图解详细解释上述内容:
  illustration(from raywenderlich)
  图解呈现的是构成VRope的VPoints和VSticks。就像你所看到的,VRope拥有7个点和6个树枝。上方是点的指标而下方则是树脂的指标。
  在这一情况中,绳索将被从中间割断(nPoint=3)。这一理念是为了使用初始VRope的数据,所以割断行为将会自然地出现。
  让我们详细分析上述代码:
  1.首先决定割断会出现的点。通过的树枝对象将是属于新绳索的第一个树枝,所以它的指标便是割断发生的点的指标。在上图中便是3。
  2.定义一个范围结构去指出你想要vStick数组在哪里分离。在图解中,这一范围将伴随着位置=3,长度=3。这表明了新的绳索在树枝上的范围是从3到5。
  3.创造一个伴随着树枝(将转移到新的绳索上)的新数组。
  4.将这些树枝从当前绳索的数组中删除。
  5.在用于绘制树枝的精灵身上做同样的设置。
  6.将长度范围延长1,因为点数总是树枝数+1。基于会出现在新绳索(图解中的点3和点6)的点创造一个新的数组,并将其从这一对象的数组中删除。
  7、你可能会注意到在图解中绳索的断裂点被从对象数组中删除了,并转移到了新的绳索。为了改正这点你需要“复制”这一点并将其添加到对象的点数组中。这一对象的最后树枝同样也需要做出更新。
  8.割断比例将用于判断新绳索的长度。在图解中,这一比例将为0.5。
  9.修改这一对象的点数。在图解中,它变成了4。
  10.重新创造节点,让它能够与这一对象联系在一起。附加bodyA和newBodyB到这一绳索的节点上,使用旧的长度和割断比例去决定新长度。同样,将newBodyB放置在绳索被割断的位置。
  11.创造一个新的绳索节点并附加newBodyA和bodyB到它上面,同样在割断位置放置newBodyA。
  12.然后销毁旧的节点并更新实例变量为新节点。
  13.最后,使用你在之前所收集的数组创造新的VRope对象和新的节点。你仍然需要执行这一初始方法,但这却非常简单,紧接着便是这一代码。
  这便是初始方法。添加这一内容到你刚刚添加的代码下方:
  -(id)initWithRopeJoint:(b2RopeJoint*)aJoint
  spriteSheet:(CCSpriteBatchNode*)spriteSheetArg
  points:(NSArray*)points
  sticks:(NSArray*)sticks
  sprites:(NSArray*)sprites {
  if((self = [super init])) {
  joint = aJ
  spriteSheet = spriteSheetA
  vPoints = [[NSMutableArray alloc] initWithArray:points];
  vSticks = [[NSMutableArray alloc] initWithArray:sticks];
  ropeSprites = [[NSMutableArray alloc] initWithArray:sprites];
  numPoints = vPoints.
  }是的,这一代码很简单。它只是追踪了你之前进入的数组并更新了numPoints实例变量。
  你可能已经注意到在代码中有一个关于方法调用setPointB并未被发现的警告。是的,我骗了你。因为我不希望在解释大量割绳子方法的同时让这些内容复杂化。但这却是很容易解决的问题。
  打开VStick.h并添加如下声明:
  -(void)setPointB:(VPoint *)然后打开VStick.m并在最后添加如下代码:
  -(void)setPointB:(VPoint *)point {
  pointB =
  }就像你所看到的,这只是一个简单的调节方法。现在你的程序应该可以不带任何问题地进行编译,你最终可以割断绳子了!
  不过在你割断绳子前,你需要两个新的实体。在HelloWorldLayer.mm中添加如下新方法去创造这些实体:
  -(b2Body *) createRopeTipBody
  b2BodyDef bodyD
  bodyDef.type = b2_dynamicB
  bodyDef.linearDamping = 0.5f;
  b2Body *body = world-&CreateBody(&bodyDef);
  b2FixtureDef circleD
  b2CircleS
  circle.m_radius = 1.0/PTM_RATIO;
  circleDef.shape = &
  circleDef.density = 10.0f;
  // Since these tips don’t have to collide with anything
  // set the mask bits to zero
  circleDef.filter.maskBits = 0;
  body-&CreateFixture(&circleDef);
  }在这里唯一值得指出的便是maskBits属性。它被设为0所以它不会与你的世界中的任何事物发生碰撞,这也是它应该具有的状态,因为它只是你用于模拟绳索重量的实体。
  现在回到ccTouchesMove:withEvent:并在return声明钱添加如下内容:
  b2Body *newBodyA = [self createRopeTipBody];
  b2Body *newBodyB = [self createRopeTipBody];
  VRope *newRope = [rope cutRopeInStick:stick newBodyA:newBodyA newBodyB:newBodyB];
  [ropes addObject:newRope];这应用了你在之前所创造的所有内容,并在正确的点上割断了绳索。
  现在这些代码便已足够了。创建并运行,你应该能够用手指割断绳索了。
  cut the rope(from raywenderlich)
  不过现在乐趣和游戏才真正开始。
  吃菠萝的鳄鱼?为什么不?
  既然较为复杂的部分已经完成了,让我们添加一些游戏玩法去喂鳄鱼吃菠萝吧。
  在精灵表上你已经拥有另一个鳄鱼精灵,即张着大嘴巴。你接下来要做的便是让鳄鱼时不时打开并关上嘴巴。为了让菠萝在鳄鱼张开嘴巴的时候掉落,玩家必须计算绳子被割断的时间、所以是鳄鱼决定自己什么时候饿了!
  你需要一种方法去检查掉落的菠萝是否与鳄鱼的嘴巴相吻合。为了做到这点,你需要使用Box2D的接触监听器。
  第一步便是添加一个将模拟鳄鱼嘴巴的实体,所以接触监听器将检测与菠萝的碰触。打开HelloWorldLayer.h并添加如下内容:
  b2Body *crocMouth_; // weak ref
  b2Fixture *crocMouthBottom_; // weak ref然后前往HelloWorldLayer.mm的initPhysics并在最后添加如下代码:
  // Define the croc’s “mouth”.
  b2BodyDef crocBodyD
  crocBodyDef.position.Set((s.width – croc_.textureRect.size.width)/PTM_RATIO, (croc_.position.y)/PTM_RATIO);
  crocMouth_ = world-&CreateBody(&crocBodyDef);
  // Define the croc’s box shape.
  b2EdgeShape crocB
  // bottom
  crocBox.Set(b2Vec2(5.0/PTM_RATIO,15.0/PTM_RATIO), b2Vec2(45.0/PTM_RATIO,15.0/PTM_RATIO));
  crocMouthBottom_ = crocMouth_-&CreateFixture(&crocBox,0);
  crocMouth_-&SetActive(NO);你最先在精灵的左下角创造了一个静态实体。然后你创造一个固定装置去模拟鳄鱼的嘴巴底部(即你将用于碰撞检测的装置)。如果你运行项目,你便会在右边位置看到这个固定装置。
  croc(from raywenderlich)
  当你打开鳄鱼的嘴巴时你便能够看到它。你可能会好奇为什么实体(游戏邦注:这是指鳄鱼嘴巴的物理实体而不是真正的实体)被设为暂停(最后一行)。这是因为鳄鱼的嘴巴最初是紧闭着的。在这种状态下,你便不需要菠萝与之互动。
  是时候让鳄鱼张开嘴巴了。添加如下两个变量到HelloWorldLayer.h中:
  BOOL crocMouthO
  NSTimer *crocAttitudeTimer现在添加这一方法到HelloWorldLayer.mm:
  -(void)changeCrocAttitude
  crocMouthOpened = !crocMouthO
  NSString *spriteName = crocMouthOpened ? @”croc_front_mouthopen.png” : @”croc_front_mouthclosed.png”;
  [croc_ setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:spriteName]];
  [croc_ setZOrder:crocMouthOpened ? 1 : -1];
  crocMouth_-&SetActive(crocMouthOpened);
  [crocAttitudeTimer invalidate];
  [crocAttitudeTimer release];
  crocAttitudeTimer = [[NSTimer scheduledTimerWithTimeInterval:3.0 + 2.0 * CCRANDOM_0_1()
  target:self
  selector:@selector(changeCrocAttitude)
  userInfo:nil
  repeats:NO] retain];
  }这一方法改变了布尔运算,即表明鳄鱼是否打开或闭上嘴巴,并改变精灵去反应这一情况,如果嘴巴是张开的,将实体设置为有效,最终在3至5秒间的随机时间后开启计时器去重复这一情况。
  注意你正在改变鳄鱼的精灵zOrder。这实现了如下的行为:当鳄鱼张开嘴巴时,如果菠萝掉落,它将落在鳄鱼后面(因为现在菠萝带有一个0的zOrder和1的zOrder),这会给我们一种错觉就好像鳄鱼吃掉了菠萝。如果鳄鱼的嘴巴是闭着的,那么相反的情况便会发生,即菠萝会掉在鳄鱼前面。你将马上看到这种情况。
  在你忘记前,在HelloWorldLayer.mm添加如下代码到dealloc:
  [crocAttitudeTimer invalidate];
  [crocAttitudeTimer release];最后,在initLevel最后changeCrocAttitude的初始调用:
  crocMouthOpened = YES;
  [self changeCrocAttitude];在这之后,changeCrocAttitude将再次在随机间隔中调用方法。
  很棒!创建并运行项目,你将看到鳄鱼的嘴巴能够不时打开与闭合了。
  eat(from raywenderlich)
  如果你在鳄鱼张开嘴巴的时候准确将菠萝掉到它的嘴巴里,它将躺下一会,但是当鳄鱼嘴巴闭上时,我们便会看到菠萝的存在。不要担心,你将使用碰触监听器解决这一问题。
  你拥有碰触!
  一开始先下载碰触监听器。这里有包含和执行文件。
  将这些文件拖到项目树中。确保选中“Copy items into destination group’s folder”将这些文件复制到项目文件夹中:
  copy(from raywenderlich)
  现在打开HelloWorldLayer.h并添加如下内容:
  #import “MyContactListener.h”
  并添加如下代码到类变量中:
  MyContactListener *contactL打开HelloWorldLayer.mm并在initPhysics最后添加这些内容:
  // Create contact listener
  contactListener = new MyContactListener();
  world-&SetContactListener(contactListener);添加如下清除代码到dealloc:
  delete contactL
  contactListener = NULL;现在添加这一代码到update的最后(不要担心两个警告和错误的出现,你可以快速地解决它们):
  // Check for collisions
  bool shouldCloseCrocMouth = NO;
  std::vectortoD
  std::vector::
  for(pos = contactListener-&_contacts.begin(); pos != contactListener-&_contacts.end(); ++pos)
  MyContact contact = *
  bool hitTheFloor = NO;
  b2Body *potentialCandy =
  // The candy can hit the floor or the croc’s mouth. Let’s check
  // what it’s touching.
  if (contact.fixtureA == crocMouthBottom_)
  potentialCandy = contact.fixtureB-&GetBody();
  else if (contact.fixtureB == crocMouthBottom_)
  potentialCandy = contact.fixtureA-&GetBody();
  else if (contact.fixtureA-&GetBody() == groundBody)
  potentialCandy = contact.fixtureB-&GetBody();
  hitTheFloor = YES;
  else if (contact.fixtureB-&GetBody() == groundBody)
  potentialCandy = contact.fixtureA-&GetBody();
  hitTheFloor = YES;
  // Check if the body was indeed one of the candies
  if (potentialCandy && [candies indexOfObject:[NSValue valueWithPointer:potentialCandy]] != NSNotFound)
  // Set it to be destroyed
  toDestroy.push_back(potentialCandy);
  if (hitTheFloor)
  // If it hits the floor you’ll remove all the physics of it and just simulate the pineapple sinking
  CCSprite *sinkingCandy = (CCSprite*)potentialCandy-&GetUserData();
  // Sink the pineapple
  CCFiniteTimeAction *sink = [CCMoveBy actionWithDuration:3.0 position:CGPointMake(0, -sinkingCandy.textureRect.size.height)];
  // Remove the sprite and check if should finish the level.
  CCFiniteTimeAction *finish = [CCCallBlockN actionWithBlock:^(CCNode *node)
  [self removeChild:node cleanup:YES];
  [self checkLevelFinish:YES];
  // Run the actions sequentially.
  [sinkingCandy runAction:[CCSequence actions:
  finish,
  nil]];
  // All the physics will be destroyed below, but you don’t want the
  // sprite do be removed, so you set it to null here.
  potentialCandy-&SetUserData(NULL);
  shouldCloseCrocMouth = YES;
  std::vector::iterator pos2;
  for(pos2 = toDestroy.begin(); pos2 != toDestroy.end(); ++pos2)
  b2Body *body = *pos2;
  if (body-&GetUserData() != NULL)
  // Remove the sprite
  CCSprite *sprite = (CCSprite *) body-&GetUserData();
  [self removeChild:sprite cleanup:YES];
  body-&SetUserData(NULL);
  // Iterate though the joins and check if any are a rope
  b2JointEdge* joints = body-&GetJointList();
  while (joints)
  b2Joint *joint = joints-&
  // Look in all the ropes
  for (VRope *rope in ropes)
  if (rope.joint == joint)
  // This “destroys” the rope
  [rope removeSprites];
  [ropes removeObject:rope];
  joints = joints-&
  world-&DestroyJoint(joint);
  // Destroy the physics body
  world-&DestroyBody(body);
  // Removes from the candies array
  [candies removeObject:[NSValue valueWithPointer:body]];
  if (shouldCloseCrocMouth)
  // If the pineapple went into the croc’s mouth, immediately closes it.
  [self changeCrocAttitude];
  // Check if the level should finish
  [self checkLevelFinish:NO];
  }这看起来有点复杂,但事实却不是如此,它只是长了点罢。这是用于突围游戏教程中的代码变量。
  首先你迭代了所有碰触。如果任何碰触包含了地面或鳄鱼的嘴巴,你便会将参考带到其它实体中,就像它可能是个糖果(游戏邦注:在这一项目中,它不能是任何其它实体,就像绳索并不会与实体或地面碰触到,但是如果现在能够包含这一检测的话便再好不过了,这能防止你在之后添加其它元素到游戏玩法中)。之后你检测了糖果数组,如果潜在糖果实体存在的话你便能够确信它便是糖果。
  如果它的确是个糖果的话,你会将其添加到破坏矢量中。在此的区别在于如果它撞到了鳄鱼的嘴巴,你会设置一个弯曲件去闭上鳄鱼的嘴巴。但如果它撞到了地面,那么鳄鱼的嘴巴便不需要闭上了。
  在糖果撞到地面的情况下,你将添加动画到精灵上去模拟糖果下降。在模拟最后,你将强迫关卡结束,因为在游戏中,如果鳄鱼吃掉了所有糖果,你便只能通过关卡。(你将很快添加这一方法。)
  在首次循环后检查所有碰触,你将通过toDestroy矢量去删除需要被销毁的物理实体。你的游戏中的一个复杂元素是VRope对象的删除,即可能与被删除的对象联系在一起。所以为了所有被销毁的对象,你将通过它的节点并检查它们是否属于任何VRope对象。如果它们属于,你将从场景中删除精灵并从绳索数组中删除VRope对象。
  最后,如果遇到了任何嘴巴碰击情况,你便要闭上鳄鱼的嘴巴,并调用一个方法去检查关卡是否应该结束。
  现在你应该拥有两个有关checkLevelFinish方法的警告,以及一个错误,因为VRope对象并未揭露节点的实体变量。现在解决这一问题。
  你将使用另一个标准C++类,所以添加如下代码到HelloWorldLayer.mm中:
  #import 现在添加checkLevelFinish到HelloWorldLayer.mm中:
  -(void)checkLevelFinish:(BOOL)forceFinish
  if ([candies count] == 0 || forceFinish)
  // Destroy everything
  [self finishedLevel];
  // Schedule a level restart 2 seconds from now
  dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC);
  dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
  [self initLevel];
  -(void) finishedLevel
  std::settoD
  // Destroy every rope and add the objects that should be destroyed
  for (VRope *rope in ropes)
  [rope removeSprites];
  // Don’t destroy the ground body…
  if (rope.joint-&GetBodyA() != groundBody)
  toDestroy.insert(rope.joint-&GetBodyA());
  if (rope.joint-&GetBodyB() != groundBody)
  toDestroy.insert(rope.joint-&GetBodyB());
  // Destroy the joint already
  world-&DestroyJoint(rope.joint);
  [ropes removeAllObjects];
  // Destroy all the objects
  std::set::
  for(pos = toDestroy.begin(); pos != toDestroy.end(); ++pos)
  b2Body *body = *
  if (body-&GetUserData() != NULL)
  // Remove the sprite
  CCSprite *sprite = (CCSprite *) body-&GetUserData();
  [self removeChild:sprite cleanup:YES];
  body-&SetUserData(NULL);
  world-&DestroyBody(body);
  [candies removeAllObjects];
  }checkLevelFinish非常简单。finishedLevel也非常简单,你所面对的唯一复杂元素便是在一开始销毁所有的VRope对象,然后所有对象都与之联系在一起,除了地面实体。这便是你在割断绳子并留下糖果时所创造的所有对象。
  你正在使用一个设置而不是一个矢量,因为当在所有的绳索中循环时,糖果将被附加到更多绳索上。在这种情况下,如果你使用一个矢量,你便能够添加同样的实体两次并在销毁循环中将其删除两次。一个设置能够通过避免添加同样的对象两次而解决这一情况。
  在销毁循环中,你也必须销毁实体的相关精灵。
  现在你只需要在VRope中呈现节点实例变量,你便算完成设置了!
  打开VRope.h并在cutRopeInStick:newBodyA:newBodyB:的声明之后添加如下内容:
  @property (nonatomic, readonly) b2RopeJoint *然后添加如下内容到VRope.mm,也就是在#ifdefBOX2D_H后:
  @synthesize joint =酷!运行项目并游戏!
  添加更多糖果
  这已经很有趣了,不是吗?在这一教程中你已经取得很大进展了!你可以添加一些最后的碰触进行更好地完善。
  前往HelloWorldLayer.mm的initLevel并在向前移动世界的组块前添加如下内容:
  // Add the candy
  b2Body *body2 = [self createCandyAt:CGPointMake(s.width * 0.5, s.height)];
  // Change the linear dumping so it swings more
  body2-&SetLinearDamping(0.01);
  // Add a bunch of ropes
  [self createRopeWithBodyA:groundBody anchorA:cc_to_b2Vec(s.width * 0.65, s.height + 5)
  bodyB:body2 anchorB:body2-&GetLocalCenter()
  sag:1.0];创建并运行,你将看到上方悬挂了更多的糖果。
  另外一个能够轻松完善的内容便是绳索的质量。你也许注意到,当绳索有点不自然时,你便能够看到树枝。为了解决这种情况,你需要改变VRope的其中一个参数。
  打开VRope.mm并前往createRope:pointB:distance:找到这行内容:
  int segmentFactor = 12; //increase value to have less segments per rope, decrease to have more segments如果你将数值减少到6,你的绳索便会有更多VStick段数,并将变得更加自然。当然,你减少的数值越大,绳索模拟便会越长。所以这里存在一个性能权衡—-通过测试去观察怎样才是最适合你的应用。
  另外一个奇怪的内容便是绳索摇摆的幅度太大且有点不稳定,甚至在保持静态一会后还会摇摆。你也可以修改这一问题。打开VPoint.m并找到applyGravity::
  -(void)applyGravity:(float)dt {
  y -= 10.0f* //gravity magic number
  }如果你减少了这一数值(10,0),绳索将变得“更轻”,并能够更自然地移动。尝试着将其改为1.0。
  仍会发生的一件事便是菠萝和世界上缘间的碰触看起来有点奇怪—-菠萝竟然会与天空碰撞在一起?!所以删除上缘,连同左右边缘,并稍微提高底缘去拓宽世界。
  打开HelloWorldLayer.mm并前往initPhysics。删除这些内容:
  // top
  groundBox.Set(b2Vec2(0,s.height/PTM_RATIO), b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO));
  groundBody-&CreateFixture(&groundBox,0);
  // left
  groundBox.Set(b2Vec2(0,s.height/PTM_RATIO), b2Vec2(0,0));
  groundBody-&CreateFixture(&groundBox,0);
  // right
  groundBox.Set(b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO), b2Vec2(s.width/PTM_RATIO,0));
  groundBody-&CreateFixture(&groundBox,0);然后将这一行:
  groundBox.Set(b2Vec2(0,0), b2Vec2(s.width/PTM_RATIO,0));改为:
  groundBox.Set(b2Vec2(-s.width/PTM_RATIO,0), b2Vec2(2*s.width/PTM_RATIO,0));最后,一些内存管理附加到VRope上。如果你在项目中使用Xcode的Analyze,你将看到一些带有内存管理的潜在问题:不寻常的执行方法将会演变成问题所在。实际上,它们可能已经成为一种问题了,因为你释放了在cutRopeInStick:bodyA:bodyB:中所创造的VPoint,并且它在dealloc方法中再次释放了它。
  为了让类紧跟着最佳实践,打开VRope.mm,找到createRope:pointB:distance:并改变它去添加两个释放声明,如下:
  for(int i=0;i&numPi++) {
  CGPoint tmpVector = ccpAdd(pointA, ccpMult(ccpNormalize(diffVector),multiplier*i*(1-antiSagHack)));
  VPoint *tmpPoint = [[VPoint alloc] init];
  [tmpPoint setPos:tmpVector.x y:tmpVector.y];
  [vPoints addObject:tmpPoint];
  // Add this line:
  [tmpPoint release];
  for(int i=0;i&numPoints-1;i++) {
  VStick *tmpStick = [[VStick alloc] initWith:[vPoints objectAtIndex:i] pointb:[vPoints objectAtIndex:i+1]];
  [vSticks addObject:tmpStick];
  // Add this line:
  [tmpStick release];
  现在前往dealloc并删除这些内容:
  for(int i=0; i & numP i++) {
  [[vPoints objectAtIndex:i] release];
  if(i!=numPoints-1)
  [[vSticks objectAtIndex:i] release];
  }现在便算解决了内存问题!
  无偿的音乐和音效
  游戏很酷,但却与我的想法有点出入。添加一些声音和背景音乐去活跃它!
  我从中选择了一首很棒的丛林歌曲,并从freesound.rog中选择了一些音效。你也可以做出自己的选择。
  提取档案文件并将其拖到你的项目的资源文件夹中:
  sounds(from raywenderlich)
  确保选中“Copy items into destination group’s folder”去复制这些文件到你的项目文件夹中。
  copy(from raywenderlich)
  然后添加如下输入和常量到你的HelloWorldLayer.mm的最上方:
  #import “SimpleAudioEngine.h”
  #define kCuttingSound @”cut.caf”
  #define kBiteSound @”bite.caf”
  #define kSplashSound @”splash.caf”
  #define kBackgroundMusic @”CheeZeeJungle.caf”现在添加这一代码到init,即在scheduleUpdate调用前面:
  [[SimpleAudioEngine sharedEngine] preloadEffect:kCuttingSound];
  [[SimpleAudioEngine sharedEngine] preloadEffect:kBiteSound];
  [[SimpleAudioEngine sharedEngine] preloadEffect:kSplashSound];
  [[SimpleAudioEngine sharedEngine] playBackgroundMusic:kBackgroundMusic loop:YES];
  [SimpleAudioEngine sharedEngine].backgroundMusicVolume = 0.4;这预先加载了你的所有音频文件。它同样也播放了背景音乐并在其结束时将其设置为自动循环。最后一行内容稍微降低了背景音乐的音量,所以它并不会压过其它声音。
  现在你只需要在一些关键的地方添加音效便可。
  当用户割断绳索时必须出现割断的声音。你应该记得,这发生在ccTouchesMoved:,即在两个循环的“if”条件中。找到ccTouchedMoved:withEvent:并在返回声明(在“if”条件中)前添加如下代码:
  [[SimpleAudioEngine sharedEngine] playEffect:kCuttingSound];咬声应该出现在update之后,即在最后的if条件(你要求鳄鱼闭上嘴巴)中。在if中添加如下内容,即在changeCrocAttitude调用之后:
  // Play sound effect
  [[SimpleAudioEngine sharedEngine] playEffect:kBiteSound];最后但同样重要的是菠萝掉落水里的飞溅声音。这也发生在update中。记得你是何时添加代码让菠萝掉落的吗?在这里应该触发音效。在update中找到if条件并添加如下内容到if条件中(在最上方):
  [[SimpleAudioEngine sharedEngine] playEffect:kSplashSound];运行并测试。只需要几行代码便能够创造出改变游戏的音效了!
  知道何时结束
  该结束的时候游戏便会结束,但是你应该呈现一些文本让用户知道他们是否喂到了鳄鱼并获取胜利,或者让鳄鱼失望而遭遇失败。
  crocdile(from raywenderlich)
  首先,存在一种情况是当糖果掉落到水里时,用户遭遇失败。在update中添加飞溅声音的同样位置上添加代码,即在飞溅声音调用之后:
  CGSize s = [[CCDirector sharedDirector] winSize];
  CCLabelTTF *loseLabel = [[CCLabelTTF alloc] initWithString:@”Try Again!”
  dimensions:s
  hAlignment:kCCTextAlignmentCenter
  vAlignment:kCCVerticalTextAlignmentCenter
  fontName:@”Verdana-Bold”
  fontSize:60.0];
  loseLabel.color = ccc3(255, 0, 0);
  loseLabel.anchorPoint = CGPointZ
  [self addChild:loseLabel];这添加了一个红色标签到屏幕的中心。
  为了删除信息,在完成组块中添加一个调用去删除它:
  // Remove the sprite and check if should finish the level.
  CCFiniteTimeAction *finish = [CCCallBlockN actionWithBlock:^(CCNode *node)
  [self removeChild:node cleanup:YES];
  [self checkLevelFinish:YES];
  // add this line:
  [self removeChild:loseLabel cleanup:YES];
  }];如果用户因为将所有糖果都喂给了鳄鱼而获得胜利,那么通过在checkLevelFinish中的“if”条件最后添加这一内容而告诉他们:
  if ([candies count] == 0 && !forceFinish)
  CGSize s = [[CCDirector sharedDirector] winSize];
  CCLabelTTF *winLabel = [[CCLabelTTF alloc] initWithString:@”Level Finished!”
  dimensions:s
  hAlignment:kCCTextAlignmentCenter
  vAlignment:kCCVerticalTextAlignmentCenter
  fontName:@”Verdana-Bold”
  fontSize:60.0];
  winLabel.color = ccc3(255, 0, 0);
  winLabel.anchorPoint = CGPointZ
  [self addChild:winLabel];
  dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
  [self removeChild:winLabel cleanup:YES];
  }运行并尝试着让鳄鱼吃掉两个糖果!上面的糖果真的很难处理!有时候鳄鱼真的要让我抓狂了!
  整个过程真的是既困难又有趣!现在你可以继续完善这款游戏。我敢保证你能够找到许多方法去完善它。
一站关注,多维度进入移动游戏圈
上方网: sfw-2012
上道: shangdaowx
小伙伴招聘:xhbzhaopin
爱知客: izhike2012
你可能感兴趣的资料
  自转型移动游戏研发以来,蜗牛数字的手游产品线从最初的《太极熊猫》“独行江湖”,逐
  “退潮后,才知道谁在裸泳”,股神巴菲特的这句话被奉为经典,引申到国内游戏行业,资
  自2015年下半年起,手游重度化的趋势日益严重,大量MMO产品抢占份额,但三国题
  华闻传媒24日公告,近日已将控股子公司对参股公司北京磨铁图书有限公司(以下简称“
  2月26日上方网消息,苏格兰国际发展局近日发布了一份《苏格兰游戏产业报告》,报告
12345678910
2345678910
2345678910
(C) 上方网 京ICP证:041414号 电子公告许可 北京市公安局海淀分局备案编号:

我要回帖

更多关于 游戏制作 的文章

 

随机推荐