マップ上の位置を計算するため、いつもやっているようにループカウンタの剰余で座標を求めた。
C++で書いたソースがこちら。
int main() { const int MAPSIZE = 5; const int BOXSIZE = 30; for(int i=0; i<MAPSIZE*MAPSIZE; i++) { int mapx = (i%MAPSIZE) * BOXSIZE; int mapy = (i%MAPSIZE) * BOXSIZE; cout << mapx << " " << mapy << endl; } }
ところが、ActionScriptで同じように書いたら、位置が期待したとおりにならず、おかしくなってしまった。コードはこちら。
public function map() { const MAPSIZE:int = 5; const BOXSIZE:int = 30; for(var i:int=0; i<MAPSIZE*MAPSIZE; i++) { var mapx:int = (i%MAPSIZE) * BOXSIZE; var mapy:int = (i/MAPSIZE) * BOXSIZE; trace(mapx, mapy); } }
原因は数値計算の型変換。C++のコードの場合、剰余の部分でint型になり、端数は切り捨てられる。ところがActionScriptの場合はすべての計算が終わってからint型の変数に入れられる。
これになかなか気が付けなかった。自分がまだActionScriptに慣れていない証拠。
そこで修正して、期待した通りに動くように書いたコードは次の通り。
public function map() { const MAPSIZE:int = 5; const BOXSIZE:int = 30; for(var i:int=0; i<MAPSIZE*MAPSIZE; i++) { var x:int = (i%MAPSIZE); var y:int = (i/MAPSIZE); var mapx:int = x * BOXSIZE; var mapy:int = y * BOXSIZE; trace(mapx, mapy); } }
いっぺんに計算するのではなく、変数を分けて対処した。