在之前我记得我记录过e社海陆的制作,但是翻了下,好像找不到了,所以准备重新记录,这个东西思考了两三天,甚至于我不得不翻以前的代码,才完成了相关思路.故记录下来以防遗忘.

思路:

 

1. 如图,海陆边缘由周围六个边来决定.所以我们每次切换海陆时,都需要遍历格子周围的一圈坐标,判断他们的走向,并更新为相关显示

2.河流,河流的判断与海陆的判断思路基本一致,   但是如果照抄海陆,会出现三角形的情况(下图1)

 

 我们需要额外判断,当格子的斜方向格子是河流的时候,垂直方向的河流方向判断应该为false,因为游戏中不可能出现三角形河流

 

 

 

 //自动海陆
    public void checkCoast() {
        for (int i = 0; i < mapBins.size(); i++) {
            autoCoast(i, false);
        }
    }


    //生成海岸
    // Gdx.app.log("autoCoast", "id:"+i+" coastId:"+c);
    public void autoCoast(int id, boolean ifAround) {
        List<Integer> tempIds = new ArrayList();
        if (ifAround) {
            List<Integer> ids = getAroundIdById(id, 0, null);
            ids.add(id);

            for (Integer i : ids) {


                int c = getCoastId(i, tempIds);
                if (c != -1) {
                    //mapBins.get(i).initGrid();
                    mapBins.get(i).setBackTile(2);
                    mapBins.get(i).setBackIdx(c);
                } else {

                }
            }

        } else {
            /*
             * int s; if(id==7309) { s=1; } if (ifBorder(id)) { dealBorder(id);
             * } else
             */
            {
                int c = getCoastId(id, tempIds);
                // Gdx.app.log("autoCoast", "id:"+id+" coastId:"+c);
                if (c != -1) {
                    //mapBins.get(id).initGrid();
                    mapBins.get(id).setBackTile(2);
                    mapBins.get(id).setBackIdx(c);
                    /*mapBins.get(id).bmTerrain1Group = 1;
                    mapBins.get(id).bmTerrain1Id = 0;
                    mapBins.get(id).bmTerrain1X = 0;
                    mapBins.get(id).bmTerrain1Y = 0;
                    mapBins.get(id).bmDoodad1Group = 31;
                    mapBins.get(id).bmDoodad1Id = c;
                    mapBins.get(id).bmDoodad1X = 0;
                    mapBins.get(id).bmDoodad1Y = 0;
                    mapBins.get(id).bmDoodad2Group = 63;
                    mapBins.get(id).bmDoodad2Id = 255;
                    mapBins.get(id).bmDoodad2X = 0;
                    mapBins.get(id).bmDoodad2Y = 0;*/
                }
            }

        }
        //land
        /*if (mapBins.get(id).getBlockType() != 1) {
            if ((mapBins.get(id).getBackTile() == 2 )) {
                mapBins.get(id).setBackTile(0);
                mapBins.get(id).setBackIdx(0);
            }
        } else  {//(mapBins.get(id).getBlockType() == 1)
            mapBins.get(id).setBackTile(1);
            mapBins.get(id).setBackIdx(0);
        }*/
    }
