美文网首页
tiledMap使用(三)

tiledMap使用(三)

作者: 园Flora | 来源:发表于2021-05-21 11:51 被阅读0次

(可能又是版本缘故导致产生挺多问题,cocos引擎用的3.8)

分层绘制

绘制地图的时候,由于资源功能和诉求不一样,所以可能会需要切不同大小的素材,比如小点的地板,大点的树,大点的建筑等,可以分层去绘制(注意前面说的,每个层只能用一个图块集,不然渲染会出问题)
分成绘制导致的问题:

  • 1.编辑器里显示正常,但是游戏里有偏差,据测试偏差产生的原因是由于图片的绘制偏移导致的。


    image.png

    解决办法:代码里手动调整了层的位置,只有x就是图片的偏移量,y是偏移量的相反数(负的)
    (这样处理后,点击判断也会正常,不然那边也有偏移)

        self.BuildLayer:setPositionX(-190)
        self.BuildLayer2:setPositionX(-190)
        self.GroundLayer:setPositionX(-52)
        self.GroundLayer:setPositionY(-28)
        tilemap:getLayer("GroundFront"):setPositionX(-60)
        tilemap:getLayer("GroundFront"):setPositionY(10)
    1. 图片层:编辑器里正常,游戏里不正常,会受图块裁剪的影响,显示的很怪,建议代码自己加背景图吧
    1. 地板层的思考:如果图块情况复杂,可以考虑用透明地板+背景图片的模式来实现。(为什么还要地板?地板得画路,判断路能不能走,这个地方是不是建筑.....顿悟,这不是就是个逻辑层吗,为什么能叫地板呢......)
  • 4.把地板层变成逻辑层(思考ing):
    1. 透明的地块:通过类型来控制功能


      地块类型
    2. 类型设置:目前用到了以下类型:Road(普通的路) ,Bd+num(如Bd1,Bd2...)可以表示不同类型的建筑,
      组合地块{Four_Bd1_down,Four_Bd1_up,Four_Bd1,Four_Bd1}四个的组合建筑,同理设置了7或9的组合建筑{Seven_center,Seven},Bd1_Road (能穿过的建筑),两个的组合加能传过的建筑{Two_Bd1Road_down ,Two_Bd1Road_up} 。。。(只有你做不到,没有策划想不到...T_T...)
    3. 类型处理 (原谅我用js了,因为要导出建筑数据给服务端,所以就放一起实现了,然后客户端也存了个配置)
      没有什么技巧,纯用if找有没有关联点,根据地图的类型找的方向会不一样
      当然如果不需要组合地块,这个部分可以忽略
