package com.youbt.game.tbg.vo
{
import com.youbt.utils.Array2DByteArray;
import flash.utils.ByteArray;
/**
*
* @author Administrator
*
*
*
* 地图逻辑设置 : JCSXXXXX
* J C S XXXXX
* 0 0 0 00001
* 可跳 可穿 非安全 可走
*
* 地图显示设置: TTTTAAAA
* TTTT AAAA
* 0000 1010
* 地形0 ALPHA10
*/
public class Map2DSetting
{
public var ba:ByteArray
public var w:int
public var h:int
public function Map2DSetting(source:Array2DByteArray, del:Boolean=true)
{
if (source)
{
ba=source.ba;
if (del)
{
source.ba=null;
}
w=source.w
h=source.h
}
}
/**
*
* @param x
* @param y
* @return
* 0 不可走
* 1 可走
*/
public function getWalk(x:int, y:int):int
{
var d:int=y * w + x;
if (d < 0)
{
return 0;
}
else if (d > ba.length)
{
return 0;
}
else
{
return ba[y * w + x] & 1;
}
}
/**
*
* @param x
* @param y
* @return
* 0 非安全
* 1 安全
* JCSXXXXX
*
*/
public function getSafety(x:int, y:int):int
{
/* var vl:int = ba[y * w + x]
vl = (vl >> 5) & 1*/
return ba[y * w + x] >> 5 & 1
}
/**
*
* @param x
* @param y
* @return
* 0 可穿
* 1 不可穿
* JCSXXXXX
*/
public function getCross(x:int, y:int):int
{
return ba[y * w + x] >> 6 & 1
}
/**
*
* @param x
* @param y
* @return
* JCSX???X
*/
public function getActivity(x:int, y:int):int
{
return (ba[y * w + x] & 15) >> 1
}
/**
*
* @param x
* @param y
* @return
* 0 可跳
* 1 不可跳
* JCSXXXXX
*/
public function getJump(x:int, y:int):int
{
return ba[y * w + x] >> 7
}
/**
* 获取地形
* @param x
* @param y
* @return
* TTTTAAAA
*/
public function getTerrianType(x:int, y:int):int
{
return ba[y * w + x] >> 4
}
/**
*
* @param x
* @param y
* @return
* ALPHA值0-10
* TTTTAAAA
*/
public function getAlpha(x:int, y:int):int
{
return ba[y * w + x] & 15
}
/**
*
* @param x
* @param y
* @param value
*
* XXXXXXX? ?代表权值 范围0-1
* 11111110 254
* 0 不可走
* >1 可走
*/
public function setWalk(x:int, y:int, value:int):void
{
if (value > 1 || value < 0)
{
throw new RangeError()
}
var old:int=ba[y * w + x]
var n:int=old & 254 | value
ba[y * w + x]=n
}
/**
*
* @param x
* @param y
* @return
* XX?XXXXX
* 11011111 223
* 0 非安全
* 1 安全
*
*/
public function setSafety(x:int, y:int, value:int):void
{
if (value == 0 || value == 1)
{
var old:int=ba[y * w + x]
var n:int=(old & 223) | (value << 5)
ba[y * w + x]=n
}
else
{
throw new RangeError()
}
}
/**
*
* @param x
* @param y
* @param value
* X?XXXXXX
* 10111111 191
* 0 为可穿
* 1 为不可穿
*/
public function setCross(x:int, y:int, value:int):void
{
if (value == 0 || value == 1)
{
var old:int=ba[y * w + x]
var n:int=(old & 191) | (value << 6)
ba[y * w + x]=n
}
else
{
throw new RangeError()
}
}
/**
* 设置活动区域,支持 3位 0-7
* @param x
* @param y
* @param value
* XXXX???X
* 11110001 241
*
*
*/
public function setActivity(x:int, y:int, value:int):void
{
if (value > 7 || value < 0)
{
throw new RangeError()
}
else
{
var old:int=ba[y * w + x];
var endV:int=old
var n:int=(old & 241) | (value << 1)
ba[y * w + x]=n
}
}
/**
*
* @param x
* @param y
* @param value
* 0 可跳
* 1 不可跳
* ?XXXXXXX
* 01111111 127
*/
public function setJump(x:int, y:int, value:int):void
{
if (value == 0 || value == 1)
{
var old:int=ba[y * w + x]
var n:int=(value << 7) | (old & 127)
ba[y * w + x]=n
}
else
{
throw new RangeError()
}
}
/**
*
* @param x
* @param y
* @param value
* 地形设置 XXXX1111 支持四位,0-15
*
*/
public function setTerrian(x:int, y:int, value:int):void
{
if (value > 15 || value < 0)
{
throw new RangeError()
}
var old:int=ba[y * w + x]
ba[y * w + x]=(value << 4) | (old & 15)
}
/**
*
* @param x
* @param y
* @param value
* 透明度设置 1111XXXX ,0-10
*/
public function setAlpha(x:int, y:int, value:int):void
{
if (value > 15 || value < 0)
{
throw new RangeError()
}
var old:int=ba[y * w + x]
ba[y * w + x]=old & 240 | value
}
/* public function print(sx:int=0, sy:int=0, sw:int=0, sh:int=0):void
{
if (sw == 0)
{
sw=w
}
if (sh == 0)
{
sh=h
}
var str:String
for (var i:int=sy; i < sh; i++)
{
str=""
for (var j:int=sx; j < sw; j++)
{
str+=getInt(j, i) + ","
}
trace(str.slice(0, str.length - 1))
}
trace("/////////////////")
}
public function getInt(x:int, y:int):int
{
return ba[y * w + x] // 安全,性能提示50%
}*/
}
}