private int getCoastBorderId(int id, List<Integer> ids) {

        if (ids == null) {
            ids = new ArrayList<>();
        } else {
            ids.clear();
        }
        boolean t1 = ifSameByTypeInCoastBorder(id, 1);
        boolean t2 = ifSameByTypeInCoastBorder(id, 2);
        boolean t3 = ifSameByTypeInCoastBorder(id, 3);
        boolean t4 = ifSameByTypeInCoastBorder(id, 4);
        boolean t5 = ifSameByTypeInCoastBorder(id, 5);
        boolean t6 = ifSameByTypeInCoastBorder(id, 6);
        if (t1) {
            if (t2) {
                if (t3) {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 0;
                            } else {
                                return 60;
                            }
                        } else {
                            if (t6) {
                                return 56;
                            } else {
                                return 52;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 48;
                            } else {
                                return 44;
                            }
                        } else {
                            if (t6) {
                                return 40;
                            } else {
                                return 36;
                            }
                        }
                    }
                } else {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 62;
                            } else {
                                return 58;
                            }
                        } else {
                            if (t6) {
                                return 54;
                            } else {
                                return 50;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 46;
                            } else {
                                return 42;
                            }
                        } else {
                            if (t6) {
                                return 38;
                            } else {
                                return 34;
                            }
                        }
                    }
                }
            } else {
                if (t3) {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 63;
                            } else {
                                return 59;
                            }
                        } else {
                            if (t6) {
                                return 55;
                            } else {
                                return 51;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 47;
                            } else {
                                return 43;
                            }
                        } else {
                            if (t6) {
                                return 39;
                            } else {
                                return 35;
                            }
                        }
                    }
                } else {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 61;
                            } else {
                                return 57;
                            }
                        } else {
                            if (t6) {
                                return 53;
                            } else {
                                return 49;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 45;
                            } else {
                                return 41;
                            }
                        } else {
                            if (t6) {
                                return 37;
                            } else {
                                return 33;
                            }
                        }
                    }
                }
            }

        } else {//t1
            if (t2) {
                if (t3) {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 32;
                            } else {
                                return 28;
                            }
                        } else {
                            if (t6) {
                                return 24;
                            } else {
                                return 20;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 16;
                            } else {
                                return 12;
                            }
                        } else {
                            if (t6) {
                                return 8;
                            } else {
                                return 4;
                            }
                        }
                    }
                } else {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 30;
                            } else {
                                return 26;
                            }
                        } else {
                            if (t6) {
                                return 22;
                            } else {
                                return 18;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 14;
                            } else {
                                return 10;
                            }
                        } else {
                            if (t6) {
                                return 6;
                            } else {
                                return 2;
                            }
                        }
                    }
                }
            } else {
                if (t3) {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 31;
                            } else {
                                return 27;
                            }
                        } else {
                            if (t6) {
                                return 23;
                            } else {
                                return 19;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 15;
                            } else {
                                return 11;
                            }
                        } else {
                            if (t6) {
                                return 7;
                            } else {
                                return 3;
                            }
                        }
                    }
                } else {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 29;
                            } else {
                                return 25;
                            }
                        } else {
                            if (t6) {
                                return 21;
                            } else {
                                return 17;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 13;
                            } else {
                                return 9;
                            }
                        } else {
                            if (t6) {
                                return 5;
                            } else {
                                return 1;
                            }
                        }
                    }
                }
            }
        }
    }


public boolean ifSameByTypeInCoastBorder(int idA, int direct) {
        int idB = getIdInDirect(idA, direct);

        //Gdx.app.log("", "idA:"+idA+" idB:"+idB+" direct:"+direct+ " aG:"+getBlockType(idA)+ " bG:"+getBlockType(idB));
        if (idB == -1) {
            return true;
        } else if (idB >= 0 && idB < mapBins.size() && mapBins.get(idA).getBlockType() == 1 && mapBins.get(idB).getBlockType() == 1) {
            return true;
        } else {
            return false;
        }
    }
    public boolean ifSameByTypeInRiverBorder(int idA, int direct) {
        int idB = getIdInDirect(idA, direct);

        //Gdx.app.log("", "idA:"+idA+" idB:"+idB+" direct:"+direct+ " aG:"+getBlockType(idA)+ " bG:"+getBlockType(idB));
        if (idB == -1) {
            return true;
        } else if (idB >= 0 && idB < mapBins.size() && mapBins.get(idA).getBackTile() == 11 && mapBins.get(idB).getBackTile() == 11) {
            return true;
        } else {
            return false;
        }
    }

public void autoRiver(int id, boolean ifAround) {
        List<Integer> tempIds = new ArrayList();
        if (ifAround) {
            List<Integer> ids = getAroundIdById(id, 0, null);
            ids.add(id);

            for (Integer i : ids) {


                int c = getRiverId(i, tempIds);
                if (c != -999) {
                    if(c==-1){
                        mapBins.get(i).setBackTile(11);
                        mapBins.get(i).setBackIdx(63);
                    }else{
                        mapBins.get(i).setBackTile(11);
                        mapBins.get(i).setBackIdx(c);
                    }
                } else {

                }
            }

        } else {
            /*
             * int s; if(id==7309) { s=1; } if (ifBorder(id)) { dealBorder(id);
             * } else
             */
            {
                int c = getRiverId(id, tempIds);
                // Gdx.app.log("autoCoast", "id:"+id+" coastId:"+c);
                if (c != -999) {
                    if(c==-1){
                        mapBins.get(id).setBackTile(11);
                        mapBins.get(id).setBackIdx(63);
                    }else{
                        mapBins.get(id).setBackTile(11);
                        mapBins.get(id).setBackIdx(c);
                    }
                }
            }

        }
        int c = getRiverId(id, tempIds);
        if (c != -999) {
            if(c==-1){
                mapBins.get(id).setBackTile(11);
                mapBins.get(id).setBackIdx(63);
            }else{
                mapBins.get(id).setBackTile(11);
                mapBins.get(id).setBackIdx(c);
            }
        } else {

        }
    }

