2013年1月8日火曜日

sizeofにやや躓いて,学習。

cocos2dのコードで、
sceneIdx = sceneIdx % ( sizeof(transitions) / sizeof(transitions[0]) );
という部分は 何を意味しているのかな、と思い調べてみる。

http://stackoverflow.com/questions/4786383/sizeof-c-array-with-integers-in-obj-c に、以下のような記述があった。
If what you want is the length of the array, you can do sizeof(arr) / sizeof(arr[0]) which will give you the size of the entire array divided by the size of each element. In this case you will get 8 / 4 == 2, which is what I take it you expect.
sizeofはバイトでのサイズを返す関数なので、
sizeof(transitions)/sizeof(transitions[0])は、配列全体のバイト/配列内の一要素のバイトの様子。

要するに、配列内に、いくつの要素があるか、ということを取得しているのかな。

で sceneIdx % ( sizeof(transitions) / sizeof(transitions[0]) );
はすなわち、
sceneIdx % 配列数
ということだから、
配列数で割ったあまりの数を代入している、と。

そんな感じでしょうか。

:::::::::::::::::::::::::::::::

ということで、コードを見直すと、

sceneIdx++;sceneIdx = sceneIdx % ( sizeof(transitions) / sizeof(transitions[0]) );
は、
sceneIdx++をしていっても、
配列数を超えないで,配列内のindex番号を取得するためのコードだと判明。

なるほど。

で、

sceneIdx++;sceneIdx = sceneIdx % ( sizeof(transitions) / sizeof(transitions[0]) );  
NSString *r = transitions[sceneIdx]; 
Class c = NSClassFromString(r);return c;

は、複数のトランジションを格納したインデックスを取得して、
次々に、シーンを変更するのだと理解。

NSString *rにtransition名を代入し、
NSClassFromStringでクラス名としてrを変換し、
returnする、と。

なるほど。

:::::::::::::::::::::::::::::::

で、定型的に、cocos2dでは、
Class nextAction
Class backAction
Class restartAction
を定義していて、
上記のsizeofを使った配列数の取得をしている、と。

たとえば、

sceneIdx--;int total = ( sizeof(transitions) / sizeof(transitions[0]) );
if( sceneIdx < 0 )
sceneIdx += total;
は、int totalに配列の要素数を取得し、
ブラケット{}なしのif文で、0より小さくなった場合だけ、配列数を足して正の数に戻している、と。

なるほど。

この三つのクラスで、下の矢印と○の部分を実装しているのですね。
これなら、定型的に書いていて、毎回、transitionsの数を変えても、対応できますね。

なるほどでした。

0 件のコメント:

コメントを投稿