[ 李华明Himi ](http://www.himigame.com/about-himi)原创,转载务必在明显处注明:
转载自[【黑米GameDev街区】](http://www.himigame.com/) 原文链接: [http://www.himigame.com/iphone-cocos2d/507.html](http://www.himigame.com/iphone-cocos2d/507.html "【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边以及禁止游戏中自动锁屏问题!")
[](http://blog.csdn.net/xiaominghimi/article/details/6926913)
本章节主要为大家介绍在游戏开发过程中经常遇到的两个问题;
1.解决滚屏背景或拼接地图有黑边!
对于游戏开发中,背景(游戏地图)是必要的元素之一,那么对于大部分游戏的背景都是动态,或者不断移动的;例如RPG中的背景随着人物、主角而移动,那么一般情况下背景都是由地图编辑器(图块)拼出来的,要不就是直接一整张大图去显示,在或者就是将一张大图进行裁减成N张,然后再进行拼接完成等等;
那么对于背景(地图)元素中存在的重复图块很少的话基本上就没有利用地图编辑器的必要了;在这里Himi不来介绍如何在cocos2d中使用地图编辑器做背景地图 ,而是介绍在cocos2d中制作滚动地图时利用拼接地图方式遇到的黑边问题;
如下图所示,背景是由3张图片拼接而成,如下3张图:
![](https://box.kancloud.cn/2016-03-31_56fcd0190bbf7.png)
然后Himi将此3张作为3个精灵然后顺次绘制在屏幕上代码如下:
~~~
//将三张图拼成一张完整背景
CGSize screenSize =[[CCDirector sharedDirector]winSize];
CCSprite *bgTile1 =[CCSprite spriteWithFile:@"himi_01.png"];
bgTile1.position=ccp(bgTile1.contentSize.width*0.5,screenSize.height*0.5);
CCSprite *bgTile2 =[CCSprite spriteWithFile:@"himi_02.png"];
bgTile2.position=ccp(bgTile1.position.x+bgTile1.contentSize.width,bgTile1.position.y);
CCSprite *bgTile3 =[CCSprite spriteWithFile:@"himi_03.png"];
bgTile3.position=ccp(bgTile2.position.x+bgTile2.contentSize.width,bgTile2.position.y);
[self addChild:bgTile1 z:0 tag:11];
[self addChild:bgTile2 z:0 tag:22];
[self addChild:bgTile3 z:0 tag:33];
~~~
此时运行的截图如下:
![](https://box.kancloud.cn/2016-03-31_56fcd019252cf.png)
从上图童鞋们就可以看到拼接有裂缝,那么接着让3个精灵从左向右不断的x轴+1进行移动,代码如下:
~~~
//----init函数中
//每0.1秒刷新函数move
[self schedule:@selector(move) interval:0.1];
//move函数
-(void)move{
CCSprite *tempSprite =(CCSprite*)[self getChildByTag:11];
tempSprite.position=ccpAdd(tempSprite.position, ccp(1,0));
tempSprite =(CCSprite*)[self getChildByTag:22];
tempSprite.position=ccpAdd(tempSprite.position, ccp(1,0));
tempSprite =(CCSprite*)[self getChildByTag:33];
tempSprite.position=ccpAdd(tempSprite.position, ccp(1,0));
}
~~~
运行截图如下:
![](https://box.kancloud.cn/2016-03-31_56fcd0194a2d7.png)
这时当移动到一定距离时候会发现刚才的缝隙消失了,是消失了,通过以上两张运行效果图可以说明:
在cocos2d中如图你使用拼接背景地图的方式去做的话,每处拼接处在移动时都会时不时的出现黑边(裂缝),至于如何解决我想童鞋们第一想法就是在裁图的时候多切出一像素的方法,第一张比如原来是100,故意裁出101,第二张绘制的时候X轴前一个像素...以此类推,还有些童鞋认为是美工的原因,可能在裁图的时候有透明像素的存在造成,当然美工裁图的不仔细确实是个不可排除的原因,但是最终解决的方案应该是将精灵设置贴图无锯齿的属性,这样就可以完美解决此问题,设置精灵贴图无锯齿方法如下:
~~~
[CCSprite.texture setAliasTexParameters];
~~~
我们将这句添加上之后再次运行,代码更改如下:
~~~
//将三张图拼成一张完整背景
CGSize screenSize =[[CCDirector sharedDirector]winSize];
CCSprite *bgTile1 =[CCSprite spriteWithFile:@"himi_01.png"];
bgTile1.position=ccp(bgTile1.contentSize.width*0.5,screenSize.height*0.5);
CCSprite *bgTile2 =[CCSprite spriteWithFile:@"himi_02.png"];
bgTile2.position=ccp(bgTile1.position.x+bgTile1.contentSize.width,bgTile1.position.y);
CCSprite *bgTile3 =[CCSprite spriteWithFile:@"himi_03.png"];
bgTile3.position=ccp(bgTile2.position.x+bgTile2.contentSize.width,bgTile2.position.y);
//让3个精灵都设置贴图无锯齿
[bgTile1.texture setAliasTexParameters];
[bgTile2.texture setAliasTexParameters];
[bgTile3.texture setAliasTexParameters];
[self addChild:bgTile1 z:0 tag:11];
[self addChild:bgTile2 z:0 tag:22];
[self addChild:bgTile3 z:0 tag:33];
~~~
再次运行效果图如下:
![](https://box.kancloud.cn/2016-03-31_56fcd0197fbaa.png)
OK,完美解决;
【2013年12月13日补充】:
对于裂缝、黑边、模糊、透明等问题,这里Himi再详细描述补充下:
1.首先如果你使用TP(Texturepacker)进行的图片打包的话:
首先确定是否打包时,帧之间保证了>=1像素距离。
然后确定是否勾选了"premultply alhpa" 这一项(应该勾选)
最后确认你项目中是否设置了如下代码:
CCTexture2D::PVRImagesHavePremultipliedAlpha(true);
如上代码设置的作用是
2.图片缩放后模糊透明问题
首先cocos2d/cocos2dx引擎中,默认的贴图设置了抗锯齿,如下函数:
setAntiAliasTexParameters()//设置抗锯齿 (但是会模糊透明)
那么缩放后的图片由于设置了抗锯齿会造成图片边缘模糊透明,所以对此的解决方式,我们单独处理缩放的图进行设置非抗锯齿,如下函数:
setAliasTexParameters() //设置非抗锯齿 (但是不抗锯齿)
3.图片感觉模糊不清晰
首先对于此问题的原因是:引擎默认使用的是透视投影模式,此模式的效果为近大远小的效果,所以远处的则模糊不清晰
所以我们如果想让整体所有贴图清晰,那么我们可以设置引擎为正交投影模式即可,如下代码设置:
CCDirector::sharedDirector()->setProjection(kCCDirectorProjection2D);
如果还不行,宝贝们,你们赢了!只要以上方法都尝试过100%没问题的!!!!!!
2.下面介绍第二个问题:如何禁止手机自动锁屏的问题;
对于手机自动锁屏的问题一般都是在项目尾声的时候发现由于手机自动锁屏所带来的各种问题,例如,在cocos2d中我们调用暂停游戏的函数后,如果用户无操作,手机自动锁屏后,解锁再次进入游戏就会发现游戏不处于暂停了,(如果你有暂停界面的话,你将看到你暂停界面存在,而后面的游戏照常运行- -)
那么这里Himi给出在应用中禁止手机自动锁屏的代码,如下:
~~~
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
~~~
OK,本章介绍的知识点虽然很少解决的方法也很简单,但是也是游戏中最容易遇到的两个问题;
那么这里肯定会有不少童鞋认为本身一句代码的事情非写这么多进行说明,嗯 ,确实写的过于详细,但是Himi之所以写这么详细主要还是想让还没有遇到此类问题的童鞋清晰化此类问题出现的原因,这样能让更多童鞋减少以后遇到此问题的疑问~
- 前言
- 【Iphone 游戏开发】游戏引擎剖析
- [Object-C语言随笔之一]Mac os 下搭建iOS开发环境
- [Object-C语言随笔之二] 《NSLog》常用的打印调试语句与自动排版
- [Object-C语言随笔之三] 类的创建和实例化以及函数的添加和调用!
- [Object-C语言随笔之四]创建视图并绘制简单图形
- 【iOS-Cocos2d游戏开发之一】搭建cocos2d游戏引擎环境HelloWorld!
- 【iOS-Cocos2d游戏开发之二】Cocos2D 游戏开发资源贴(教程以及源码)
- 【iOS-Cocos2d游戏开发之三】CCScene切换的所有特效(28种)以及设置屏幕横竖屏!
- 【iOS-Cocos2d游戏开发之四】独自收集Cocos2d提供的字体!共57种(有对照的字体图)
- 【iOS-Cocos2d游戏开发之五】多触点与触屏事件详解(单一监听、事件分发)【11月28日更新】
- 【iOS-Cocos2d游戏开发之六】对触屏事件追加讲解,解决无法触发ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戏开发之七】在cocos2d中添加/删除系统组件,并解决View设置透明会影响View中的其他组件的问题!【11月28日更新解决添加组件Cocos2d动画停止播放的BUG】
- 【iOS-Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- 【iOS-Cocos2d游戏开发之十】添加粒子系统特效并解决粒子特效与Layer之间的坐标问题;
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 【iOS-Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
- 【iOS-Cocos2d游戏开发之十三】CCSprite利用Bezier(贝塞尔)做抛物线动作并让CCSprite同时播放两个Action动作!
- 【iOS-Cocos2d游戏开发之十四】音频/音效/视频播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d进行视频播放!)
- 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!
- 【iOS-Cocos2d游戏开发之十六】添加本地通知(UILocalNotification)以及添加系统组件滚动视图(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戏开发之十七】灵活使用精灵可视区域(TextureRect)与锚点(anchorPoint),并结合可视区域与锚点制作进度条!
- 【iOS开发必备指南合集】申请企业级IDP、真机调试、游戏接入GameCenter 指南(实现仿官方的成就提示)、游戏接入OpenFeint指南;
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边以及禁止游戏中自动锁屏问题!【2011年12月18日补充】
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取"产品付费数量等于0的问题"】
- 【iOS-cocos2d-X 游戏开发之一】在Mac下结合Xcode搭建Cocos2d-X开发环境!
- 【iOS-cocos2d-X 游戏开发之二】【必看篇】总结阐述Cocos2d-X与Cocos2d-iphone区别;
- 【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3
- 【iOS-Cocos2d游戏开发之二十】精灵的基础知识点总汇(位图操作/贴图更换/重排z轴等)以及利用CCSprite与CCLayerColor制作简单遮盖层!
- 【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置攻击帧(指定开始帧)以及扩展Cocos2d源码的CCAnimation简化动画创建!
- 【iOS-Cocos2d游戏开发之二十二 】CCSpeed实现CCAnimate动画进行时设置慢动作以及设置游戏加减速进行(塔防游戏必备)!
- 【iOS-cocos2d-X 游戏开发之三】Mac下配置Android NDK环境并搭建Cocos2d-x环境并Eclipse正常编译运行Cocos2dX自带TestsDemo项目!
- 【iOS-cocos2d-X 游戏开发之四】Cocos2dX创建Android NDK新项目并编译导入Eclipse中正常运行!
- 【iOS-cocos2d-X 游戏开发之五】游戏存储之Cocos2dX自带CCUserDefault类详解;
- 【iOS-cocos2d-X 游戏开发之六】使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码!
- 【iOS-cocos2d-X 游戏开发之七】整合Cocos2dX的Android项目到Xcode项目中,Xcode编写&编译代码,Android导入打包运行即可!
- 【iOS-iap防护】验证用户付费收据!拒绝iap Cracker!拒绝iap Free!让iphone越狱用户无从下手!【2012年5月2日更新防护iap Free的方法】
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
- 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!
- 【iOS-cocos2d-X 游戏开发之十】自定义CCSprite/Layer/CCNode及静态类模版&自定义类细节说明&Cocos2dx触屏事件讲解
- 【iOS-cocos2d-X 游戏开发之十一】New CCSprite()带来的错误&使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戏开发之十二】自定义Cocos2dx摇杆(增强Joystick),增加摇杆跟随用户触点作为摇杆坐标,让摇杆不再死板!
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- 【iOS-cocos2d-X 游戏开发之十四】Xcode中c++&Object-C混编,详细介绍如何在cocos2dx中访问object函数以及Apple Api
- 【iOS-cocos2d-X 游戏开发之十五】Cocos2dx中响应Android的Back(返回)与Menu(小房子)事件&&Cocos2dx自动释放粒子内存函数!
- 【iOS-cocos2d-X 游戏开发之十六】配置你的Cocos2dx项目编译后的Android自动使用(-hd)高清图&设置Android自适应屏幕、缩放比例方法!
- 【Cocoa(mac) Application 开发系列之四】动作编辑器(Cocos2dx)制作流程详解及附上响应鼠标滚轴事件、反转坐标系、导入/创建资源目录等知识点代码!
- 【Cocos2d-X(2.x) 游戏开发系列之一】cocos2dx(v2.x)与(v1.x)的一些常用函数区别讲解!在2.x版CCFileData类被去除等
- 【Cocos2d-X(2.x) 游戏开发系列之二】cocos2dx最新2.0.1版本跨平台整合NDK+Xcode,Xcode编写&编译代码,Android导入打包运行即可!
- 【Cocos2dX(2.x)_Lua开发之三】★重要必看篇★在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
- 【Cocos2d-X(2.x) 游戏开发系列之三】最新版本cocos2d­2.0­x­2.0.2使用新资源加载策略!不再沿用-hd、-ipad、-ipadhd添加后缀方式
- 【Cocos2d-X(1.x 2.x) 修复篇】iOS6 中 libcurl.a 无法通过armv7s编译以及iOS6中无法正常游戏横屏的解决方法
- 【Cocos2d-X(1.x 2.x) 】iOS6与iphone5适相关设置随笔(解决第三方类库无法通过armv7s编译的方法、添加Default-568h@2x.png)