//设置地图块对象单元 public static void configElement(Form_Main form_mainT, TileObjectElement elementT, String title) { form_main = form_mainT; if (elementT == null) { Console.WriteLine("error in configElement"); return; } element = elementT; SmallDialog_ConfigMapObj dialog = new SmallDialog_ConfigMapObj(title); element.keyValueManager.MNodeUI = dialog; dialog.showParamsList(); dialog.ShowDialog(); }
private void SmallDialog_MapEventObjConfig_FormClosing(object sender, FormClosingEventArgs e) { element.keyValueManager.MNodeUI = null; form_main = null; element = null; }
//按钮事件响应 private void button_OK_Click(object sender, EventArgs e) { form_main = null; element = null; this.Close(); }
//矩形填充(参数为索引坐标) public bool fillRect(int bufW, int bufH, float zoomLevel, int x1, int y1, int x2, int y2, short level, Object element) { if (currentMap == null) { return false; } this.inRemTileEdit = true; this.fillPointsCmd = new FillRandomPointsCommand(currentMap); int xMin = Math.Min(x1, x2); int yMin = Math.Min(y1, y2); int xMax = Math.Max(x1, x2); int yMax = Math.Max(y1, y2); xMin = MathUtil.limitNumber(xMin, 0, currentMap.getMapW() - 1); xMax = MathUtil.limitNumber(xMax, 0, currentMap.getMapW() - 1); yMin = MathUtil.limitNumber(yMin, 0, currentMap.getMapH() - 1); yMax = MathUtil.limitNumber(yMax, 0, currentMap.getMapH() - 1); bool changed = false; for (int i = xMin; i <= xMax; i++) { for (int j = yMin; j <= yMax; j++) { Object elementT = element; if (elementT is Antetype) { TileObjectElement obj = new TileObjectElement(currentMap.getTile(i, j)); obj.antetype = (Antetype)elementT; elementT = obj; } bool changedOnce = false; if (!TSB_autoTile.Checked) { changedOnce = fillPoint(currentMap, bufW, bufH, zoomLevel, i, j, level, elementT, true, currentStageID); } else { changedOnce = fillPointWithAutoTile(currentMap, bufW, bufH, zoomLevel, i, j, level, true, currentStageID, element == null); } if (changedOnce) { changed = true; } } } this.m_HistoryManager.AddUndoCommand(fillPointsCmd,this); this.inRemTileEdit = false; return changed; }
//线填充地图 public bool fillLine(int bufW, int bufH, float zoomLevel, int x1, int y1, int x2, int y2, short level, Object element) { if (currentMap == null) { return false; } if (x1 == x2 && y1 == y2) { return false; } bool changed = false; bool currentChanged = false; int x = x1; int y = y1; int zoomW = (int)(zoomTileW); if (zoomW < 1) { zoomW = 1; } int zoomH = (int)(zoomTileH); if (zoomH < 1) { zoomH = 1; } canAutoTile(); //Console.WriteLine("fillLine_Phy:" + x1 + "," + y1 +"|"+ x2 + "," + y2); if (Math.Abs(x1 - x2) > Math.Abs(y1 - y2))//偏横向 { int dir = (x2 - x1) / Math.Abs(x1 - x2); int step = (int)(zoomW); int distance = (int)Math.Sqrt((y1 - y2) * (y1 - y2) + (x1 - x2) * (x1 - x2)); if (distance < step) { step = distance; } step *= dir; while (x1 < x2 ? x < x2 : x >= x2) { x += step; y = y1 + (x - x1) * (y2 - y1) / (x2 - x1); Object elementT = element; if (elementT is Antetype) { TileObjectElement obj = new TileObjectElement(currentMap.getTile(x / zoomW, y / zoomH)); obj.antetype = (Antetype)elementT; elementT = obj; } if (TSB_autoTile.Checked) { currentChanged = fillPointWithAutoTile(currentMap, bufW, bufH, zoomLevel, x / zoomW, y / zoomH, level, true, currentStageID, editMode != EDITMOD_PENCIL); } else { currentChanged = fillPoint(currentMap, bufW, bufH, zoomLevel, x / zoomW, y / zoomH, level, elementT, true, currentStageID); } if (!changed) { changed = currentChanged; } } } else { int dir = (y2 - y1) / Math.Abs(y1 - y2); int step = (int)(zoomH); int distance = (int)Math.Sqrt((y1 - y2) * (y1 - y2) + (x1 - x2) * (x1 - x2)); if (distance < step) { step = distance; } step *= dir; while (y1 < y2 ? y < y2 : y >= y2) { y += step; x = x1 + (y - y1) * (x2 - x1) / (y2 - y1); Object elementT = element; if (elementT is Antetype) { TileObjectElement obj = new TileObjectElement(currentMap.getTile(x / zoomW, y / zoomH)); obj.antetype = (Antetype)elementT; elementT = obj; } if (TSB_autoTile.Checked) { currentChanged = fillPointWithAutoTile(currentMap, bufW, bufH, zoomLevel, x / zoomW, y / zoomH, level, true, currentStageID, editMode != EDITMOD_PENCIL); } else { currentChanged = fillPoint(currentMap, bufW, bufH, zoomLevel, x / zoomW, y / zoomH, level, elementT, true, currentStageID); } if (!changed) { changed = currentChanged; } } } return changed; }
//鼠标移动事件 private void pictureBox_Canvas_MouseMove(object sender, MouseEventArgs e) { if ((editMode == EDITMOD_RECT_SELECT || editMode == EDITMOD_STRAW) && e.Button.Equals(MouseButtons.Left)) { this.paintPenRect = false; } else { this.paintPenRect = true; } mouseMoveXInWindow = MathUtil.limitNumber(e.X, 0, mapWindowW); mouseMoveYInWindow = MathUtil.limitNumber(e.Y, 0, mapWindowH); //计算参数 int mouseXImMapOld = mouseXInMap; int mouseYImMapOld = mouseYInMap; mouseXInMap = mouseMoveXInWindow + cameraX_inMap; mouseYInMap = mouseMoveYInWindow + cameraY_inMap; if (this.currentMap == null) { return; } //鼠标拖动抬起时------------------------------------------(剪贴板) if (e.Button.Equals(MouseButtons.None)) { int xPEN_T = mouseMoveXInWindow - ((mouseMoveXInWindow + cameraX_inMap) % zoomTileW); int yPEN_T = mouseMoveYInWindow - ((mouseMoveYInWindow + cameraY_inMap) % zoomTileH); if (xPEN_T != xPEN || yPEN != yPEN_T) { this.showFunction("当前方格坐标:" + "(" + mouseXInMap / zoomTileW + "," + mouseYInMap / zoomTileH + ")"); MapTileElement tile = currentMap.getTile(mouseXInMap / zoomTileW, mouseYInMap / zoomTileH); if (tile != null) { if (Consts.currentLevel == Consts.LEVEL_TILE_OBJ) { currentActiveObj = tile.tile_object_bg; } else if (Consts.currentLevel == Consts.LEVEL_OBJ_MASK) { currentActiveObj = tile.tile_object_mask; } else if (Consts.currentLevel == Consts.LEVEL_OBJ_TRIGEER) { currentActiveObj = tile.tile_objectList[currentStageID]; } else { currentActiveObj = null; } } this.updateMap(); } return; } //鼠标按下后拖动------------------------------------------(绘图、框选和擦除) if (!e.Button.Equals(MouseButtons.Left)) { return; } if (currentMap == null) { MessageBox.Show("请先在“地图列表”中创建地图"); return; } //Console.WriteLine("move:"+e.X+","+e.Y); Object currentFocusElement = getCurrentFocusElement(); //执行操作 switch (this.editMode) { case EDITMOD_PENCIL://铅笔模式 if (currentFocusElement != null) { fillLine(mapBufferW, mapBufferH, zoomLevel, mouseXImMapOld, mouseYImMapOld, mouseXInMap, mouseYInMap, Consts.currentLevel, currentFocusElement); updateMap(); } break; case EDITMOD_RECT_SELECT://框选模式 case EDITMOD_STRAW://吸管模式 if (countRectSelect()) { updateMap(); } break; case EDITMOD_ERASER://橡皮模式 fillLine(mapBufferW, mapBufferH, zoomLevel, mouseXImMapOld, mouseYImMapOld, mouseXInMap, mouseYInMap, Consts.currentLevel, null); updateMap(); break; } }
//鼠标按下事件 private void pictureBox_Canvas_MouseDown(object sender, MouseEventArgs e) { mouseDownXInWindow = MathUtil.limitNumber(e.X, 0, mapWindowW - 1); mouseDownYInWindow = MathUtil.limitNumber(e.Y, 0, mapWindowH - 1); mouseMoveXInWindow = mouseDownXInWindow; mouseMoveYInWindow = mouseDownYInWindow; if (!e.Button.Equals(MouseButtons.Left)) { if (e.Button.Equals(MouseButtons.Right)) { inPasting = false; if (currentActiveObj != null && currentActiveObj.antetype!=null) { SmallDialog_ConfigMapObj.configElement(this, currentActiveObj, "对象参数设置"); currentActiveObj = null; this.kss_refreshUI(currentMap, currentStageID); } this.updateMap(); } return; } if (currentMap == null) { MessageBox.Show("当前没有选中的地图,请先在“地图列表”中创建或选择"); return; } //风格限定 if (Consts.currentLevel == Consts.LEVEL_TILE_BG || Consts.currentLevel == Consts.LEVEL_TILE_SUR) { if (!currentMap.tileGfxContainer.Equals(currentGfxContainer)) { MessageBox.Show("当前的地图风格不是“" + currentGfxContainer.name + "”"); return; } } //粘贴剪贴板中的内容 if (this.inPasting) { int destX = (xPEN + cameraX_inMap) / zoomTileW; int destY = (yPEN + cameraY_inMap) / zoomTileH; this.pasteRectFinished(destX, destY); this.updateMap(); return; } //鼠标按下------------------------------------------(绘图、框选和擦除) //计算参数 //Console.WriteLine("down:"+e.X + "," + e.Y); mouseXInMap = e.X + cameraX_inMap; mouseYInMap = e.Y + cameraY_inMap; Object currentFocusElement = getCurrentFocusElement(); //执行操作 switch (this.editMode) { case EDITMOD_PENCIL://铅笔模式 if (currentFocusElement != null) { if (currentFocusElement is Antetype) { TileObjectElement obj = new TileObjectElement(currentMap.getTile(mouseXInMap / zoomTileW, mouseYInMap / zoomTileH)); obj.antetype = (Antetype)currentFocusElement; currentFocusElement = obj; } inRemTileEdit = true; fillPointsCmd = new FillRandomPointsCommand(currentMap); canAutoTile(); if (TSB_autoTile.Checked) { fillPointWithAutoTile(currentMap, mapBufferW, mapBufferH, zoomLevel, mouseXInMap / zoomTileW, mouseYInMap / zoomTileH, Consts.currentLevel, true, currentStageID,false); } else { fillPoint(currentMap, mapBufferW, mapBufferH, zoomLevel, mouseXInMap / zoomTileW, mouseYInMap / zoomTileH, Consts.currentLevel, currentFocusElement, true, currentStageID); } } break; case EDITMOD_RECT_SELECT://框选模式 case EDITMOD_STRAW://吸管模式 countRectSelect(); break; case EDITMOD_ERASER://橡皮模式 inRemTileEdit = true; fillPointsCmd = new FillRandomPointsCommand(currentMap); canAutoTile(); if (TSB_autoTile.Checked) { fillPointWithAutoTile(currentMap, mapBufferW, mapBufferH, zoomLevel, mouseXInMap / zoomTileW, mouseYInMap / zoomTileH, Consts.currentLevel, true, currentStageID, true); } else { fillPoint(currentMap, mapBufferW, mapBufferH, zoomLevel, mouseXInMap / zoomTileW, mouseYInMap / zoomTileH, Consts.currentLevel, null, true, currentStageID); } break; } this.updateMap(); }