function checkClickType( tilePos ){
    let tiles = new Array()
    let centerPos =tilePos
    let center
    let fourCenter
    let TwoUp
    let type 
    let clickType = getTileGIDAt(tilePos)
    if (clickType) { 
        let specl = SpecailTile(clickType)
        if (specl== "stone") {

        } else if (specl.indexOf("Seven")>=0){
            if (specl.indexOf("center")>=0){
                center = tilePos
            } else { 
                for(let i=-1;i<=1;i++) {
                    let x = tilePos.x+i
                    let y = tilePos.y
                    if( x>-1 && y>-1 && x<TileCol && y<TileRow) { 
                        let tileP = {"x":x,"y":y}
                        let tmpType = getTileGIDAt(tileP)
                        if (SpecailTile(tmpType).indexOf("center")>=0) {
                            center = tileP
                            break
                        }
                    }
                }
                if(!center){
                    for(let j=-1;j<=1;j++) {
                        let ad = tilePos.y%2==1 ? 1 :-1
                        let x = tilePos.x+ad
                        let y = tilePos.y+j
                        if( x>-1 && y>-1 && x<TileCol && y<TileRow) { 
                            let tileP = {"x":x,"y":y}
                            let tmpType = getTileGIDAt(tileP)
                            if (SpecailTile(tmpType).indexOf("center")>=0) {
                                center = tileP
                                break
                            }
                        }
                    }
                }
                if(!center){
                    for (j=-2;j<=2;j++) {
                        let x = tilePos.x
                        let y = tilePos.y+j
                        if( x>-1 && y>-1 && x<TileCol && y<TileRow) { 
                            let tileP = {"x":x,"y":y}
                            let tmpType = getTileGIDAt(tileP)
                            if (SpecailTile(tmpType).indexOf("center")>=0) {
                                center = tileP
                                break
                            }
                        }
                    }
                }  
                
            }
        } else if (specl.indexOf("Four")>=0){
            let tStr = specl.lastIndexOf('_');
            let typeName = specl
            if(tStr>4){
                typeName = specl.substring(0,tStr)
            }
            let upType = typeName+"_up"
            let downType = typeName+"_down"
            if (specl== typeName) { 
                let addX= tilePos.y%2
                let y= tilePos.y+1
                for (let i=0;i<=1;i++) {
                    let x = tilePos.x-1+addX+i
                    if (x>-1 && y>-1 && x<TileCol && y<TileRow) { 
                        let tileP = {"x":x,"y":y}
                        let tmpType = getTileGIDAt(tileP)
                        if (tmpType && SpecailTile(tmpType)==downType) {
                            let tmpType2 = getTileGIDAt({"x":tmpType.x,"y":tmpType.y-2})
                            if (tmpType2 && SpecailTile(tmpType2)==upType) {
                                fourCenter = tileP
                            }
                            break
                        }
                    }
                }
            } else if (specl== downType) { 
                let tmpType = getTileGIDAt({"x":tilePos.x,"y":tilePos.y-2})
                if (tmpType && SpecailTile(tmpType)==upType) {
                    fourCenter = tilePos
                }
            } else if (specl== upType) { 
                let tmpType = getTileGIDAt({"x":tilePos.x,"y":tilePos.y+2})
                if (tmpType && SpecailTile(tmpType)==downType) {
                    fourCenter = {"x":tilePos.x,"y":tilePos.y+2}
                }
            }
        }else if (specl.indexOf("Two")>=0){
            let tStr = specl.lastIndexOf('_');
            let typeName = specl
            if(tStr>4){
                typeName = specl.substring(0,tStr)
            }
            let upType = typeName+"_up"
            let downType = typeName+"_down"
            if (specl== downType) { 
                let tmpType = getTileGIDAt({"x":tilePos.x,"y":tilePos.y-2})
                if (tmpType && SpecailTile(tmpType)==upType) {
                    TwoUp = tilePos
                }
            } else if (specl== upType) { 
                let tmpType = getTileGIDAt({"x":tilePos.x,"y":tilePos.y+2})
                if (tmpType && SpecailTile(tmpType)==downType) {
                    TwoUp = {"x":tilePos.x,"y":tilePos.y+2}
                }
            }
        }
        if (center!= undefined) { 
            centerPos = center
            tiles = getNeighbors(center)
            tiles.push({"x":center.x,"y":center.y})
        } else if (fourCenter) { 
            centerPos = {"x":fourCenter.x,"y":fourCenter.y-2}
            if (fourCenter.y%2 ==1) { 
                tiles.push({"x":fourCenter.x,"y":fourCenter.y-1})
                tiles.push({"x":fourCenter.x+1,"y":fourCenter.y-1})
            }else{
                tiles.push({"x":fourCenter.x,"y":fourCenter.y-1})
                tiles.push({"x":fourCenter.x-1,"y":fourCenter.y-1})
            }
            tiles.push({"x":fourCenter.x,"y":fourCenter.y-2})
            tiles.push({"x":fourCenter.x,"y":fourCenter.y})
        } else if (TwoUp) { 
            centerPos = {"x":TwoUp.x,"y":TwoUp.y-2}
            tiles.push({"x":TwoUp.x,"y":TwoUp.y-2})
            tiles.push({"x":TwoUp.x,"y":TwoUp.y})
        }else{
            tiles.push(tilePos)
        }

        type = SpecailTile(getTileGIDAt(centerPos))
        if (type == undefined){
            type= 2 //战场
        }else{
            for (const key in typeRedefine) {
                if(type.indexOf(key)>=0){
                    type=typeRedefine[key]
                    break
                }
            }
        }
    }
    return {tiles,type,centerPos}
}

-5.添加sprite到层
问题又来了,添加的时候会报错,同一个层必须用同样的纹理来绘制sprite,如果你自己外面画个小人想加进去,就抱歉了。
解决办法:

        --动画层 动态变化层
        local nd = cc.Node:create()
        nd:setLocalZOrder(1)
        tilemap:addChild(nd)

机智的我加了个node在tilemap上,同时可以设置它的zorder 决定了它能插在哪些层中间,比如我写1 ,就插在了1和2中间


image.png

相关文章

网友评论

      本文标题:tiledMap使用(三)

      本文链接:https://www.haomeiwen.com/subject/tpcwjltx.html