版本:2.4.10

 

一 六边形地图

常规地图是地块是矩形,有些游戏是六边形,例如剑与远征。现在就来看看用TiledMap设计六边形地图。

 

二 Tiled创建六边形地图

先画3个六边形的地块,大小64x74。

 

打开TiledMap,选择文件-新建-创建新地图。地图方向选择六角(交错),地图大小20x20,块大小64x74。

 

创建后地图是这样的,是个棱形,不是六边形

 

选择地图-地图属性,设置图块边长为40

 

地图变成六边形的了

 

选择文件-新建-新图块。点击浏览,选择六边形图块的图片,块高宽64x74。

 

创建图块后,右下角就会出现创建的图块,点击右下角任一图块,选择工具栏上的图章刷,然后就能用图块画地图了。

 

 三  周围格子的遍历

1 普通地图

 

例如获取(1,1)周围的格子,如下图

 

    /**地图数据,二维数组[][] */
    private mapData;
    /**最大行 */
    private maxRow;
    /**最大列 */
    private maxCol;

    /**
     * 获取指定格子周围的格子
     * @param row 行
     * @param col 列
     * @returns 返回周围的格子
     */
    public getAroundGrid(row: number, col: number) {
        let list = [];
        //获取上一行格子
        if (row > 0) {
            list.push(this.mapData[row - 1][col - 1]);
            list.push(this.mapData[row - 1][col]);
            list.push(this.mapData[row - 1][col + 1]);
        }
        //获取同行格子
        list.push(this.mapData[row][col - 1]);
        list.push(this.mapData[row][col + 1]);
        //获取下一行格子
        if (row < this.maxRow - 1) {
            list.push(this.mapData[row + 1][col - 1]);
            list.push(this.mapData[row + 1][col]);
            list.push(this.mapData[row + 1][col + 1]);
        }
        //剔除为null的格子
        let len = list.length - 1;
        for (let i = len; i >= 0; i--) {
            if (list[i] == null) {
                list.splice(i, 1);
            }
        }
        return list;
    }

  

2 六边形地图

 

六边形地图获取周围格子,奇数和偶数行是不一样的,例如获取(1,1)周围格子或获取(2,2)周围格子。

(1,1)获取上一行是(row-1,col)和(row-1,col+1)

(2,2)获取上一行是(row-1,col-1)和(row-1,col)

    

 

   /**地图数据,二维数组[][] */
    private mapData;
    /**最大行 */
    private maxRow;
    /**最大列 */
    private maxCol;

    /**
     * 获取指定格子周围的格子
     * @param row 行
     * @param col 列
     * @returns 返回周围的格子
     */
    public getAroundTile(row: number, col: number) {
        let list = [];
        //偶数行
        if (row % 2 == 0) {
            //上一行相邻格子
            if (row > 0) {
                list.push(this.mapData[row - 1][col - 1]);
                list.push(this.mapData[row - 1][col]);
            }
            //同行左右相邻格子
            list.push(this.mapData[row][col - 1]);
            list.push(this.mapData[row][col + 1]);
            //下一行相邻格子
            if (row < this.maxRow - 1) {
                list.push(this.mapData[row + 1][col - 1]);
                list.push(this.mapData[row + 1][col]);
            }
            //奇数行
        } else {
            //上一行相邻格子
            if (row > 0) {
                list.push(this.mapData[row - 1][col]);
                list.push(this.mapData[row - 1][col + 1]);
            }
            //同行左右相邻格子
            list.push(this.mapData[row][col - 1]);
            list.push(this.mapData[row][col + 1]);
            //下一行相邻格子
            if (row < this.maxRow - 1) {
                list.push(this.mapData[row + 1][col]);
                list.push(this.mapData[row + 1][col + 1]);
            }
        }
        //剔除为null的格子
        let len = list.length - 1;
        for (let i = len; i >= 0; i--) {
            if (list[i] == null) {
                list.splice(i, 1);
            }
        }
        return list;
    }

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2022-09-28 15:42  gamedaybyday  阅读(2355)  评论(5编辑  收藏  举报