超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にするだけです。

やり残しメモ

  • phpでビット演算する場合のサンプル
  • mysqlでビット演算する場合のサンプル
  • 『¥xXX』の説明、Macの場合『\』
  • 図を画像で作る
  • 通常のマップ配列の場合

*1:一般的には0〜255までの8bitが使用できる為、通常は8×8のマップが一般的かと思います。

*2:逆にビット変換は大変ですが....。