Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android游戲 >> Android游戲開發 >> 手機游戲加密之2d資源加密

手機游戲加密之2d資源加密

編輯:Android游戲開發

  關於圖片資源的打包當然是采用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資源加密

  1. 上一頁:
  2. No
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved