いちばんやさしいゲームの作り方

文系の人でも、数理学がわからない人でもゲームプログラミングをマスターできるブログ

書籍で解説する技術について悩んでおるところでございます。

C++ の作法みたいな本を読むと「定数は const で作ろう」ってのがあるのですが、作っているサンプルコードでは #define を使っています。既存のコードを読むのに役立つかなぁ、という予想なのですが、こういうのをうまい具合に咀嚼してもらうための味付けがわかりません。

自分の座右の銘が温故知新なので、それを無理に押しつけてしまっていないかとか不安になります。メルマガでもそうだったし、良いかな…とは思うのですが。

Comments

yomogi
2009/08/31 08:50:41

ゲームプログラムというと汎用性の高い、かつ他人に読まれにくいプログラムを書くべきですよね
すると…
#defineの方が良いのではないでしょうか?
コンパイラによりますが、文字列を適正な形に直してくれますし
なにより、#ifdef~#endifが使えるのが良いでしょう。
私はこれを多用して、ソースコードのテストで有効活用しています。(定義されていない場合、コンパイルが通らないところをスルーしたり、等々)
また、最近自分のプログラムのセキュリティ確認用として、逆アセンブルツールを使用して、文字列を表示してみたのですが
constで暗号化のKeyを保管した場合、悲惨です(泣
簡単に「これかな?」な感じで取り出せてしまいました。
これに対策するために、char *pass = new char[10];
pass[2] = ‘t’;
pass[7] = ‘e’;
pass[1] = ’s;
pass[5] = ‘t’;
pass[8] = ‘_’;
pass[3] = ‘p’;
pass[0] = ‘a’;
pass[6] = ’s’;
pass[4] = ’s’;
pass[9] = ”;
printf(pass);
delete[] pass;
といった形で、逆アセンブルしたときに、ランダムに並んでいるので読みにくい
そんな隠し方を考えました
ですので…
constにも利用価値はあって、Copyright…等はこの形でしっかりプログラムに刻まなければなりません、なので好みなんですよねぇ…
どうやったら、隠せるか、隠さないほうがよいか
そんなプログラムを#defineとconstから使い分けられるようにする、というのもいいのかもしれません
ちなみに、QtだとQStringという型がすばらしく
QString Path = QString(NAME) + “.” + “QString(EXT)”;
などといった形で、一行で文字をあらわすことが可能です。
なので、ファイルパスなんかはディレクトリ名に分割して隠して、プログラム側で再構築というのもいいかもしれません。
まあ、それをstd::stringでやろうとすると
std::string path = NAME;
path += “.”;
path += EXT;
と、面倒なソースコードになりますが…
でも、両方とも、逆アセンブルすると
NAME
“.”
EXT
でばらばらに表記されてます。
便利です。

Byerkut
2009/09/01 23:54:13

> yomogi さん

本文をはるかに超える密度の濃いメントありがとうございます(^^
毎回楽しみにさせてもらってます。

文字列ってちょっとした工夫で難読化できるんですね。
格納する順番をばらばらにする方法ですと、あえて最適化しない方が良かったりするのでしょうか。

プリプロセッサ自体は活躍の場がなくなりそうにないですよね。
自分だとほとんど縁がないのですが、クロスプラットフォームを実現する際にはソースコードの振り分けが必須です。

あー! string って二項演算できないんですか!
ちょっと使いづらいですね(^^;
使おうと思ってたのに…

Contributions




Trackback URL

メルマガ登録・解除
 
挫折不可能!初級ゲームプログラミング完全マニュアル
RSS track feedいちばんやさしいゲームの作り方 カウンター
ブログSEO対策:track word あわせて読みたい SEO STATUS