日記

cocos2d-xでリソースの暗号化をしてみる。

こんにちは。三点リーダが大好き過ぎて多様しちゃうマン、korcsだよ!
本気出すとか言いつつ、また更新滞ってたけどいつものことですね……。
何だかんだで東京へ引っ越してきて、色々やってました。(という言い訳)
引っ越しついでに同人誌の整理してたら、ダブって買ってるのが予想以上にたくさんあってびっくりしました……。
そんなこんなのどうでも良い日常。


ということで、今回は

「cocos2d-x v3.0でリソースの暗号化」

です。
ぶっちゃけ、暗号化なんて自前でやったことなかったので、なんか変なとこあったらメールフォームとかからツッコんでください。(予防線)

暗号化しよう – ゲームプログラミングWiki
暗号化については↑を参考にさせてもらいました。
エンコード用のexeは上記のものをほぼそのまま使わせてもらってます。
そして、cocos2d-xでデコードするにはFileUtilsを修正します。
ファイルの場所は「プロジェクトの場所\cocos2d\cocos\2d\platform」です。
注意が必要なのが、これ、プラットフォーム毎に継承して違うクラスを使ってるので、対応プラットフォーム全部の修正する必要があります。
Windowsの場合は「プロジェクトの場所\cocos2d\cocos\2d\platform\win32\CCFileUtilsWin32.cpp」です。
AndroidとLinuxもそれぞれのフォルダにあります。MacとiOSは「Apple」フォルダにあります。
ここでは、とりあえず、継承元のCCFileUtils.cppで解説します。

static Data getData(const std::string& filename, bool forString)
{
    CCASSERT(!filename.empty(), "Invalid filename!");
    
    Data ret;
    unsigned char* buffer = nullptr;
    ssize_t size = 0;
    const char* mode = nullptr;
    if (forString)
        mode = "rt";
    else
        mode = "rb";
    
    do
    {
        // Read the file from hardware
        std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filename);
        FILE *fp = fopen(fullPath.c_str(), mode);
        CC_BREAK_IF(!fp);
        fseek(fp,0,SEEK_END);
        size = ftell(fp);
        fseek(fp,0,SEEK_SET);
        
        if (forString)
        {
            buffer = (unsigned char*)malloc(sizeof(unsigned char) * (size + 1));
            buffer[size] = '\0';
        }
        else
        {
            buffer = (unsigned char*)malloc(sizeof(unsigned char) * size);
        }
        
        size = fread(buffer, sizeof(unsigned char), size, fp);
        fclose(fp);
    } while (0);
    
    if (nullptr == buffer || 0 == size)
    {
        std::string msg = "Get data from file(";
        msg.append(filename).append(") failed!");
        CCLOG("%s", msg.c_str());
    }
    else
    {
		//-----------------------------------------------------------------------------
		// ファイル暗号化対応
		//-----------------------------------------------------------------------------
		if (filename.find(".dat") != string::npos){
			for(int i = 0; i < size; i++){
				buffer[i] = ~buffer[i];
			}
		}
		//-----------------------------------------------------------------------------
        ret.fastSet(buffer, size);
    }
    
    return ret;
}

getData()内の
ret.fastSet(buffer, size); の直前にデコードの処理を追加します。
私の場合は暗号化したファイルの拡張子を.datに統一して、

if (filename.find(".dat") != string::npos)

で暗号化したファイルか判別してます。
んでもって、データのビットを全部反転しちゃってます。
こんだけで暗号化できます。ね、簡単でしょ?
ちなみに、Androidの場合は変数名がちょっと違ってて、「buffer」->「data」になるので注意。
自分は今のところ、WindowsとAndroidでしか確認してませんが、たぶん他も同じで大丈夫(だといいな)

ただビットを反転させるだけだと、簡単に解読できちゃうんで、実際は文字列のkeyを元に暗号化して使ってます。DXライブラリのDXArchiveはソースが同梱されてるので、それ参考にさせてもらってます。
DXライブラリ置き場 ダウンロードページで、VisualC++用に同梱されてます。

最後に

@echo off
for /d %%d in (*) do (
	for %%f in (%%d\*.png) do ResourceEncoder.exe %%f
)

こんな感じでリソースをエンコードするバッチを作っとくと便利です。

あと、TexturePackerとか使ってる場合は、画像の拡張子変更したら.plist内のファイル名も変更しないといけないので注意。
この辺もバッチで自動化してます。

はい、そんな感じで次回はたぶんマウスの座標取得とかその辺の話。

2014/02/20


今月から本気出す 
& cocos2d-x v3.0-betaでWindowsアプリを作ってみる

お久しぶりです。korcsです。
長い間、放置しちゃってたこのサイトですが、そろそろ本気出そうと思います。
来年から本気出すとか言いつつ一ヶ月空いたけど、それはそれ。

個人的な事情で近々、上京することになりました。
これで、コミケとか行くのがすごく楽になります。
関東である他のイベントにも行きやすくなるよ。やったね!

CPルーミアに関しては、例大祭での完成を目指して制作中です。
延期しまくっててごめんなさい……。


以上、近況報告とか謝罪とか終わり。


ここからcocos2d-xの話。
このブログでまさかの技術的なお話!
興味ない人は適当に読み飛ばしといてください(言われずとも、かもしれませんが)

最近、スマホアプリ界隈で流行りのcocos2d-xですが、Android/iOsに限らず、Windows/Mac/Linux向けのゲームも作れちゃうのです。
でも、ぐぐってもPC向けで作ってる人ってあんまりいないみたいです。
私は今まで、お仕事でcocos2d-x 2.xを使ってスマホアプリ作ってたんですけど、かなり使いやすかったんで、同人の方でも使おうかなぁと、思い試してみることにしました。

