超Flash Lite入門 ActionScript編 その2 マップデータ
Flash Liteでマップデータを持つ場合、以下のように文字列型で持つ場合が多いです。
Flash Lite 1.1 でゲームのマップを表示する。
これを踏まえ、移動可能を0、移動不可能を1とするような7×7のマップデータの場合を考えてみます。
マップ番号は以下の図のようにx方向に数え、yが+1されるごとに7増える形で割り振ることとします。
マップ番号表
\ 1 2 3 4 5 6 7 → x ┏━┳━┳━┳━┳━┳━┳━┓ 1┃1┃2┃3┃4┃5┃6┃7┃ ┣━╋━╋━╋━╋━╋━╋━┫ 2┃8┃9┃10┃11┃12┃13┃14┃ ┣━╋━╋━╋━╋━╋━╋━┫ 3┃15┃16┃17┃18┃19┃20┃21┃ ┣━╋━╋━╋━╋━╋━╋━┫ 4┃22┃23┃24┃25┃26┃27┃28┃ ┣━╋━╋━╋━╋━╋━╋━┫ 5┃29┃30┃31┃32┃33┃34┃35┃ ┣━╋━╋━╋━╋━╋━╋━┫ 6┃36┃37┃38┃39┃40┃41┃42┃ ┣━╋━╋━╋━╋━╋━╋━┫ 7┃43┃44┃45┃46┃47┃48┃49┃ ┗━┻━┻━┻━┻━┻━┻━┛ ↓ y
これを、単純に文字列で表現してしまうと
x=1; y=1; map = "0000111" add "0100100" add "0010110" add "0000000" add "1101100" add "1000011" add "1111111"; // 移動判定 if(substring(map,x+(y-1)*7,1)){ trace("移動不可能"); }else{ trace("移動可能"); }
これだと49バイトにもなってしまいます。そこで0と1しかないのでこれをbitで表現し、bit演算で1文字に変換して容量を小さくしてみましょう。
なぜ8×8ではなく7×7なのかというと、前回のエントリーのとおり0〜127(1〜128)までの7bitなので、7の倍数の方が説明するのに都合がよいからです。*1もちろん任意のサイズのマップで同様のデータ構造にて格納可能です。
マップ番号bNを以下のようにマッピングすることで
|8 4 2 1 8 4 2 1|8 4 2 1 8 4 2 1|8 4 2 1 8 4 2 1|8 4 2 1 8 4 2 1|bit |-----------------------|-----------------------|-----------------------|-----------------------|---- |− 7 6 5 4 3 2 1|− 14 13 12 11 10 9 8|− 21 20 19 18 17 16 15|− 28 27 26 25 24 23 22|マップ番号 |8 4 2 1 8 4 2 1|8 4 2 1 8 4 2 1|8 4 2 1 8 4 2 1|8 4 2 1 8 4 2 1bit |-----------------------|-----------------------|-----------------------|-----------------------|---- |− 35 34 33 32 31 30 29|− 42 41 40 39 38 37 36|− 49 48 47 46 45 44 43|− 文字列終端 (0x00) −|マップ番号
7バイトでデータを格納できます。
x=1; y=1; bmap= "\x70" // "000 0111" → 反転 "111 0000" add "\x12" // "010 0100" → 反転 "001 0010" add "\x34" // "001 0110" → 反転 "011 0100" add "\x80" // "000 0000" 0x00 → 0x80 add "\x1b" // "110 1100" → 反転 "001 1011" add "\x61" // "100 0011" → 反転 "110 0001" add "\x7F"; // "111 1111" // 移動判定 b = ord(substring(bmap,y,1)); for(j=1;j<x;j++){ b=int(b/2); } if(b%2){ trace("移動不可能"); }else{ trace("移動可能"); }
Flash Lite 1.1で使われているAction Script 1.1ではビット演算が使えないのですが、ビットの判定は上記のように割と簡単にできます。*2
基本的にサーバーサイドでデータを作成する場合は、ビット演算でANDをして0x00の場合0x80にするだけです。