void OnMouseUp() { lineRenderer.enabled = false; if (GeneralManager.generalManager.turns > 0) { dragging = false; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, 9)) { FloorControl f = hit.transform.GetComponent <FloorControl>(); if (f != null && f.allowMovement) { transform.position = hit.transform.position; f.occupied = true; savedFloor.occupied = false; floorManagement.PutFloorsToRed(); GeneralManager.generalManager.Turns--; } else { transform.position = originalPosition; floorManagement.PutFloorsToRed(); } } else { transform.position = originalPosition; } }
void BonusFloorGenerate() { // 清除所有任務設定 if (!manager.isBattle) { for (int i = 0; i < mMissionImage.Length; i++) { mMissionImage[i].enabled = false; } for (int i = 0; i < mMissionText.Length; i++) { mMissionText[i].text = ""; } mMissionPuzzleImage.enabled = false; missions.Clear(); } // 動態生成獎勵地板 mFloorInstance [mUnuseFloorIndex] = Instantiate(mBonusFloor) as GameObject; // 調整獎勵地板的Y軸座標 mFloorInstance [mUnuseFloorIndex].transform.position = new Vector3(mFloorInstance [mUnuseFloorIndex].transform.position.x, mBonusFloor.transform.position.y - mCountOfFloor * mHeight, mFloorInstance [mUnuseFloorIndex].transform.position.z); floorControl = mFloorInstance [mUnuseFloorIndex].GetComponent <FloorControl>(); floorControl.setBonusItems(new GameObject[] { mItemDiamond, mItemDiamondBig }); // 更新參數 mCountOfFloor++; mUnuseFloorIndex = (mUnuseFloorIndex == 0) ? 1 : 0; mPrevFloorIndex = mCurrFloorIndex; }
private void RemoveFloor(FloorControl floorControl) { ProjectPlanViewModel vm = DataContext as ProjectPlanViewModel; vm.ProjectFile.FloorPlans.Remove(floorControl.FloorAssignment); grid.Children.Remove(floorControl); vm.SelectedFloorAssignment = null; selectedFloorControl = null; }
private void AddFloors() { ProjectPlanViewModel vm = DataContext as ProjectPlanViewModel; foreach (FloorAssignment floorAssignment in vm.ProjectFile.FloorPlans) { FloorControl floorControl = new FloorControl(floorAssignment, vm.ProjectFile, planOffset); GenerateFloorControl(floorControl); } }
private void GenerateFloorControl(FloorControl floorControl) { floorControl.Tag = tagIndex; tagIndex++; floorControl.MouseLeftButtonDown += FloorControl_MouseLeftButtonDown; Canvas.SetLeft(floorControl, floorControl.FloorAssignment.X); Canvas.SetTop(floorControl, floorControl.FloorAssignment.Y); grid.Children.Add(floorControl); }
private void FloorPlan_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) { if (sender is DataGridRow clickedRow && clickedRow.DataContext is FloorPlan floorPlan) { ProjectPlanViewModel vm = DataContext as ProjectPlanViewModel; FloorControl floorControl = new FloorControl(floorPlan, vm.ProjectFile, planOffset); GenerateFloorControl(floorControl); vm.ProjectFile.FloorPlans.Add(floorControl.FloorAssignment); } }
private void grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (floorControlClicked) { floorControlClicked = false; return; } if (selectedFloorControl != null) { selectedFloorControl.Background = Brushes.Transparent; } ProjectPlanViewModel vm = DataContext as ProjectPlanViewModel; vm.SelectedFloorAssignment = null; selectedFloorControl = null; }
void OnMouseDown() { if (GeneralManager.generalManager.turns > 0) { foreach (FloorControl f in floorManagement.floorControls) { if (f.transform.position == transform.position) { savedFloor = f; break; } } lineRenderer.enabled = true; // turn on the line renderer originalPosition = transform.position; //distance = Vector3.Distance(transform.position, Camera.main.transform.position); dragging = true; } }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FloorControl_Paint(object sender, PaintEventArgs e) { if (SpriteBatch == null) { return; } FloorControl.MakeCurrent(); Display.ClearBuffers(); if (Maze != null) { SpriteBatch.Begin(); //Maze.Draw(SpriteBatch, PreviewLoc); SpriteBatch.End(); } FloorControl.SwapBuffers(); }
private void FloorControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { floorControlClicked = true; ProjectPlanViewModel vm = DataContext as ProjectPlanViewModel; if (selectedFloorControl != null) { selectedFloorControl.Background = Brushes.Transparent; } FloorControl floorControl = sender as FloorControl; FloorAssignment roomAssignment = vm.ProjectFile.FloorPlans.FirstOrDefault(x => x.Control.Tag == floorControl.Tag); vm.SelectedFloorAssignment = roomAssignment; floorControl.Background = new SolidColorBrush(Color.FromArgb(64, 255, 128, 0)); selectedFloorControl = floorControl; selectedFloorControl.Focus(); Keyboard.Focus(selectedFloorControl); vm.SelectedTabIndex = 1; }
void FloorGenerate() { // 清除所有任務設定 if (!manager.isBattle) { for (int i = 0; i < mMissionImage.Length; i++) { mMissionImage[i].enabled = false; } for (int i = 0; i < mMissionText.Length; i++) { mMissionText[i].text = ""; } mMissionPuzzleImage.enabled = false; missions.Clear(); } // 取得下一層地板,不會與上一層相同 mCurrFloorIndex = manager.getNextFloorIdx(mPrevFloorIndex, mFloor.Length); mFloorInstance [mUnuseFloorIndex] = Instantiate(mFloor [mCurrFloorIndex]) as GameObject; // 調整新地板的Y軸座標 mFloorInstance [mUnuseFloorIndex].transform.position = new Vector3(mFloorInstance [mUnuseFloorIndex].transform.position.x, mFloor [mCurrFloorIndex].transform.position.y - mCountOfFloor * mHeight, mFloorInstance [mUnuseFloorIndex].transform.position.z); floorControl = mFloorInstance [mUnuseFloorIndex].GetComponent <FloorControl>(); if (manager.isBattle) { floorControl.setFixedItems(mItemKey, 1); } else { int num = mCountOfFloor / 2; bool puzzle = false; if (num > 5) { puzzle = (Random.Range(0, 3) == 0?true:false); num = 3; } else if (num > 3) { num = 3; } if (puzzle) { int select = Random.Range(0, missionPuzzleType.Length); string type = missionPuzzleType[select]; missions.Add(new MissionPuzzle(type, mMissionPuzzleImage, missionPuzzleMap[type])); mMissionPuzzleImage.enabled = true; floorControl.setFixedItems(itemMap[type], missionPuzzleMap[type].Length - 1); } else { HashSet <string> tmp = new HashSet <string>(); for (int i = 0; i < num; i++) { int select = Random.Range(0, missionSet.Count); while (tmp.Contains(missionSet[select])) { select = Random.Range(0, missionSet.Count); } tmp.Add(missionSet[select]); string type = missionSet[select]; if (missionItemMap.ContainsKey(type)) { int need = Random.Range(1, 3); missions.Add(new MissionItem(type, need, mMissionText[i])); mMissionImage[i].enabled = true; mMissionImage[i].sprite = missionItemMap[type]; floorControl.setFixedItems(itemMap[type], need); } else if (missionMoveMap.ContainsKey(type)) { int need = Random.Range(2, 5); missions.Add(new MissionItem(type, need, mMissionText[i])); mMissionImage[i].enabled = true; mMissionImage[i].sprite = missionMoveMap[type]; } } } floorControl.setItems(new GameObject[] { mItmeTime, mItemTimeBig, mItemDiamond, mItemBattery }); } // 更新參數 mCountOfFloor++; mUnuseFloorIndex = (mUnuseFloorIndex == 0) ? 1 : 0; mPrevFloorIndex = mCurrFloorIndex; }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FloorControl_Load(object sender, EventArgs e) { FloorControl.MakeCurrent(); Display.Init(); }
void Update() { FloorControl room = this.rooms[this.start_model_index]; // 最后面的模型到达摄像机后面时,使其往里移动 // if (room.transform.position.z + MODEL_LENGTH < this.main_camera.transform.position.z) { // 使最后的模型往里移动 Vector3 new_position = room.transform.position; new_position.z += MODEL_LENGTH * MODEL_NUM; room.transform.position = new_position; // this.rooms[(this.start_model_index + 0) % MODEL_NUM].attachShouji(null); // 增加“位于最前方的模型的索引” // this.start_model_index = (this.start_model_index + 1) % MODEL_NUM; // 最前面的房间 → 将窗户附加在其上,设置为打开的状态 if (this.scene_control.step.get_current() == SceneControl.STEP.GAME) { this.rooms[(this.start_model_index + 0) % MODEL_NUM].attachShouji(this.shoji_control); this.rooms[(this.start_model_index + 0) % MODEL_NUM].setOpen(); } else { this.shoji_control.gameObject.SetActive(false); } // 第二个房间 → 开始打开拉门 this.rooms[(this.start_model_index + 1) % MODEL_NUM].beginOpen(); // 第三个房间 → 拉门的状态为关闭 this.rooms[(this.start_model_index + 2) % MODEL_NUM].setClose(); // 将多次穿过的格子眼设置为铁板 foreach (var paper_control in this.shoji_control.papers) { if (this.level_control.getChangeSteelCount() > 0) { if (paper_control.through_count >= this.level_control.getChangeSteelCount()) { paper_control.beginSteel(); } } } // this.room_count++; this.is_closed = false; } // 摄像机靠近后,关闭 // // 虽然事实上应该看到玩家,但由于重复处理房间模型时看到摄像机的关系,这里设置为摄像机 float close_distance = MODEL_LENGTH - this.level_control.getCloseDistance(); if (room.transform.position.z + close_distance < this.main_camera.transform.position.z) { do { if (this.is_closed) { break; } // 开始后设置为不关闭 if (this.room_count < 1) { break; } // 关闭窗户 if (this.scene_control.step.get_current() == SceneControl.STEP.GAME) { FloorControl.CLOSING_PATTERN_TYPE type; bool is_flip; FloorControl.ClosingPatternParam param; this.level_control.getClosingPattern(out type, out is_flip, out param); this.rooms[(this.start_model_index + 0) % MODEL_NUM].setClosingPatternType(type, is_flip, param); this.rooms[(this.start_model_index + 0) % MODEL_NUM].beginCloseShoji(); } this.is_closed = true; } while(false); } #if false // 调试功能 // 通过全键盘的数字键,查看窗户出现的模式 for (int i = (int)KeyCode.Alpha1; i <= (int)KeyCode.Alpha9; i++) { if (Input.GetKeyDown((KeyCode)i)) { FloorControl.CLOSING_PATTERN_TYPE type = (FloorControl.CLOSING_PATTERN_TYPE)(i - (int)KeyCode.Alpha1); bool is_flip = Input.GetKey(KeyCode.RightShift); this.rooms[(this.start_model_index + 0) % MODEL_NUM].attachShouji(this.shoji_control); this.rooms[(this.start_model_index + 0) % MODEL_NUM].setClosingPatternType(type, is_flip); this.rooms[(this.start_model_index + 0) % MODEL_NUM].beginCloseShoji(); } } #endif }
void Update() { FloorControl room = this.rooms[this.start_model_index]; // 一番後ろのモデルがカメラの後ろに来たら、奥に移動させる. // if (room.transform.position.z + MODEL_LENGTH < this.main_camera.transform.position.z) { // 一番後ろのモデルを奥に移動させる. Vector3 new_position = room.transform.position; new_position.z += MODEL_LENGTH * MODEL_NUM; room.transform.position = new_position; // this.rooms[(this.start_model_index + 0) % MODEL_NUM].attachShouji(null); // 「一番手前にあるモデルのインデックス」を進める. // this.start_model_index = (this.start_model_index + 1) % MODEL_NUM; // 一番手前の部屋 → 障子をアタッチして、開けた状態にしておく. if (this.scene_control.step.get_current() == SceneControl.STEP.GAME) { this.rooms[(this.start_model_index + 0) % MODEL_NUM].attachShouji(this.shoji_control); this.rooms[(this.start_model_index + 0) % MODEL_NUM].setOpen(); } else { this.shoji_control.gameObject.SetActive(false); } // 二番目の部屋 → ふすまを開き始める. this.rooms[(this.start_model_index + 1) % MODEL_NUM].beginOpen(); // 三番目番目の部屋 → ふすまが閉めきった状態にする. this.rooms[(this.start_model_index + 2) % MODEL_NUM].setClose(); // 何度も通過した穴を鉄板にする. foreach (var paper_control in this.shoji_control.papers) { if (this.level_control.getChangeSteelCount() > 0) { if (paper_control.through_count >= this.level_control.getChangeSteelCount()) { paper_control.beginSteel(); } } } // this.room_count++; this.is_closed = false; } // カメラが近づいたら、閉める. // // 本当はプレイヤーを見るべきだけど、部屋モデルのリピート処理がカメラを. // みている関係上、こちらもカメラを見る. float close_distance = MODEL_LENGTH - this.level_control.getCloseDistance(); if (room.transform.position.z + close_distance < this.main_camera.transform.position.z) { do { if (this.is_closed) { break; } // スタート直後は閉まらないようにする. if (this.room_count < 1) { break; } // 障子を閉める. if (this.scene_control.step.get_current() == SceneControl.STEP.GAME) { FloorControl.CLOSING_PATTERN_TYPE type; bool is_flip; FloorControl.ClosingPatternParam param; this.level_control.getClosingPattern(out type, out is_flip, out param); this.rooms[(this.start_model_index + 0) % MODEL_NUM].setClosingPatternType(type, is_flip, param); this.rooms[(this.start_model_index + 0) % MODEL_NUM].beginCloseShoji(); } this.is_closed = true; } while(false); } #if false // デバッグ機能. // フルキーの数字キーで、障子の登場パターンを再生する. for (int i = (int)KeyCode.Alpha1; i <= (int)KeyCode.Alpha9; i++) { if (Input.GetKeyDown((KeyCode)i)) { FloorControl.CLOSING_PATTERN_TYPE type = (FloorControl.CLOSING_PATTERN_TYPE)(i - (int)KeyCode.Alpha1); bool is_flip = Input.GetKey(KeyCode.RightShift); this.rooms[(this.start_model_index + 0) % MODEL_NUM].attachShouji(this.shoji_control); this.rooms[(this.start_model_index + 0) % MODEL_NUM].setClosingPatternType(type, is_flip); this.rooms[(this.start_model_index + 0) % MODEL_NUM].beginCloseShoji(); } } #endif }
private void SavePlanAsImage(string imagePath) { Canvas canvas = new Canvas() { Width = projectFile.DocumentSize.Width, Height = projectFile.DocumentSize.Height, Background = new DrawingBrush() { TileMode = TileMode.Tile, Viewport = new Rect(1.5, 1.5, 50, 50), Viewbox = new Rect(0, 0, 49, 49), ViewboxUnits = BrushMappingMode.Absolute, ViewportUnits = BrushMappingMode.Absolute, Drawing = new GeometryDrawing() { Geometry = new RectangleGeometry(new Rect(0, 0, 50, 50)), Pen = new Pen(Brushes.Black, 2) { DashStyle = new DashStyle(new List <double>() { 2, 4 }, 0) } } } }; foreach (FloorAssignment floorAssignment in ProjectFile.FloorPlans) { FloorControl floorControl = new FloorControl(floorAssignment, projectFile, 0, false) { BorderThickness = new Thickness(0) }; Canvas.SetLeft(floorControl, floorControl.FloorAssignment.X + 2); Canvas.SetTop(floorControl, floorControl.FloorAssignment.Y + 2); canvas.Children.Add(floorControl); } TextBlock dungeonTitle = new TextBlock() { Text = projectFile.Name, FontSize = 64, Padding = new Thickness(8), Width = canvas.Width, TextAlignment = TextAlignment.Center, Foreground = Brushes.Black, FontFamily = new FontFamily(new Uri("pack://application:,,,/DungeonMapEditor;component/Resources/Fonts/"), "./#Ace Records") }; canvas.Children.Add(dungeonTitle); TextBlock footNote = new TextBlock() { Text = "1 tile = 5 ft.", Foreground = Brushes.Black, FontSize = 32, Background = Brushes.White, Padding = new Thickness(8, 4, 8, 4) }; Canvas.SetBottom(footNote, 0); canvas.Children.Add(footNote); Helper.ExportToPng(imagePath, canvas, Brushes.White); }