//指定的地图方格填充一个指定自动地形编号的图形单元,这个编号是相对于当前的自动地形起始方格的。 private void setAutoTile(MapElement currentMap, int bufW, int bufH, float zoomLevel, short level, bool drawInBuffer, int currentStageID, int idx, int idy, int idTile) { Object oldElement = currentMap.getTile(idx, idy, level, currentStageID); Object element = getGfxTileByAutoID(idTile); currentMap.fillPoint(gMapBuffer, bufW, bufH, zoomLevel, idx, idy, level, element, drawInBuffer, currentStageID); Object newElement = currentMap.getTile(idx, idy, level, currentStageID); FillPointHistory pointCmd = new FillPointHistory(currentMap, oldElement, newElement, idx, idy, level, currentStageID); fillPointsCmd.addPoint(pointCmd); }
//点填充地图 public bool fillPoint(MapElement currentMap, int bufW, int bufH, float zoomLevel, int indexX, int indexY, short level, Object element, bool drawInBuffer, int currentStageID) { if (currentMap == null) { return false; } //对于对象层的填充 Graphics g = null; if (level >= Consts.LEVEL_TILE_OBJ) { g = gMapBuffer_Obj; } else { g = gMapBuffer; } //历史记录 bool changed = false; if (inRemTileEdit) { if (fillPointsCmd != null) { Object oldElement = currentMap.getTile(indexX, indexY, level, currentStageID); changed = currentMap.fillPoint(g, bufW, bufH, zoomLevel, indexX, indexY, level, element, drawInBuffer, currentStageID); Object newElement = currentMap.getTile(indexX, indexY, level, currentStageID); FillPointHistory pointCmd = new FillPointHistory(currentMap,oldElement, newElement, indexX, indexY, level,currentStageID); fillPointsCmd.addPoint(pointCmd); //Console.WriteLine(indexX + "," + indexY); } } else { changed = currentMap.fillPoint(g, bufW, bufH, zoomLevel, indexX, indexY, level, element, drawInBuffer, currentStageID); } return changed; }
//使用自动地形填充地图 public bool fillPointWithAutoTile(MapElement currentMap, int bufW, int bufH, float zoomLevel, int indexX, int indexY, short level, bool drawInBuffer, int currentStageID,bool blank) { //历史记录 bool changed = false; if (fillPointsCmd != null) { updateVectorEnviroment(indexX, indexY, blank); //得到双倍方格左上角和状态表矢量影响区在地图中对应左上角 int x = indexX; int y = indexY; int xCLT = x - x % 2; int yCLT = y - y % 2; x = xCLT - 2; y = yCLT - 2; for (int iy = 0; iy < 6; iy++) { for (int ix = 0; ix < 6; ix++) { int idx = x + ix; int idy = y + iy; if (idx < 0 || idx >= currentMap.getMapW() || idy < 0 || idy >= currentMap.getMapH()) { continue; } Object oldElement = currentMap.getTile(idx, idy, level, currentStageID); int idTile = getModelID( idx, idy, 1 + ix, 1 + iy); Object element = getGfxTileByAutoID(idTile); bool changedOnce = currentMap.fillPoint(gMapBuffer, bufW, bufH, zoomLevel, idx, idy, level, element, drawInBuffer, currentStageID); Object newElement = currentMap.getTile(idx, idy, level, currentStageID); FillPointHistory pointCmd = new FillPointHistory(currentMap, oldElement, newElement, idx, idy, level, currentStageID); fillPointsCmd.addPoint(pointCmd); if (changedOnce) { changed = true; } } } //再检查内凹角模块 for (int iy = 0; iy < 6; iy++) { for (int ix = 0; ix < 6; ix++) { int idx = x + ix; int idy = y + iy; if (idx < 0 || idx >= currentMap.getMapW() || idy < 0 || idy >= currentMap.getMapH()) { continue; } Object oldElement = currentMap.getTile(idx, idy, level, currentStageID); int idXEn = 1 + ix; int idYEn = 1 + iy; VectorModel model = getVectorInEviroment(idXEn, idYEn); if (model == null) { continue; } if (!model.equalsValue(vZero)) { continue; } bool fillCorner = TSB_fillCorner.Checked; if (isEnviroment(idXEn, idYEn, -1, 0, 0, -1, -1, -1) && ix % 2 == 0 && iy % 2 == 0) { if (!fillCorner) { setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx, idy, 36); } else { setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx, idy, 47); setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx-1, idy, 46); setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx, idy-1, 41); setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx-1, idy-1, 40); } } else if (isEnviroment(idXEn, idYEn, 1, 0, 0, -1, 1, -1) && ix % 2 == 1 && iy % 2 == 0) { if (!fillCorner) { setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx, idy, 37); } else { setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx, idy, 52); setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx + 1, idy, 53); setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx, idy - 1, 50); setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx + 1, idy - 1, 51); } } else if (isEnviroment(idXEn, idYEn, -1, 0, 0, 1, -1, 1) && ix % 2 == 0 && iy % 2 == 1) { if (!fillCorner) { setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx, idy, 42); } else { setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx, idy, 39); setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx -1, idy, 38); setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx-1, idy + 1, 44); setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx, idy + 1, 45); } } else if (isEnviroment(idXEn, idYEn, 1, 0, 0, 1, 1, 1) && ix % 2 == 1 && iy % 2 == 1) { if (!fillCorner) { setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx, idy, 43); } else { setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx, idy, 48); setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx + 1, idy, 49); setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx + 1, idy + 1, 55); setAutoTile(currentMap, bufW, bufH, zoomLevel, level, drawInBuffer, currentStageID, idx, idy + 1, 54); } } else { continue; } changed = true; } } } return changed; }