生成六边形地图并使用数组存储地图数据

本文介绍了如何使用JavaScript和TypeScript在Cocos Creator 2.x中生成六边形地图,并将地图数据存储到数组中,便于后续操作如放置棋子和移动。通过特定算法,将坐标转换为易于理解的形式,简化了地图操作。
摘要由CSDN通过智能技术生成

 首先制作地图瓦片的预制体,预制体中的元素img为六边形图片,x,y为数字显示瓦片的坐标。

我们准备制作一个如下图所示的地图:

 首先生成从上开始2,4,6 行的瓦片

 for(let j=-2;j<3;j+=2){
            let jabs=Math.abs(j);
            //console.log("j:"+jabs);
            let iabs=(6-jabs)/2;
            //console.log("i:"+iabs)
            for(let i=-iabs;i<iabs+1;i++){
               let pos=cc.v2(i*this.tilesWeight,j*this.tilesHeight);
               let tiles=cc.instantiate(this.tile);
               this.node.addChild(tiles);
               tiles.setPosition(pos);
              
            } 
        }

 运行后结果如下

接着生成从上开始1,3,5,7行的瓦片

 for(let j=-3;j<5;j+=2){
            let jabs=Math.abs(j);
            //console.log("j:"+jabs);
            let iabs=(7-jabs)/2;
            //console.log("i:"+iabs)

            for(let i=-iabs;i<iabs;i++){
               let pos=cc.v2(i*this.tilesWeight+this.tilesWeight/2,j*this.tilesHeight);
               let tiles=cc.instantiate(this.tile);
               this.node.addChild(tiles);
               tiles.setPosition(pos);
               
              
            }
            
        }

运行结果如下

 

如果我们直接使用生成坐标位置的 i,j 变量来作为瓦片的 x , y 值。

这样的坐标我们难以使用,相邻直接的瓦片坐标也没有一般规律,我们要想办法将其变成上面展示图片的坐标。

// 2,4,6,行数值改变
               if(j>=2){
                tiles.getComponent(mapTiles).num1=i-1;
               }
               else if(j<=-1){
                tiles.getComponent(mapTiles).num1=i+1;
               }
               else{
                tiles.getComponent(mapTiles).num1=i;
               }

               //j值符合六边形坐标系无需计算
               tiles.getComponent(mapTiles).num2=j;
//1,3,5,7行数值改变
               if(j>=2){
                tiles.getComponent(mapTiles).num1=i-1;
               }
               else if(j==-1){
                tiles.getComponent(mapTiles).num1=i+1;
               }
               else if(j==-3){
                tiles.getComponent(mapTiles).num1=i+2;
               }
               else{
                tiles.getComponent(mapTiles).num1=i;
               }
               
               tiles.getComponent(mapTiles).num2=j;

结果如下

这样就可以清晰的看到地图的 x轴和y轴,为了方便存储我们使每个坐标值都加3,并把坐标信息存入数组中,我们在利用数组的坐标生成游戏棋子,后续也可以通过坐标来直接移动棋子。

完整代码如下

//生成地图代码,挂载在canvas上,在start中调用一次
mapShow(){
        for(let a=0;a<7;a++){
            this.tilesArr.push([]);
            for(let b=0;b<7;b++){
                this.tilesArr[a].push(cc.v2(0,0));
            }
        }

         for(let j=-2;j<3;j+=2){
            let jabs=Math.abs(j);
            //console.log("j:"+jabs);
            let iabs=(6-jabs)/2;
            //console.log("i:"+iabs)
            for(let i=-iabs;i<iabs+1;i++){
               let pos=cc.v2(i*this.tilesWeight,j*this.tilesHeight);
               let tiles=cc.instantiate(this.tile);
               this.node.addChild(tiles);
               tiles.setPosition(pos);

               let axX=i+3;
               let axY=j+3;
               if(j>=2){
                  axX-=1;
               }
               else if(j<=-1){
                  axX+=1;
               }
               
               tiles.getComponent(mapTiles).num1=axX;
               //j值符合六边形坐标系无需计算
               tiles.getComponent(mapTiles).num2=axY;

               this.tilesArr[axX][axY]=pos;

            }
            
        }


        for(let j=-3;j<5;j+=2){
            let jabs=Math.abs(j);
            //console.log("j:"+jabs);
            let iabs=(7-jabs)/2;
            //console.log("i:"+iabs)

            for(let i=-iabs;i<iabs;i++){
               let pos=cc.v2(i*this.tilesWeight+this.tilesWeight/2,j*this.tilesHeight);
               let tiles=cc.instantiate(this.tile);
               this.node.addChild(tiles);
               tiles.setPosition(pos);
               
               let axX=i+3;
               let axY=j+3;
               if(j>=2){
                axX-=1;
               }
               else if(j==-1){
                axX+=1;
               }
               else if(j==-3){
                axX+=2;
               }
               
               tiles.getComponent(mapTiles).num1=axX;
               tiles.getComponent(mapTiles).num2=axY;

               this.tilesArr[axX][axY]=pos;

              
            }
            
        }

        for(let a=0;a<7;a++){
            
            for(let b=0;b<7;b++){
                if(this.tilesArr[a][b]!=null){
                    let che=cc.instantiate(this.xiangmao);
                    this.node.addChild(che);
                    che.setPosition(this.tilesArr[a][b]);
                }
            }
        }
    }


//瓦片代码,挂载在瓦片预制体上
   @property
    num1:number=0;
    @property
    num2:number=0;

    @property(cc.Label)
    axisX:cc.Label;
    @property(cc.Label)
    axisY:cc.Label;


    start () {
        this.scheduleOnce(()=>{
            this.axisX.string=this.num1.toString();
            this.axisY.string=this.num2.toString();
        },0);
    }

使用软件 cocos creator 2.x

语言type script

在unity中也可以使用同样方法生成。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Pygame是一个开源的Python游戏开发库,它提供了丰富的功能和工具,使开发者能够创建各种类型的游戏。其中六边形地图是Pygame中非常常见的一种地图类型。 六边形地图是由一系列六边形组成的二维平面。每个六边形都有六个相邻的六边形,使得地图的连接具有很好的连续性和平滑性。因此,六边形地图常用于策略类游戏、角色扮演游戏以及地图展示等领域。 在Pygame中创建六边形地图可以通过一系列的计算和绘制操作来实现。首先,我们需要确定地图的大小以及六边形的尺寸和边长。然后,可以通过循环嵌套的方式来创建每个六边形,并为其设置合适的位置和颜色。 在绘制六边形地图时,我们可以使用Pygame的图形绘制函数,如pygame.draw.polygon()来绘制每个六边形的边框。同时,我们也可以使用pygame.draw.circle()函数来绘制六边形的中心点,以及pygame.draw.line()函数来绘制连接相邻六边形的边界线。 除了绘制地图,我们还可以为每个六边形赋予特定的属性,如地形类型、可通行性、资源等。这样,在游戏中我们可以根据六边形的属性来进行路径规划、单位移动以及资源采集等操作。 总的来说,Pygame提供了丰富的图形绘制和计算功能,可以很方便地创建和操作六边形地图。通过合理的设计和开发,我们可以实现各种各样的游戏场景,给玩家带来更加丰富多样的游戏体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值