private int getCoastId(Integer id, List<Integer> ids) {
        if (mapBins.get(id).getBlockType() != 1) {//
            return -1;
        }
        int rs = getCoastBorderId(id, ids);
        return rs-1 ;

    }

private int getRiverId(Integer id, List<Integer> ids) {
        if (mapBins.get(id).getBackTile() != 11) {//
            return -999;
        }
        int rs = getRiverBorderId(id, ids);

        //根据自己的坐标来进行偏移
        return rs-1 ;

    }


    private int getRiverBorderId(int id, List<Integer> ids) {

        if (ids == null) {
            ids = new ArrayList<>();
        } else {
            ids.clear();
        }
        //左上1,上2,右上3,左下4,下5,右下6
        boolean t1 = ifSameByTypeInRiverBorder(id, 1);
        boolean t2 = ifSameByTypeInRiverBorder(id, 2);
        boolean t3 = ifSameByTypeInRiverBorder(id, 3);
        boolean t4 = ifSameByTypeInRiverBorder(id, 4);
        boolean t5 = ifSameByTypeInRiverBorder(id, 5);
        boolean t6 = ifSameByTypeInRiverBorder(id, 6);

        if( (t4||t6)&&t5 ){
            t5=false;
        }
        if( (t1||t3)&&t2 ){
            t2=false;
        }

        if (t1) {
            if (t2) {
                if (t3) {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 0;
                            } else {
                                return 60;
                            }
                        } else {
                            if (t6) {
                                return 56;
                            } else {
                                return 52;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 48;
                            } else {
                                return 44;
                            }
                        } else {
                            if (t6) {
                                return 40;
                            } else {
                                return 36;
                            }
                        }
                    }
                } else {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 62;
                            } else {
                                return 58;
                            }
                        } else {
                            if (t6) {
                                return 54;
                            } else {
                                return 50;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 46;
                            } else {
                                return 42;
                            }
                        } else {
                            if (t6) {
                                return 38;
                            } else {
                                return 34;
                            }
                        }
                    }
                }
            } else {
                if (t3) {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 63;
                            } else {
                                return 59;
                            }
                        } else {
                            if (t6) {
                                return 55;
                            } else {
                                return 51;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 47;
                            } else {
                                return 43;
                            }
                        } else {
                            if (t6) {
                                return 39;
                            } else {
                                return 35;
                            }
                        }
                    }
                } else {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 61;
                            } else {
                                return 57;
                            }
                        } else {
                            if (t6) {
                                return 53;
                            } else {
                                return 49;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 45;
                            } else {
                                return 41;
                            }
                        } else {
                            if (t6) {
                                return 37;
                            } else {
                                return 33;
                            }
                        }
                    }
                }
            }

        } else {//t1
            if (t2) {
                if (t3) {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 32;
                            } else {
                                return 28;
                            }
                        } else {
                            if (t6) {
                                return 24;
                            } else {
                                return 20;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 16;
                            } else {
                                return 12;
                            }
                        } else {
                            if (t6) {
                                return 8;
                            } else {
                                return 4;
                            }
                        }
                    }
                } else {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 30;
                            } else {
                                return 26;
                            }
                        } else {
                            if (t6) {
                                return 22;
                            } else {
                                return 18;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 14;
                            } else {
                                return 10;
                            }
                        } else {
                            if (t6) {
                                return 6;
                            } else {
                                return 2;
                            }
                        }
                    }
                }
            } else {
                if (t3) {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 31;
                            } else {
                                return 27;
                            }
                        } else {
                            if (t6) {
                                return 23;
                            } else {
                                return 19;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 15;
                            } else {
                                return 11;
                            }
                        } else {
                            if (t6) {
                                return 7;
                            } else {
                                return 3;
                            }
                        }
                    }
                } else {
                    if (t4) {
                        if (t5) {
                            if (t6) {
                                return 29;
                            } else {
                                return 25;
                            }
                        } else {
                            if (t6) {
                                return 21;
                            } else {
                                return 17;
                            }
                        }
                    } else {
                        if (t5) {
                            if (t6) {
                                return 13;
                            } else {
                                return 9;
                            }
                        } else {
                            if (t6) {
                                return 5;
                            } else {
                                return 1;
                            }
                        }
                    }
                }
            }
        }
    }
相关代码

 

posted on 2021-01-03 09:24  黑狱  阅读(198)  评论(1编辑  收藏  举报