`

[转]45度菱形地图屏幕坐标转换为逻辑坐标及直角坐标的方法

阅读更多
看到有同学提问 hfMapeditor 的屏幕点击坐标转换为直角坐标的方法
http://www.eb163.com/club/thread-4281-1-1.html

屏幕坐标位置的确定用公式计算:
屏幕的x坐标=地图格子逻辑数组中的位置X  * 格子宽度  
屏幕的y坐标=地图格子逻辑数组中的位置Y  *  格子高度/2

得到的图应该是这样的:

那么这个公式是怎样得到呢?




这个地图有5行,看着这个地图你会想,怎么拼图才能将地图拼出来。再画张图来演示:






从这张图可以看出,拼图时从左到右,从上到下,跟正规的矩形拼图一样,唯一同的是,地图元素与元素之间有重叠,看看第一行和第二行之间,第二行的地图元素会压在第一行的元素上,而第三行的的地图元素则压在第二行的元素上。所以,只要找到正确的公式,你就能正确地设计程序,再来一张图:





图上绿点(是高亮度绿色,不是暗绿色)是每块地图元素的起点,第一行的行坐标是0,第二行的行坐标是1,第三行的行坐标是2,......由这些行坐标决定你的地图元素的起点,从这个规律中看出行坐标0,和行坐标2的横向坐标X的起点是一样的是0,行坐标为1的起点是向右移半块地图元素。
再从纵向坐标找规律,看行坐标0和行坐标2,两块地图元素之间的距离刚好是一块地图元素的高。再看看行坐标0和行坐标1,两块地图元素之间的距离刚好是半块地图元素的高。所以,计算每块地图元素的位置,你的转换屏幕坐标和逻辑公式刚好是:
logic.y = ( 2 * stage.y ) / TileHeigth;
logic.x = ( stage.x / TileWidth ) - ( logic.y & 1 ) * ( TileWidth / 2 );
stage.x = logic.x * TileWidth + ( logic.y & 1) * ( TileWidth / 2 );
stage.y = logic.y * TileHeigth / 2;
其中TileHeigth和TileWidth是菱形的高和宽,这样你可以再尝试着定义(0,1),(0,2),(0,3)等点,和得到的结果完全一样···

重要:
首先以上的公式只适用于Staggered斜45度角地图,而slide,和Diamond形地图,这个公式要稍加修改才能用。
Staggered:



Slide:



Diamond:




而得到的逻辑坐标就是把了斜45度得到的实际坐标么?当然不是···
仔细观察,如果我们想用一个直角的坐标来表示这个地图,那么大家可能开发起来也更加直观一些,看这个坐标表示出来的y轴都是扭曲的用起来实在不爽,那么我们来将它转换到直角坐标,那么再来加上寻路等算法都没有任何难度了

首先我们将地图的高进行转换,这个转换主要是将菱形还原成正方形,例如菱形的高宽比是2:1,那么在地图上则需要将地图高度扩大一倍,然后旋转-45度,那么得到对应坐标如下




我们更加仔细的对这个图的坐标进行标注:






/**
* ...
* @author myth815
*/
package ContainerObjectManager
{
import flash.geom.Point;
import Math;
public class PointExchange
{
  private static var TileWidth : int = 60;
  private static var TileHeigth : int = 30;
  public function PointExchange()
  {
   //this Class not allow init!
  }
 
  public static function StageToLogic(stage:Point):Point
  {
   var logic : Point = new Point;
   logic.y = ( 2 * stage.y ) / TileHeigth;
   logic.x = ( stage.x / TileWidth ) - ( logic.y & 1 ) * ( TileWidth / 2 );
   return logic;
  }
 
  public static function LogicToStage(logic:Point):Point
  {
   var stage : Point = new Point;
   stage.x = logic.x * TileWidth + ( logic.y & 1) * ( TileWidth / 2 );
   stage.y = logic.y * TileHeigth / 2;
   return stage;
  }
}
}
复制代码
  • 大小: 1.5 KB
  • 大小: 1.8 KB
  • 大小: 4.8 KB
  • 大小: 1.5 KB
  • 大小: 1.7 KB
  • 大小: 1.2 KB
  • 大小: 15 KB
  • 大小: 97.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics