From e50b801a4742d224496c702784654f7e47966402 Mon Sep 17 00:00:00 2001 From: Regalis Date: Fri, 7 Oct 2016 17:06:26 +0300 Subject: [PATCH] Separate draw/update methods for editingHUD & resizing --- Subsurface/Source/Items/Item.cs | 34 ++++----- Subsurface/Source/Map/LinkedSubmarine.cs | 14 ++-- Subsurface/Source/Map/MapEntity.cs | 84 +++++++++++++++------- Subsurface/Source/Screens/EditMapScreen.cs | 8 ++- Subsurface/Source/Screens/GameScreen.cs | 4 +- 5 files changed, 89 insertions(+), 55 deletions(-) diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 5499f6d72..9b4ffe5b7 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -918,16 +918,17 @@ namespace Barotrauma } } - public override void DrawEditing(SpriteBatch spriteBatch, Camera cam) + public override void UpdateEditing(Camera cam) { - if (editingHUD==null || editingHUD.UserData as Item != this) + if (editingHUD == null || editingHUD.UserData as Item != this) { - editingHUD = CreateEditingHUD(); + editingHUD = CreateEditingHUD(Screen.Selected != GameMain.EditMapScreen); } - editingHUD.Draw(spriteBatch); editingHUD.Update((float)Timing.Step); + if (Screen.Selected != GameMain.EditMapScreen) return; + if (!prefab.IsLinkable) return; if (!PlayerInput.LeftButtonClicked() || !PlayerInput.KeyDown(Keys.Space)) return; @@ -945,20 +946,11 @@ namespace Barotrauma } } - public void DrawInGameEditing(SpriteBatch spriteBatch) + public override void DrawEditing(SpriteBatch spriteBatch, Camera cam) { - if (editingHUD == null || editingHUD.UserData as Item != this) - { - editingHUD = CreateEditingHUD(true); - } - - if (editingHUD.Rect.Height > 60) - { - editingHUD.Update((float)Timing.Step); - editingHUD.Draw(spriteBatch); - } + if (editingHUD != null) editingHUD.Draw(spriteBatch); } - + private GUIComponent CreateEditingHUD(bool inGame=false) { int width = 450; @@ -1063,7 +1055,7 @@ namespace Barotrauma return editingHUD; } - public virtual void DrawHUD(SpriteBatch spriteBatch, Character character) + public virtual void DrawHUD(SpriteBatch spriteBatch, Camera cam, Character character) { if (condition <= 0.0f) { @@ -1073,7 +1065,7 @@ namespace Barotrauma if (HasInGameEditableProperties) { - DrawInGameEditing(spriteBatch); + DrawEditing(spriteBatch, cam); } foreach (ItemComponent ic in components) @@ -1082,7 +1074,7 @@ namespace Barotrauma } } - public virtual void UpdateHUD(Character character) + public virtual void UpdateHUD(Camera cam, Character character) { if (condition <= 0.0f) { @@ -1090,6 +1082,10 @@ namespace Barotrauma return; } + if (HasInGameEditableProperties) + { + UpdateEditing(cam); + } foreach (ItemComponent ic in components) { diff --git a/Subsurface/Source/Map/LinkedSubmarine.cs b/Subsurface/Source/Map/LinkedSubmarine.cs index ba292d6fe..9d12f7c78 100644 --- a/Subsurface/Source/Map/LinkedSubmarine.cs +++ b/Subsurface/Source/Map/LinkedSubmarine.cs @@ -149,16 +149,15 @@ namespace Barotrauma } } - public override void DrawEditing(SpriteBatch spriteBatch, Camera cam) + public override void UpdateEditing(Camera cam) { if (editingHUD == null || editingHUD.UserData as LinkedSubmarine != this) { editingHUD = CreateEditingHUD(); } - editingHUD.Update(0.016f); - editingHUD.Draw(spriteBatch); - + editingHUD.Update((float)Timing.Step); + if (!PlayerInput.LeftButtonClicked() || !PlayerInput.KeyDown(Keys.Space)) return; Vector2 position = cam.ScreenToWorld(PlayerInput.MousePosition); @@ -178,6 +177,13 @@ namespace Barotrauma } } + public override void DrawEditing(SpriteBatch spriteBatch, Camera cam) + { + if (editingHUD == null) return; + + editingHUD.Draw(spriteBatch); + } + private GUIComponent CreateEditingHUD(bool inGame = false) { diff --git a/Subsurface/Source/Map/MapEntity.cs b/Subsurface/Source/Map/MapEntity.cs index 0ea125f47..4a614542e 100644 --- a/Subsurface/Source/Map/MapEntity.cs +++ b/Subsurface/Source/Map/MapEntity.cs @@ -15,7 +15,7 @@ namespace Barotrauma public static List mapEntityList = new List(); //which entities have been selected for editing - protected static List selectedList = new List(); + public static List selectedList = new List(); protected static GUIComponent editingHUD; @@ -54,7 +54,7 @@ namespace Barotrauma } } } - + public static bool SelectedAny { get { return selectedList.Count > 0; } @@ -463,18 +463,15 @@ namespace Barotrauma } } - /// - /// Call DrawEditing() if only one entity is selected - /// - public static void Edit(SpriteBatch spriteBatch, Camera cam) + public static void UpdateEditor(Camera cam) { if (selectedList.Count == 1) { - selectedList[0].DrawEditing(spriteBatch, cam); + selectedList[0].UpdateEditing(cam); if (selectedList[0].ResizeHorizontal || selectedList[0].ResizeVertical) { - selectedList[0].DrawResizing(spriteBatch, cam); + selectedList[0].UpdateResizing(cam); } } else @@ -493,6 +490,19 @@ namespace Barotrauma } } + public static void DrawEditor(SpriteBatch spriteBatch, Camera cam) + { + if (selectedList.Count == 1) + { + selectedList[0].DrawEditing(spriteBatch, cam); + + if (selectedList[0].ResizeHorizontal || selectedList[0].ResizeVertical) + { + selectedList[0].DrawResizing(spriteBatch, cam); + } + } + } + public static void DeselectAll() { foreach (MapEntity e in selectedList) @@ -524,10 +534,12 @@ namespace Barotrauma Move(-relative * 2.0f); } - + + public virtual void UpdateEditing(Camera cam) { } + public virtual void DrawEditing(SpriteBatch spriteBatch, Camera cam) {} - private void DrawResizing(SpriteBatch spriteBatch, Camera cam) + private void UpdateResizing(Camera cam) { isHighlighted = true; @@ -538,50 +550,43 @@ namespace Barotrauma { for (int y = StartY; y < 2; y += 2) { - Vector2 handlePos = cam.WorldToScreen(Position + new Vector2(x * (rect.Width * 0.5f + 5), y * (rect.Height * 0.5f + 5))); - bool highlighted = Vector2.Distance(PlayerInput.MousePosition, handlePos)<5.0f; + bool highlighted = Vector2.Distance(PlayerInput.MousePosition, handlePos) < 5.0f; - GUI.DrawRectangle(spriteBatch, handlePos - new Vector2(3.0f, 3.0f), new Vector2(6.0f, 6.0f), Color.White * (highlighted ? 1.0f : 0.6f), true,0, (int)Math.Max(1.5f / GameScreen.Selected.Cam.Zoom, 1.0f)); - - if (highlighted) + if (highlighted && PlayerInput.LeftButtonDown()) { - if (PlayerInput.LeftButtonDown()) - { - selectionPos = Vector2.Zero; - resizeDirX = x; - resizeDirY = y; - resizing = true; - } + selectionPos = Vector2.Zero; + resizeDirX = x; + resizeDirY = y; + resizing = true; } } } if (resizing) { - Vector2 placePosition = new Vector2(rect.X, rect.Y); Vector2 placeSize = new Vector2(rect.Width, rect.Height); Vector2 mousePos = Submarine.MouseToWorldGrid(cam, Submarine.MainSub); - if (resizeDirX >0) + if (resizeDirX > 0) { mousePos.X = Math.Max(mousePos.X, rect.X + Submarine.GridSize.X); placeSize.X = mousePos.X - placePosition.X; } - else if (resizeDirX <0) + else if (resizeDirX < 0) { mousePos.X = Math.Min(mousePos.X, rect.Right - Submarine.GridSize.X); - placeSize.X = (placePosition.X + placeSize.X)-mousePos.X; + placeSize.X = (placePosition.X + placeSize.X) - mousePos.X; placePosition.X = mousePos.X; } if (resizeDirY < 0) { mousePos.Y = Math.Min(mousePos.Y, rect.Y - Submarine.GridSize.Y); - placeSize.Y = placePosition.Y-mousePos.Y; + placeSize.Y = placePosition.Y - mousePos.Y; } else if (resizeDirY > 0) { @@ -603,6 +608,31 @@ namespace Barotrauma } } + private void DrawResizing(SpriteBatch spriteBatch, Camera cam) + { + isHighlighted = true; + + int startX = ResizeHorizontal ? -1 : 0; + int StartY = ResizeVertical ? -1 : 0; + + for (int x = startX; x < 2; x += 2) + { + for (int y = StartY; y < 2; y += 2) + { + Vector2 handlePos = cam.WorldToScreen(Position + new Vector2(x * (rect.Width * 0.5f + 5), y * (rect.Height * 0.5f + 5))); + + bool highlighted = Vector2.Distance(PlayerInput.MousePosition, handlePos)<5.0f; + + GUI.DrawRectangle(spriteBatch, + handlePos - new Vector2(3.0f, 3.0f), + new Vector2(6.0f, 6.0f), + Color.White * (highlighted ? 1.0f : 0.6f), + true, 0, + (int)Math.Max(1.5f / GameScreen.Selected.Cam.Zoom, 1.0f)); + } + } + } + public static List FindMapEntities(Vector2 pos) { List foundEntities = new List(); diff --git a/Subsurface/Source/Screens/EditMapScreen.cs b/Subsurface/Source/Screens/EditMapScreen.cs index 548b6ab20..989eabd5c 100644 --- a/Subsurface/Source/Screens/EditMapScreen.cs +++ b/Subsurface/Source/Screens/EditMapScreen.cs @@ -891,6 +891,8 @@ namespace Barotrauma if (!characterMode && !wiringMode) { if (MapEntityPrefab.Selected != null) MapEntityPrefab.Selected.UpdatePlacing(cam); + + MapEntity.UpdateEditor(cam); } if ((characterMode || wiringMode) && dummyCharacter != null) @@ -914,7 +916,7 @@ namespace Barotrauma { if (dummyCharacter.SelectedConstruction != null) { - dummyCharacter.SelectedConstruction.UpdateHUD(dummyCharacter); + dummyCharacter.SelectedConstruction.UpdateHUD(cam, dummyCharacter); } if (PlayerInput.KeyHit(InputType.Select) && dummyCharacter.ClosestItem != dummyCharacter.SelectedConstruction) dummyCharacter.SelectedConstruction = null; @@ -971,7 +973,7 @@ namespace Barotrauma { if (dummyCharacter.SelectedConstruction != null) { - dummyCharacter.SelectedConstruction.DrawHUD(spriteBatch, dummyCharacter); + dummyCharacter.SelectedConstruction.DrawHUD(spriteBatch, cam, dummyCharacter); } dummyCharacter.DrawHUD(spriteBatch, cam); @@ -993,7 +995,7 @@ namespace Barotrauma GUItabs[selectedTab].Draw(spriteBatch); } - MapEntity.Edit(spriteBatch, cam); + MapEntity.DrawEditor(spriteBatch, cam); } if (tutorial != null) tutorial.Draw(spriteBatch); diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index 2852bed83..b03e8afe2 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -113,7 +113,7 @@ namespace Barotrauma { if (Character.Controlled.SelectedConstruction == Character.Controlled.ClosestItem) { - Character.Controlled.SelectedConstruction.UpdateHUD(Character.Controlled); + Character.Controlled.SelectedConstruction.UpdateHUD(cam, Character.Controlled); } } Character.UpdateAll(cam, (float)deltaTime); @@ -181,7 +181,7 @@ namespace Barotrauma { if (Character.Controlled.SelectedConstruction == Character.Controlled.ClosestItem) { - Character.Controlled.SelectedConstruction.DrawHUD(spriteBatch, Character.Controlled); + Character.Controlled.SelectedConstruction.DrawHUD(spriteBatch, cam, Character.Controlled); } else if (!Character.Controlled.SelectedConstruction.IsInPickRange(Character.Controlled.WorldPosition)) {