で、今年になってv3.0betaが出たんで、せっかくだから新しいのでやってみます。2.xからの変更点がかなりあるのですが、windowsの部分でも結構変わってて最初見た時、「あれ、全然違う!」と面食らいましたが、結構便利になってるみたいです。マウスとかキーボードのコールバックも指定できるようになっているので、その辺を改造する必要はあんまりなさそうです。(2.xの時はなかったよね?)
あと、配布時に必要なdllも以前はたくさんあってごちゃごちゃしちゃってましたが、静的リンクに変更されたっぽくて減ってました。
で、個人的にかなり重要なことなんですが、リソースの暗号化は自前でやる必要があるっぽいです。TexturePacker使えば画像の暗号化はできるっぽいですが、これってiOS/Macだけですよね? (Cocos2d-xでのコンテンツ暗号化(お手軽)
FileUtilsのデータ読み込み部分を改造する必要があるんですが、これのやり方はまたの機会にでもご紹介したいと思います。
とりあえず、今回はプロジェクトを作成する部分の解説をざっとして終わりたいと思います。

1、プロジェクトの作成

http://www.cocos2d-x.org/downloadここでcocos2d-x v3.0betaをダウンロードします。(ここで気づいたんですけど、既にbeta2が出てたんですね。windwoのフルスクリーン化とか公式で対応したみたいです。やったね!)
んで、解凍したら、
cocos2d-x 3.0beta\tools\project-creator\にあるcreate_project.pyを実行する必要があります。Pythonです。自分はWindowsでPython使う環境構築するの面倒だったのでMacでちゃちゃっとやりました。2.xと違って、GUIになってますね。これで各プラットフォーム向けのプロジェクトをまとめて作成できます。
この辺は、スマホアプリでも同じ作業なので、他にもっとわかりやすく解説しているところありますので、ざっくり済ませました。

2、実行

作られたフォルダの中に、”proj.win32″というフォルダがあると思います。これがWindowsのプロジェクトがあるフォルダです。名前のまんまですね。この中に”プロジェクト名.sln”があるので、これをダブルクリックすればOKです。Visual Studioが立ち上がります。そもそもVisual Studio入れてないっていう人はhttp://www.microsoft.com/ja-jp/dev/express/default.aspxここでダウンロードできます。expressは無料ですよ。学生の方にはDreamSparkとかいうのもあるんで、オススメ。

立ち上がったらビルドして実行。

ハイ、終わり。この程度のだれでもやるような内容は、調べれば大量に出てくるので、次回はもう少し有用なこと書こうと思います……。

2014/02/01


C84

……すごく遅くなりました。
あと、ごめんなさい。やっぱりダメだったよ!

CPルーミアは今回も体験版です。
内容も例大祭の時と変わってません……。
ちょっとだけ、言い訳というか弁明させてもらうと、今まで作っていたCPルーミアのソースがあまりにも汚くて管理しにくい状態だったので新しく作り直してたら全然間に合いませんでした。はい。

ということで今回のお品書



コミックマーケット84 3日目 東 U-34a
川獺アルカディア

新刊 なし

既刊 CPルーミア体験版  100円
宵闇伝説 ~おりじなるさうんどとらっく~  500円


2013/08/09


例大祭10

し-32a

ゲーム
CPルーミア体験版 100円
サントラ
宵闇伝説~おりじなるさうんどとらっく~ 500円

告知が遅れてすみません。
例大祭には完成させるぞーみたいなことを言っていたような気がしますが、今回も体験版です……。
内容は前回とあんまり変わっていません。前回購入してくださった方は、これを買わなくてもオンラインアップデートによって自動的に最新版になります。(現時点ですでにアップデート可能だったりします)

夏までには意地でも完成させるんで今回は大目に見てください。

あと、7月7日のルーミアオンリーには出るかどうか悩み中……。
久々に漫画でも描こうかなぁ……?

2013/05/24


冬コミ告知!

遅くなってすみません!
ようやく体験版ができたので告知します!(まだこれからCD焼いたりするのですが……)

 

コミックマーケット83
2日目 東 キ-57b

サントラ
新作 宵闇伝説~おりじなるさうんどとらっく~ 500円

ゲーム
新作 CPルーミア体験版 100円
既作 宵闇伝説 500円

です!

サントラ
サントラは全24トラックでCDの容量いっぱいいっぱいの大ボリュームです! ゲーム中で使われた曲だけでなく、諸事情で未使用だった曲やEDのピアノアレンジなどを収録してます! どれもいい曲ばかりなので是非是非!(私はジャケットとか描いただけですけど)

 


続いてお待ちかねの新作「CPルーミア」の体験版です。ステージ数は少ないですし、ギミックなんかもまだ全然作れてないのですが、せっかくの体験版なので専用のステージを1つ用意してみました。無駄に難易度高めです。(基本的には難易度低めです)
それと、今回は自動アップデート機能を付けてみました。(設定でオフにもできます)
これでも難易度低いとか言われたらもっと難しいのを用意したりするかもしれません。

あと宵闇伝説も手元にある分だけ持っていきます。これは夏コミで配布したバージョンなのでプレイする前にパッチを当ててください。

それと今回は合同誌にも寄稿させてもらってます。久々の漫画です。2Pですけど。

ルーミア合同誌です! 参加者いっぱい! 超豪華!
頒布場所は
2日目 東 Y-15a 「のらまに」
です!

それでは会場でお待ちしてます。

2012/12/27


≪前  |  次≫