地形瓦片地图TiledMap AutoTiles自动图块

最早是在RPG Maker里面见到这种东西,相邻的块可以自动连接,大大方便地图绘制。素材长这个样子
在这里插入图片描述

一个大块是32x32的,然后每个大块又被分成4个16x16的小块,而这些小块总共可以组成47种大块(最后两个是一样的)。
在这里插入图片描述
(这两张图片来自这里,懒得去搞图了)

于是,给图1中的小块按行编号0~47,可以写出图2中每个大块的组成。

unsigned char AutoTileTab[48][4]={
    18,17,14,13,//0
    2,17,14,13,//1
    18,3,14,13,//2
    2,3,14,13,//3
    18,17,14,7,//4
    2,17,14,7,//5
    18,3,14,7,//6
    2,3,14,7,//7
    18,17,6,13,//8
    2,17,6,13,//9
    18,3,6,13,//10
    2,3,6,13,//11
    18,17,6,7,//12
    2,17,6,7,//13
    18,3,6,7,//14
    2,3,6,7,//15

    16,17,12,13,//16
    16,3,12,13,//17
    16,17,12,7,//18
    16,3,12,7,//19

    10,9,14,13,//20
    10,9,14,7,//21
    10,9,6,13,//22
    10,9,6,7,//23

    18,19,14,15,//24
    18,19,6,15,//25
    2,19,14,15,//26
    2,19,6,15,//27

    18,17,22,21,//28
    2,17,22,21,//29
    18,3,22,21,//30
    2,3,22,21,//31

    16,19,12,15,//32
    10,9,22,21,//33
    8,9,12,13,//34
    8,9,12,7,//35
    10,11,14,15,//36
    10,11,6,15,//37
    18,19,22,23,//38
    2,19,22,23,//39
    16,17,20,21,//40
    16,3,20,21,//41

    8,11,12,15,//42
    8,9,20,21,//43
    16,19,20,23,//44
    10,11,22,23,//45
    8,11,20,23,//46
    0,1,4,5,//47
};

给当前块周围的块编号0~7,如下图

    // 0 1 2
    // 3 _ 4
    // 5 6 7

只需根据{0,1,3}判断出当前块左上角,{1,2,4}判断出右上角,{3,5,6}左下角,{4,6,7}右下角,然后查 AutoTileTab 表即可,即

    //左上
    if (self == around[1]) {
        if (self == around[3]) {
            if (self == around[0]) {
                blocks[0] = 18;
            } else {
                blocks[0] = 2;
            }
        } else {
            blocks[0] = 16;
        }
    } else {
        if (self == around[3]) {
            blocks[0] = 10;
        } else {
            blocks[0] = 8;
        }
    }
    //右上
    if (self == around[1]) {
        if (self == around[4]) {
            if (self == around[2]) {
                blocks[1] = 17;
            } else {
                blocks[1] = 3;
            }
        } else {
            blocks[1] = 19;
        }
    } else {
        if (self == around[4]) {
            blocks[1] = 9;
        } else {
            blocks[1] = 11;
        }
    }
    //左下
    if (self == around[6]) {
        if (self == around[3]) {
            if (self == around[5]) {
                blocks[2] = 14;
            } else {
                blocks[2] = 6;
            }
        } else {
            blocks[2] = 12;
        }
    } else {
        if (self == around[3]) {
            blocks[2] = 22;
        } else {
            blocks[2] = 20;
        }
    }
    //右下
    if (self == around[6]) {
        if (self == around[4]) {
            if (self == around[7]) {
                blocks[3] = 13;
            } else {
                blocks[3] = 7;
            }
        } else {
            blocks[3] = 15;
        }
    } else {
        if (self == around[4]) {
            blocks[3] = 21;
        } else {
            blocks[3] = 23;
        }
    }
    SetTileId(i, j, (self << 6) + ToTileTabIndex(blocks));

上面只是刷新当前块,注意周围八块也要刷新

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值