[url]http://bbs.9ria.com/viewthread.php?tid=71405&extra=page%3D1%26amp;orderby%3Ddateline%26amp;filter%3D86400[/url]
首先感谢两位前辈在研究完之后放出原代码。
让我们这些后来者能够循着前人的脚步快速进步。
最终结论:
浪子的 我不太理解........... 貌似是在两套坐标系中转来转去............我晕!太高深了!
小超的那个,经过一番查证得出个结论:
TMD 少一行代码 害死人啊!
下面贴出 Staggered 坐标转换正确代码
这里还有一个
http://bbs.9ria.com/thread-39884-1-1.html
再说一下我的做法,就是切成矩形栅格,然偶看点落在哪个矩形里,再看点落在矩形中的哪个三角形中,最后根据三角形类型(是菱形的哪部分),以及当前矩形的行列值,就可以算出来了
看了半天不太明白,你想问的具体问题是什么?
在我的算法中45度坐标转换中有如下几个方法
1、屏幕坐标转stage方式二维数组坐标
已知某屏幕坐标求stage 方式二维数组的下标
2、屏幕坐标转iso方式 二维数组坐标
已知某屏幕坐标求iso 方式二维数组的下标(iso数组二维下标有负数)
3、屏幕坐标转iso坐标
已知某屏幕坐标求iso坐标(iso坐标值有负数)
4、stage二维数组坐标转iso二维数组坐标
已知stage数组中某个下标求对应的iso数组中的坐标
5、45度数组坐标转90度数组坐标
同上,反转
注意事项:
1、整个算法中屏幕坐标系和iso坐标系的原点重合,位置在左上角0,0点。
2、Tile的坐标原点在小菱形的左顶点。
谢谢浪子的回答!
不过我还是不明白!
最不明白的是。我通过一个排列方式排列!
比如:
stage.x = logic.x * TileWidth + ( logic.y & 1) * ( TileWidth / 2 );
stage.y = logic.y * TileHeigth / 2;
logic表示 数组索引如(0,0);
那么反过来我点击舞台时 把舞台坐标转换成二维数组索引不就好了!
我的问题是 转过来 老有错。。。。。。
不明白你为什么 还有个iso数组 用来做啥的?
首先感谢两位前辈在研究完之后放出原代码。
让我们这些后来者能够循着前人的脚步快速进步。
最终结论:
浪子的 我不太理解........... 貌似是在两套坐标系中转来转去............我晕!太高深了!
小超的那个,经过一番查证得出个结论:
TMD 少一行代码 害死人啊!
下面贴出 Staggered 坐标转换正确代码
/**
* 根据屏幕象素坐标取得网格的坐标
* */
public static function StageToLogic(px:int, py:int):Point
{
var xtile:int = 0; //网格的x坐标
var ytile:int = 0; //网格的y坐标
var cx:int, cy:int, rx:int, ry:int;
cx = int(px / TileWidth) * TileWidth + TileWidth/2; //计算出当前X所在的以tileWidth为宽的矩形的中心的X坐标
cy = int(py / TileHeight) * TileHeight + TileHeight/2;//计算出当前Y所在的以tileHeight为高的矩形的中心的Y坐标
rx = (px - cx) * TileHeight/2;
ry = (py - cy) * TileWidth/2;
if (Math.abs(rx)+Math.abs(ry) <= TileWidth * TileHeight/4)
{
//xtile = int(pixelPoint.x / tileWidth) * 2;
xtile = int(px / TileWidth);
ytile = int(py / TileHeight) * 2;
}
else
{
px = px - TileWidth/2;
//xtile = int(pixelPoint.x / tileWidth) * 2 + 1;
xtile = int(px / TileWidth) + 1;
py = py - TileHeight/2;
ytile = int(py / TileHeight) * 2 + 1;
}
return new Point(xtile - (ytile&1), ytile);
}
/**
* 根据网格坐标取得象素坐标
* */
public static function LogicToStage(tx:int, ty:int):Point
{
/**
* 偶数行tile中心
* */
var tileCenter:int = (tx * TileWidth) + TileWidth/2;
/**
* x象素 如果为奇数行加半个宽
* */
var xPixel:int = tileCenter + (ty&1) * TileWidth/2;
/**
* y象素
* */
var yPixel:int = (ty + 1) * TileHeight/2;
return new Point(xPixel, yPixel);
}
这里还有一个
http://bbs.9ria.com/thread-39884-1-1.html
再说一下我的做法,就是切成矩形栅格,然偶看点落在哪个矩形里,再看点落在矩形中的哪个三角形中,最后根据三角形类型(是菱形的哪部分),以及当前矩形的行列值,就可以算出来了
看了半天不太明白,你想问的具体问题是什么?
在我的算法中45度坐标转换中有如下几个方法
1、屏幕坐标转stage方式二维数组坐标
已知某屏幕坐标求stage 方式二维数组的下标
2、屏幕坐标转iso方式 二维数组坐标
已知某屏幕坐标求iso 方式二维数组的下标(iso数组二维下标有负数)
3、屏幕坐标转iso坐标
已知某屏幕坐标求iso坐标(iso坐标值有负数)
4、stage二维数组坐标转iso二维数组坐标
已知stage数组中某个下标求对应的iso数组中的坐标
5、45度数组坐标转90度数组坐标
同上,反转
注意事项:
1、整个算法中屏幕坐标系和iso坐标系的原点重合,位置在左上角0,0点。
2、Tile的坐标原点在小菱形的左顶点。
谢谢浪子的回答!
不过我还是不明白!
最不明白的是。我通过一个排列方式排列!
比如:
stage.x = logic.x * TileWidth + ( logic.y & 1) * ( TileWidth / 2 );
stage.y = logic.y * TileHeigth / 2;
logic表示 数组索引如(0,0);
那么反过来我点击舞台时 把舞台坐标转换成二维数组索引不就好了!
我的问题是 转过来 老有错。。。。。。
不明白你为什么 还有个iso数组 用来做啥的?