ビットシフトは、それを処理する最もメモリ最適化された方法です。パフォーマンスに関しては、フレームごとに多くの問い合わせをポーリングする必要がない限り、それほど大きな問題にはなりません。AS の問題は、ブール値が 4 ビットであることです:(
私が見るように、さまざまなケースでそれを処理できます。
1) ヒット検出用に低解像度のテクスチャを作成します。通常は 4 倍に縮小しても問題ありません (256x256 --> 64x64)。
2)そのデータをある種のストレージに保存する何らかの手法を使用します(boolが最も簡単ですが、それが大きすぎる場合は、別の解決策を見つける必要があります)
3) 整数解を実行します(これまでビットシフトを使用したことがなかったので、これは楽しい挑戦になると思いました。その結果は次のとおりです)。
そして、そのソリューションは、ブール値に使用されるソリューションよりもはるかに小さく、理解するのもはるかに困難です:/
public class Foobar extends MovieClip {
const MAX_X:int = 32;
const MAX_Y:int = 16;
var _itemPixels:Vector.<int> = new Vector.<int>(Math.ceil(MAX_X * MAX_Y / 32));
public function Foobar() {
var pre:Number = System.totalMemory;
init();
trace("size=" + _itemPixels.length);
for (var i = 0; i < MAX_Y; ++i) {
for (var j = 0; j < MAX_X; ++j) {
trace("item=" + (i*MAX_X+j) + "=" + isWalkablePixel(j, i));
}
}
trace("memory preInit=" + pre);
trace("memory postInit=" + System.totalMemory);
}
public function init() {
var MAX_SIZE:int = MAX_X * MAX_Y;
var id:int = 0;
var val:int = 0;
var b:Number = 0;
for(var y=0; y < MAX_Y; ++y) {
for (var x = 0; x < MAX_X; ++x) {
b = Math.round(Math.random()); //lookup the pixel from some kind of texture or however you expose the items
if (b == 1) {
id = Math.floor((y * MAX_X + x) / 32);
val = _itemPixels[id];
var it:uint = (y * MAX_X + x) % 32;
b = b << it;
val |= b;
_itemPixels[id] = val;
}
}
}
}
public function isWalkablePixel(x, y):Boolean {
var val:int = _itemPixels[Math.floor((y * MAX_X + x) / 32)];
var it:uint = 1 << (y * MAX_X + x) % 32;
return (val & it) != 0;
}
}