tiledMap使用(三)

2021-05-21  本文已影响0人  园Flora

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

分层绘制

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

        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)
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
上一篇 下一篇

猜你喜欢

热点阅读