ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

マップ上の位置計算

マップ上の位置を計算するため、いつもやっているようにループカウンタの剰余で座標を求めた。
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);
    }
}

いっぺんに計算するのではなく、変数を分けて対処した。