關於圖片資源的打包當然是采用TexturePacker了。官方網址:http://www.codeandweb.com/texturepacker
個人覺得是2d裡面最好的資源打包工具,沒有之一。
TexturePacker它是一款把若干資源圖片拼接為一張大圖的工具。TexturePacker可以直接選定一個文件夾,將裡面的小圖片生成一個大圖片,並輸出plist文件的工具。使用該工具,合圖就非常簡單了。TexturePacker自帶有資源加密的功能。
關於如何使用。在此不再贅述。可自行搜索教程。
在此只想說明兩點網上很少提及的:
1.命令行。
2.加密。
一、命令行
TexturePacker
界面的設置完全可以用命令行來執行。這樣的好處就是完成可以批處理圖片資源。前期資源是沒有壓縮和加密的。後期只需要替換壓縮圖片。使用命令行批處理一下。非常非常的方便。
1.命令行的安裝。
默認安裝TexturePacker 之後,命令行是沒有配置到系統環境的。配置方法如下:
單擊單擊標題欄TexturePacker,選擇安裝命令行。即可。
2.TexturePacker 的一些常用參數信息
下面是TexturePacker 的一些常用參數信息。詳細參數可直接在終端輸入TexturePacker
XML/HTML代碼
- You can specify one or more .png or .tps files or directories for processing.
- <folder> Recursively adds all known files in the sprite sheet
- <*.tps> *.tps file created with TexturePackerPro (requires pro license)
- Additional set options override settings in the *.tps file
- <*.swf> Flash requires pro license
- <images> Image formats, supported:
- Output:
- --sheet <filename> Name of the sheet to write, see texture-format for formats available
- --texture-format <id> Sets the format for the textures.
- The format type is automatically derived from the sheet's file name
- if possible.
- --data <filename> Name of the data file to write
- --format <format> Format to write, default is cocos2d
- --force-publish Ignore smart update hash and force re-publishing of the files
- --texturepath <path> Adds the path to the texture file name stored in the data file.
- Use this if your sprite sheets are not stored in another folder than your data files.
- --reduce-border-artifacts Removes dark shadows around sprites
- --extrude <int> Extrudes the sprites by given value of pixels to fix flickering problems in tile maps
- --scale <float> Scales all images before creating the sheet. E.g. use 0.5 for half size
- --scale-mode <mode> Use mode for scaling:
二,圖片加密
接下來講述資源加密的一些技巧, 關於圖片加密其實TexturePacker官方有詳細的指導說明,官方有一篇文檔有完整的介紹。
http://www.codeandweb.com/texturepacker/contentprotection
不過,cocosBuilder作者已經不再維護Builder了。所以教程對應的cocos2d 2.x 有些過時。所以在此重新啰嗦一下.
查看cocos2dx源代碼發現加密的關鍵部分:大致意思就是用密鑰循環異或data字節。
C++代碼
- // encrypt first part completely
- for(; i < len && i < securelen; i++)
- {
- data[i] ^= s_uEncryptionKey[b++];
-
- if(b >= enclen)
- {
- b = 0;
- }
- }
-
- // encrypt second section partially
- for(; i < len; i += distance)
- {
- data[i] ^= s_uEncryptionKey[b++];
-
- if(b >= enclen)
- {
- b = 0;
- }
- }
1.效果預覽:
首先看一下,資源包加密VS未加密預覽的效果:
VS
采用TexturePacker加密之後,資源是無法被查看到的。
Ps:在開發的過程中,可以采用未加密的資源開發,之後再打包發布的時候,采用命令行批處理一遍即可。
2.資源加密步驟:
1.單擊ContentProtection旁邊的Lock圖標。彈出lock窗口:
你需要填寫32位的密鑰(0-9 a-f)
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++代碼
- cocos2dx/support/zip_support/ZipUtils.h
- /** Sets the pvr.ccz encryption key.
- *
- * Example: If the key used to encrypt the pvr.ccz file is
- * 0xaaaaaaaabbbbbbbbccccccccdddddddd you will call this function with
- * the key split into 4 parts as follows
- *
- * ZipUtils::ccSetPvrEncryptionKey(0xaaaaaaaa, 0xbbbbbbbb, 0xcccccccc, 0xdddddddd);
- *
- * Note that using this function makes it easier to reverse engineer and
- * discover the complete key because the key parts are present in one
- * function call.
- *
- * IMPORTANT: Be sure to call ccSetPvrEncryptionKey or
- * ccSetPvrEncryptionKeyPart with all of the key parts *before* loading
- * the spritesheet or decryption will fail and the spritesheet
- * will fail to load.
- *
- * @param keyPart1 the key value part 1.
- * @param keyPart2 the key value part 2.
- * @param keyPart3 the key value part 3.
- * @param keyPart4 the key value part 4.
- */
- static void ccSetPvrEncryptionKey(unsigned int keyPart1, unsigned int keyPart2, unsigned int keyPart3, unsigned int keyPart4);
Ps: 在ZipUtils 中還有其他類似的函數。使用其中一個即可。
調用:
我們在AppDelegate.cpp applicationDidFinishLaunching函數中增加如下代碼:
C++代碼
- ZipUtils::ccSetPvrEncryptionKey(0x12345678,0x87654321,0x12345678,0x87654321);
就可以正常使用資源了。
下面是Lua 使用資源的測試代碼:
C++代碼
- require "Cocos2d"
-
- cclog = function(...)
- print(string.format(...))
- end
-
- -- for CCLuaEngine traceback
-
- function __G__TRACKBACK__(msg)
- cclog("----------------------------------------")
- cclog("LUA ERROR: " .. tostring(msg) .. "\n")
- cclog(debug.traceback())
- cclog("----------------------------------------")
- end
-
- local function createShowSpriteScene()
- cc.SpriteFrameCache:getInstance():addSpriteFrames("files/sprite.plist")
- local showSprite = cc.Sprite:createWithSpriteFrameName("success_1.png")
- showSprite:setPosition(cc.p(200,200))
- return showSprite
- end
-
- local function main()
-
- -- avoid memory leak
- collectgarbage("setpause", 100)
- collectgarbage("setstepmul", 5000)
-
- local scene = cc.Scene:create()
- local layer = createShowSpriteScene()
- scene:addChild(layer)
- cc.Director:getInstance():runWithScene(scene)
- end
-
- xpcall(main, __G__TRACKBACK__)
當我們注釋在AppDelegate.cpp中,添加的代碼後:會報如下錯誤: