手机游戏加密之2d资源加密

2017/9/18 17:45:01 人评论 次浏览 分类:游戏开发

  关于图片资源的打包当然是采用TexturePacker了。官方网址:http://www.codeandweb.com/texturepacker

  个人觉得是2d里面最好的资源打包工具,没有之一。

  TexturePacker它是一款把若干资源图片拼接为一张大图的工具。TexturePacker可以直接选定一个文件夹,将里面的小图片生成一个大图片,并输出plist文件的工具。使用该工具,合图就非常简单了。TexturePacker自带有资源加密的功能。

  关于如何使用。在此不再赘述。可自行搜索教程。

  在此只想说明两点网上很少提及的:

  1.命令行。

  2.加密。

  一、命令行

  TexturePacker

  界面的设置完全可以用命令行来执行。这样的好处就是完成可以批处理图片资源。前期资源是没有压缩和加密的。后期只需要替换压缩图片。使用命令行批处理一下。非常非常的方便。

  1.命令行的安装。

  默认安装TexturePacker 之后,命令行是没有配置到系统环境的。配置方法如下:

  单击单击标题栏TexturePacker,选择安装命令行。即可。

  2.TexturePacker 的一些常用参数信息

  下面是TexturePacker 的一些常用参数信息。详细参数可直接在终端输入TexturePacker

XML/HTML代码
  1. You can specify one or more .png or .tps files or directories for processing.    
  2.    <folder>                   Recursively adds all known files in the sprite sheet    
  3.    <*.tps>                    *.tps file created with TexturePackerPro (requires pro license)    
  4.                               Additional set options override settings in the *.tps file    
  5.    <*.swf>                    Flash requires pro license    
  6.    <images>                   Image formats, supported:     
  7.  Output:    
  8.   --sheet <filename>          Name of the sheet to write, see texture-format for formats available    
  9.   --texture-format <id>       Sets the format for the textures.    
  10.                               The format type is automatically derived from the sheet's file name    
  11.                               if possible.    
  12.   --data <filename>           Name of the data file to write    
  13.   --format <format>           Format to write, default is cocos2d    
  14.  --force-publish             Ignore smart update hash and force re-publishing of the files    
  15.  --texturepath <path>        Adds the path to the texture file name stored in the data file.    
  16.                               Use this if your sprite sheets are not stored in another folder than your data files.    
  17.   --reduce-border-artifacts   Removes dark shadows around sprites    
  18.   --extrude <int>             Extrudes the sprites by given value of pixels to fix flickering problems in tile maps    
  19.   --scale <float>             Scales all images before creating the sheet. E.g. use 0.5 for half size    
  20.   --scale-mode <mode>         Use mode for scaling:    

  二,图片加密

  接下来讲述资源加密的一些技巧, 关于图片加密其实TexturePacker官方有详细的指导说明,官方有一篇文档有完整的介绍。

  http://www.codeandweb.com/texturepacker/contentprotection

  不过,cocosBuilder作者已经不再维护Builder了。所以教程对应的cocos2d 2.x 有些过时。所以在此重新啰嗦一下.

  查看cocos2dx源代码发现加密的关键部分:大致意思就是用密钥循环异或data字节。

C++代码
  1. // encrypt first part completely    
  2. for(; i < len && i < securelen; i++)    
  3. {    
  4.     data[i] ^= s_uEncryptionKey[b++];    
  5.         
  6.     if(b >= enclen)    
  7.     {    
  8.         b = 0;    
  9.     }    
  10. }    
  11.     
  12. // encrypt second section partially    
  13. for(; i < len; i += distance)    
  14. {    
  15.     data[i] ^= s_uEncryptionKey[b++];    
  16.         
  17.     if(b >= enclen)    
  18.     {    
  19.         b = 0;    
  20.     }    
  21. }

  1.效果预览:

  首先看一下,资源包加密VS未加密预览的效果:

手机游戏加密之2d资源加密

VS

手机游戏加密之2d资源加密

  采用TexturePacker加密之后,资源是无法被查看到的。

  Ps:在开发的过程中,可以采用未加密的资源开发,之后再打包发布的时候,采用命令行批处理一遍即可。

  2.资源加密步骤:

  1.单击ContentProtection旁边的Lock图标。弹出lock窗口:

  你需要填写32位的密钥(0-9 a-f)

手机游戏加密之2d资源加密

  Create new key 是系统随机密钥

  Clear/Disable 启用/关闭图片加密功能

  Save as global key 将该密钥作为全局的密钥,以后对其他的图片加密直接使用global key 即可。

  Use global key 使用保存的全局密钥。

  2.Save

  3.Publish

  接下来的步骤和官方的介绍不同:主要是3.0已经集成了图片加密的功能。

  首先需要了解:

  如果你的密钥是aaaaaaaabbbbbbbbccccccccdddddddd,你必须将它们分成4部分每部分8位:

  0xaaaaaaaa

  0xbbbbbbbb

  0xcccccccc

  0xdddddddd

  在TexturePacker官网介绍的方法是下载其提供的ZipUtils 文件替换cocos2dx 。在最新版的cocos2dx zipUtils 里面已经集成了对TexturePacker 解密的处理,所以无需按照其步骤处理。

  Ps:下载其ZipUtils 复制替换后,cocos2dx lib 会出错。

  我们直接使用coco2d-x-3.0自带的可以了。下面是对其解密的源代码:

C++代码
  1. cocos2dx/support/zip_support/ZipUtils.h    
  2.  /** Sets the pvr.ccz encryption key.  
  3.         *  
  4.         * Example: If the key used to encrypt the pvr.ccz file is  
  5.         * 0xaaaaaaaabbbbbbbbccccccccdddddddd you will call this function with  
  6.         * the key split into 4 parts as follows  
  7.         *  
  8.         * ZipUtils::ccSetPvrEncryptionKey(0xaaaaaaaa, 0xbbbbbbbb, 0xcccccccc, 0xdddddddd);  
  9.         *  
  10.         * Note that using this function makes it easier to reverse engineer and  
  11.         * discover the complete key because the key parts are present in one  
  12.         * function call.  
  13.         *  
  14.         * IMPORTANT: Be sure to call ccSetPvrEncryptionKey or  
  15.         * ccSetPvrEncryptionKeyPart with all of the key parts *before* loading  
  16.         * the spritesheet or decryption will fail and the spritesheet  
  17.         * will fail to load.  
  18.         *  
  19.         * @param keyPart1 the key value part 1.  
  20.         * @param keyPart2 the key value part 2.  
  21.         * @param keyPart3 the key value part 3.  
  22.         * @param keyPart4 the key value part 4.  
  23.         */    
  24.         static void ccSetPvrEncryptionKey(unsigned int keyPart1, unsigned int keyPart2, unsigned int keyPart3, unsigned int keyPart4);   

  Ps: 在ZipUtils 中还有其他类似的函数。使用其中一个即可。

  调用:

  我们在AppDelegate.cpp applicationDidFinishLaunching函数中增加如下代码:

C++代码
  1. ZipUtils::ccSetPvrEncryptionKey(0x12345678,0x87654321,0x12345678,0x87654321);  

  就可以正常使用资源了。

  下面是Lua 使用资源的测试代码:

C++代码
  1. require "Cocos2d"    
  2.     
  3. cclog = function(...)    
  4.     print(string.format(...))    
  5. end    
  6.     
  7. -- for CCLuaEngine traceback    
  8.     
  9. function __G__TRACKBACK__(msg)    
  10.     cclog("----------------------------------------")    
  11.     cclog("LUA ERROR: " .. tostring(msg) .. "\n")    
  12.     cclog(debug.traceback())    
  13.     cclog("----------------------------------------")    
  14. end    
  15.     
  16. local function createShowSpriteScene()    
  17.     cc.SpriteFrameCache:getInstance():addSpriteFrames("files/sprite.plist")    
  18.     local showSprite = cc.Sprite:createWithSpriteFrameName("success_1.png")    
  19.        showSprite:setPosition(cc.p(200,200))    
  20.     return showSprite    
  21. end    
  22.     
  23. local function main()    
  24.     
  25.     -- avoid memory leak    
  26.     collectgarbage("setpause", 100)    
  27.     collectgarbage("setstepmul", 5000)    
  28.        
  29.     local scene = cc.Scene:create()    
  30.     local layer = createShowSpriteScene()    
  31.     scene:addChild(layer)    
  32.     cc.Director:getInstance():runWithScene(scene)    
  33. end    
  34.     
  35. xpcall(main, __G__TRACKBACK__)    

  当我们注释在AppDelegate.cpp中,添加的代码后:会报如下错误:

手机游戏加密之2d资源加密

相关教程

  • android游戏引擎andengine学习系列二简单的例子

    如何高效的学习,这才是我们最值得去学习的。 首先导入架包,下载:http://download.csdn.net/detail/duancanmeng/4060082 lib文件夹中像我们写Android程序entends Activity一样,我们一开始也要extends BaseGameActivity,而且实现四个必须被重载函数:[java] view plain co…

    2016/10/9 14:05:05
  • AndEngine游戏开发系列教程

    链接地址:http://www.apkbus.com/android-130403-1-1.html一、简介AndEngine基于libGDX框架开发,使用OpenGL ES进行图形绘制,底层使用C++编写,通过JNI调用来实现,因此比较高效,功能强大。同时集成了Box2D物理引擎,因此能实现一些较为复杂的物理效果。在Rokon(另一个Android …

    2016/10/9 13:59:41
  • 移植cocos2dAndroid包框架设计

    随着android平台的推广和android手机的大量推出,有人预言android将是一个嵌入式的统一平台。果真如此吗?Apple,Microsoft, nokia不会坐视不管的,在想想unix各种混乱的版本,总让人忧心忡忡。不过有google这位大神做东,至少在短期内,android会很稳定,市场会有一席之地。目…

    2016/10/7 12:53:02

共有访客发表了评论 网友评论

验证码: 看不清楚?