From 3bcfa82fadb4b9722b492ecc2c311a3eb8235cb6 Mon Sep 17 00:00:00 2001 From: Michele Date: Wed, 3 Feb 2021 17:35:38 +0000 Subject: [PATCH 01/12] Allow two walls on same node --- Sledgemapper.Shared/Entities/Wall.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Sledgemapper.Shared/Entities/Wall.cs b/Sledgemapper.Shared/Entities/Wall.cs index 9f671a3..106fdbb 100644 --- a/Sledgemapper.Shared/Entities/Wall.cs +++ b/Sledgemapper.Shared/Entities/Wall.cs @@ -1,11 +1,10 @@ namespace Sledgemapper.Shared.Entities { - - - public class Wall :BaseMapEntity + public class Wall : BaseMapEntity { - - - + public override string ToString() + { + return $"{X}_{Y}_{Rotation}"; + } } } From 4e6f8195e733996f10bd4d5cfe4824697df20504 Mon Sep 17 00:00:00 2001 From: Michele Date: Wed, 3 Feb 2021 21:45:51 +0000 Subject: [PATCH 02/12] Highlight selected toolbar button --- Sledgemapper/Sledgemapper.cs | 22 ++++++-- Sledgemapper/UI/MainWidget.Custom.cs | 9 +++ Sledgemapper/UI/MainWidget.Generated.cs | 75 ++++++++++--------------- Sledgemapper/UI/mainwidget.xml | 10 ++-- 4 files changed, 62 insertions(+), 54 deletions(-) diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 70b5772..4dfbe2a 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -191,12 +191,8 @@ namespace Sledgemapper _mainWidget.MenuConnectUpload.Enabled = false; _mainWidget.BtnToolbarLine.Click += OnBtnToolbarLinClicked; _mainWidget.BtnToolbarRoom.Click += OnBtnToolbarRoomClicked; - _mainWidget.BtnToolbarTile.Click += OnBtnToolbarTileClicked; - _mainWidget.BtnToolbarWall.Click += OnBtnToolbarWallClicked; _mainWidget.BtnToolbarDelete.Click += OnBtnToolbarDeleteClicked; - _mainWidget.BtnToolbarTile.Visible = false; - _mainWidget.BtnToolbarWall.Visible = false; _wallsContent = Content.LoadContentFolder("walls"); _spriteSheet = new SpriteSheet(); @@ -221,30 +217,48 @@ namespace Sledgemapper _whiteRectangle.SetData(new[] { Color.White }); } + + private void OnBtnToolbarDeleteClicked(object sender, EventArgs e) { _state.InsertMode = InsertMode.NewDelete; + + _mainWidget.ClearSelection(); + ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); + ((ImageTextButton)sender).BorderThickness = new Myra.Graphics2D.Thickness(2); } private void OnBtnToolbarWallClicked(object sender, EventArgs e) { _state.InsertMode = InsertMode.NewWall; + _mainWidget.ClearSelection(); + ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); + ((ImageTextButton)sender).BorderThickness = new Myra.Graphics2D.Thickness(2); } private void OnBtnToolbarTileClicked(object sender, EventArgs e) { _state.InsertMode = InsertMode.NewTile; + _mainWidget.ClearSelection(); + ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); + ((ImageTextButton)sender).BorderThickness = new Myra.Graphics2D.Thickness(2); } private void OnBtnToolbarRoomClicked(object sender, EventArgs e) { _state.InsertMode = InsertMode.NewRoom; + _mainWidget.ClearSelection(); + ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); + ((ImageTextButton)sender).BorderThickness = new Myra.Graphics2D.Thickness(2); } private void OnBtnToolbarLinClicked(object sender, EventArgs e) { _state.InsertMode = InsertMode.NewLine; + _mainWidget.ClearSelection(); + ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); + ((ImageTextButton)sender).BorderThickness = new Myra.Graphics2D.Thickness(2); } private void OneMenuFileSettingsSelected(object sender, EventArgs e) diff --git a/Sledgemapper/UI/MainWidget.Custom.cs b/Sledgemapper/UI/MainWidget.Custom.cs index 34cb9fb..1067a3a 100644 --- a/Sledgemapper/UI/MainWidget.Custom.cs +++ b/Sledgemapper/UI/MainWidget.Custom.cs @@ -8,9 +8,18 @@ namespace Sledgemapper.UI { ClearSelection(GridWalls); ClearSelection(GridOverlays); + ClearSelection(Toolbar); } private void ClearSelection(Grid grid) + { + foreach (var widget in grid.Widgets) + { + widget.Border = null; + } + } + + private void ClearSelection(HorizontalStackPanel grid) { foreach (var widget in grid.Widgets) { diff --git a/Sledgemapper/UI/MainWidget.Generated.cs b/Sledgemapper/UI/MainWidget.Generated.cs index 2f730cd..f7c1c35 100644 --- a/Sledgemapper/UI/MainWidget.Generated.cs +++ b/Sledgemapper/UI/MainWidget.Generated.cs @@ -1,4 +1,4 @@ -/* Generated by MyraPad at 18/01/2021 09:38:43 */ +/* Generated by MyraPad at 03/02/2021 21:43:01 */ using Myra; using Myra.Graphics2D; using Myra.Graphics2D.TextureAtlases; @@ -127,31 +127,19 @@ namespace Sledgemapper.UI _mainMenu.Items.Add(menuItem2); _mainMenu.Items.Add(menuItem3); - BtnToolbarTile = new ImageTextButton(); - BtnToolbarTile.Text = " T"; - BtnToolbarTile.Width = 40; - BtnToolbarTile.Height = 40; - BtnToolbarTile.VerticalAlignment = Myra.Graphics2D.UI.VerticalAlignment.Center; - BtnToolbarTile.Id = "BtnToolbarTile"; - BtnToolbarLine = new ImageTextButton(); BtnToolbarLine.Text = " C"; BtnToolbarLine.Width = 40; BtnToolbarLine.Height = 40; + BtnToolbarLine.BorderThickness = new Thickness(2); BtnToolbarLine.VerticalAlignment = Myra.Graphics2D.UI.VerticalAlignment.Center; BtnToolbarLine.Id = "BtnToolbarLine"; - BtnToolbarWall = new ImageTextButton(); - BtnToolbarWall.Text = " W"; - BtnToolbarWall.Width = 40; - BtnToolbarWall.Height = 40; - BtnToolbarWall.VerticalAlignment = Myra.Graphics2D.UI.VerticalAlignment.Center; - BtnToolbarWall.Id = "BtnToolbarWall"; - BtnToolbarRoom = new ImageTextButton(); BtnToolbarRoom.Text = " R"; BtnToolbarRoom.Width = 40; BtnToolbarRoom.Height = 40; + BtnToolbarRoom.BorderThickness = new Thickness(2); BtnToolbarRoom.VerticalAlignment = Myra.Graphics2D.UI.VerticalAlignment.Center; BtnToolbarRoom.Id = "BtnToolbarRoom"; @@ -159,24 +147,24 @@ namespace Sledgemapper.UI BtnToolbarDelete.Text = " D"; BtnToolbarDelete.Width = 40; BtnToolbarDelete.Height = 40; + BtnToolbarDelete.BorderThickness = new Thickness(2); BtnToolbarDelete.VerticalAlignment = Myra.Graphics2D.UI.VerticalAlignment.Center; BtnToolbarDelete.Id = "BtnToolbarDelete"; - var horizontalStackPanel1 = new HorizontalStackPanel(); - horizontalStackPanel1.Spacing = 5; - horizontalStackPanel1.Proportions.Add(new Proportion + Toolbar = new HorizontalStackPanel(); + Toolbar.Spacing = 12; + Toolbar.Proportions.Add(new Proportion { Type = Myra.Graphics2D.UI.ProportionType.Auto, }); - horizontalStackPanel1.VerticalAlignment = Myra.Graphics2D.UI.VerticalAlignment.Center; - horizontalStackPanel1.Height = 51; - horizontalStackPanel1.Padding = new Thickness(4, 0, 0, 0); - horizontalStackPanel1.Background = new SolidBrush("#404040FF"); - horizontalStackPanel1.Widgets.Add(BtnToolbarTile); - horizontalStackPanel1.Widgets.Add(BtnToolbarLine); - horizontalStackPanel1.Widgets.Add(BtnToolbarWall); - horizontalStackPanel1.Widgets.Add(BtnToolbarRoom); - horizontalStackPanel1.Widgets.Add(BtnToolbarDelete); + Toolbar.VerticalAlignment = Myra.Graphics2D.UI.VerticalAlignment.Center; + Toolbar.Height = 51; + Toolbar.Padding = new Thickness(4, 0, 0, 0); + Toolbar.Background = new SolidBrush("#404040FF"); + Toolbar.Id = "Toolbar"; + Toolbar.Widgets.Add(BtnToolbarLine); + Toolbar.Widgets.Add(BtnToolbarRoom); + Toolbar.Widgets.Add(BtnToolbarDelete); GridWalls = new Grid(); GridWalls.ColumnSpacing = 8; @@ -262,22 +250,22 @@ namespace Sledgemapper.UI lblSessionName.MinWidth = 100; lblSessionName.Id = "lblSessionName"; - var horizontalStackPanel2 = new HorizontalStackPanel(); - horizontalStackPanel2.Spacing = 10; - horizontalStackPanel2.Proportions.Add(new Proportion + var horizontalStackPanel1 = new HorizontalStackPanel(); + horizontalStackPanel1.Spacing = 10; + horizontalStackPanel1.Proportions.Add(new Proportion { Type = Myra.Graphics2D.UI.ProportionType.Auto, }); - horizontalStackPanel2.Height = 25; - horizontalStackPanel2.Background = new SolidBrush("#333333FF"); - horizontalStackPanel2.Widgets.Add(label1); - horizontalStackPanel2.Widgets.Add(lblConnectionStatus); - horizontalStackPanel2.Widgets.Add(verticalSeparator1); - horizontalStackPanel2.Widgets.Add(label2); - horizontalStackPanel2.Widgets.Add(lblUsername); - horizontalStackPanel2.Widgets.Add(verticalSeparator2); - horizontalStackPanel2.Widgets.Add(label3); - horizontalStackPanel2.Widgets.Add(lblSessionName); + horizontalStackPanel1.Height = 25; + horizontalStackPanel1.Background = new SolidBrush("#333333FF"); + horizontalStackPanel1.Widgets.Add(label1); + horizontalStackPanel1.Widgets.Add(lblConnectionStatus); + horizontalStackPanel1.Widgets.Add(verticalSeparator1); + horizontalStackPanel1.Widgets.Add(label2); + horizontalStackPanel1.Widgets.Add(lblUsername); + horizontalStackPanel1.Widgets.Add(verticalSeparator2); + horizontalStackPanel1.Widgets.Add(label3); + horizontalStackPanel1.Widgets.Add(lblSessionName); Proportions.Add(new Proportion @@ -293,9 +281,9 @@ namespace Sledgemapper.UI Type = Myra.Graphics2D.UI.ProportionType.Fill, }); Widgets.Add(_mainMenu); - Widgets.Add(horizontalStackPanel1); + Widgets.Add(Toolbar); Widgets.Add(verticalSplitPane1); - Widgets.Add(horizontalStackPanel2); + Widgets.Add(horizontalStackPanel1); } @@ -314,11 +302,10 @@ namespace Sledgemapper.UI public MenuItem MenuViewCenterOnSelection; public MenuItem MenuHelpAbout; public HorizontalMenu _mainMenu; - public ImageTextButton BtnToolbarTile; public ImageTextButton BtnToolbarLine; - public ImageTextButton BtnToolbarWall; public ImageTextButton BtnToolbarRoom; public ImageTextButton BtnToolbarDelete; + public HorizontalStackPanel Toolbar; public Grid GridWalls; public Grid GridOverlays; public Label lblConnectionStatus; diff --git a/Sledgemapper/UI/mainwidget.xml b/Sledgemapper/UI/mainwidget.xml index 0929de8..69d34c9 100644 --- a/Sledgemapper/UI/mainwidget.xml +++ b/Sledgemapper/UI/mainwidget.xml @@ -32,15 +32,13 @@ - + - - - - - + + + From 0290c61799c5a8eee8fa19111b1eab589374cfdb Mon Sep 17 00:00:00 2001 From: Michele Date: Thu, 4 Feb 2021 09:33:35 +0000 Subject: [PATCH 03/12] new walls --- Assets/walls.svg | 331 ++++++++++++++++++++++++++ Sledgemapper/Content/Content.mgcb | 132 ++++++++++ Sledgemapper/Content/walls/wall01.png | Bin 192 -> 1088 bytes Sledgemapper/Content/walls/wall02.png | Bin 223 -> 1153 bytes Sledgemapper/Content/walls/wall03.png | Bin 178 -> 986 bytes Sledgemapper/Content/walls/wall04.png | Bin 232 -> 1249 bytes Sledgemapper/Content/walls/wall05.png | Bin 339 -> 4859 bytes Sledgemapper/Content/walls/wall06.png | Bin 0 -> 3710 bytes Sledgemapper/Content/walls/wall07.png | Bin 0 -> 1229 bytes Sledgemapper/Content/walls/wall08.png | Bin 0 -> 1219 bytes Sledgemapper/Content/walls/wall09.png | Bin 0 -> 8134 bytes Sledgemapper/Content/walls/wall10.png | Bin 0 -> 1138 bytes Sledgemapper/Content/walls/wall11.png | Bin 0 -> 1195 bytes 13 files changed, 463 insertions(+) create mode 100644 Assets/walls.svg create mode 100644 Sledgemapper/Content/walls/wall06.png create mode 100644 Sledgemapper/Content/walls/wall07.png create mode 100644 Sledgemapper/Content/walls/wall08.png create mode 100644 Sledgemapper/Content/walls/wall09.png create mode 100644 Sledgemapper/Content/walls/wall10.png create mode 100644 Sledgemapper/Content/walls/wall11.png diff --git a/Assets/walls.svg b/Assets/walls.svg new file mode 100644 index 0000000..99a44bd --- /dev/null +++ b/Assets/walls.svg @@ -0,0 +1,331 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Sledgemapper/Content/Content.mgcb b/Sledgemapper/Content/Content.mgcb index c2bc53e..d40c401 100644 --- a/Sledgemapper/Content/Content.mgcb +++ b/Sledgemapper/Content/Content.mgcb @@ -380,6 +380,18 @@ /processorParam:TextureFormat=Color /build:walls/wall01.png +#begin walls/wall01.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:walls/wall01.png + #begin walls/wall02.png /importer:TextureImporter /processor:TextureProcessor @@ -392,6 +404,30 @@ /processorParam:TextureFormat=Color /build:walls/wall02.png +#begin walls/wall02.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:walls/wall02.png + +#begin walls/wall03.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:walls/wall03.png + #begin walls/wall03.png /importer:TextureImporter /processor:TextureProcessor @@ -416,6 +452,18 @@ /processorParam:TextureFormat=Color /build:walls/wall04.png +#begin walls/wall04.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:walls/wall04.png + #begin walls/wall05.png /importer:TextureImporter /processor:TextureProcessor @@ -428,3 +476,87 @@ /processorParam:TextureFormat=Color /build:walls/wall05.png +#begin walls/wall05.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:walls/wall05.png + +#begin walls/wall06.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:walls/wall06.png + +#begin walls/wall07.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:walls/wall07.png + +#begin walls/wall08.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:walls/wall08.png + +#begin walls/wall09.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:walls/wall09.png + +#begin walls/wall10.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:walls/wall10.png + +#begin walls/wall11.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:walls/wall11.png + diff --git a/Sledgemapper/Content/walls/wall01.png b/Sledgemapper/Content/walls/wall01.png index adac5d5a822862f9d4fb19dd62b6578a02a7a1eb..c392278ef189662aba897435dbd49ef966c5506e 100644 GIT binary patch literal 1088 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK4*YWh%1nmD4Po;L*rZ(fE05{kYDis{|whp@dDK{a29w(7Bes?$b&GW zlK*uMppuQAE{-7;ac?gu3NbSZFdcmI@BfP#)1oIP_nArX)Xcl{oqy^Dz6pxa{#pxV z6`Z%t3vse`Xv?u(*;3ZPbF(Ul^DTqqrmstcZZR6Ay!KSx!klvA+GMW`_7fAgTe~ HDWM4f%_ux# diff --git a/Sledgemapper/Content/walls/wall02.png b/Sledgemapper/Content/walls/wall02.png index ccb660dc6359c6c2ec8fe55c69f0f29319794da2..527326609b23dc472a7604d1aea8c794b4442fc9 100644 GIT binary patch literal 1153 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK4*bPWHAGSf;+=lyJcN&c6YZnG*Qr*#%StBhNo zJ2$Sb&PGSS?)|*Gm+vm`o?Low%4e%h3;# ze&@OKZ?Dgs`F;QM+`Dn}_s6=k2{at!WBlMa|Dqy8bg14zQHDb-*pLm2)SDaa4xep& zcZcg=kG=ixU!v7Fi7F10X$(ANIShXH_srW@SF!)yt$Ve9jPBO{-}vsI55ut{)&>K{ zp^Y{GlUHd<%jVUy7u&tC@xT1;>gm$!+xFMb=(BCxe*Jm7{&5W^gBu$eAH3%{5V4Ly zKn)vurg$MCJ>2~MwZiP(rFT!&#hRB^*ZwP$m2_ZWn_a*6<6m|^eS3SkX>0#ow7pxq s%Odi*ujTsWolFih7)BzxX7ZQC`$f#%=sBXdfW-!br>mdKI;Vst0CVwPz5oCK delta 194 zcmZqVyw9lE8Q|y6%O%Cdz`(%k>ERLtq=kXlhJy`AwybK@pQxx_&v%%Cf$uQm@%$Aj zK+zIU7srqY_qW#%@-`?4um*16zP*_LD)j#dF%xVcD>mdCYwK` z-97*8VQJ3B7_(`c_#A!Qeaub5j-QmC8+X3rtZn2i)%)K)-ajclb+Y3nDzy9H`}*PY htFAuZCAuRx%qyO%rGDAC;VaMq44$rjF6*2Ung9;OQLX?0 diff --git a/Sledgemapper/Content/walls/wall03.png b/Sledgemapper/Content/walls/wall03.png index 8dcb491c2e7bb23b1a8db84be75f581258564023..0b1320ee19f6407ab9f2bc2895830149bbf381c7 100644 GIT binary patch literal 986 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK4*bPWHAGSf;8c`etS=RFP6_PN{oNa(!|1WXn3PzbBcY} zaPBd@X4PK)S+a&v!G~cK5e|WzGnUt%oZ9yL+3OX1;3Wx1UrcJb?L;!PC{xWt~$(69A~R%qsu@ delta 154 zcmcb`zKKz>Gr-TCmrII^fq{Y7)59eQNDBk84F@xj++0#9J5f=wAiyWY708t+n+qgE z<6ISh6mva)(sO;(D7-Hd{oY2JJCeX0S t{b+`I8;{%3w)qmT9X0Tt&VXE%K?+sMW;OXk;vd$@?2>@&QC3pY; diff --git a/Sledgemapper/Content/walls/wall04.png b/Sledgemapper/Content/walls/wall04.png index 5e52255207bd87c10cd3cb32cb3186812bce259d..2a5d4702561e3305fa14d5374960e839fcfff433 100644 GIT binary patch literal 1249 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK4*bPWHAGSf&vIL_V4xZ0jeqUba4!+hFiSREq~W2Yr9gla&$=Z_ z_Z%+mIBONOqjwKG=N^XUE$rHByVoeMot?t$rx?oCengw12+A3U54Edz+w z-rm+bQL^v6-u<4!`}<_i*Zxel`TpwFpC=zBW;!sa?dEL||HXNiEkRaU*n-Jn1_M@f zXE8hb>ici|e?L}xkh1$8i%nIyT|vheS7xy{%Q63dB@7k!yBIqfs8qD@$liNUq3GgTJq`9)uO-e z{@!?}#!zgDGcK@3(4Z5%u`Bns#LS03-V`ktuljQK;iuOx`;)VOKYTR(>96zOlXu@H zB_z!m)vfJ*|J-i)?&i0<65mq(*78)Bmj1i^JvoJmaYjz;`{&DEU3__(e|vxJ-^IIk u?yLBgaHjfc_1x2f42M_-7;T#N)c$*XL+lIVD@DL!iNVv=&t;ucLK6UM*M`sl delta 203 zcmaFJ`GQfgGr-TCmrII^fq{Y7)59eQNDBk84F?;LY+2Q)KT%P=p6@UN1K(lB9-=MsbB73 zR{61l5@*SCN}D_nUwpN#R59`3@dyO#+qfcYO${|qLM93HI}S1t!5C} zVg_USHkhoF!HhACcjEKDzrF7t@cwW<=RBY1e$IW}_j8{6y3YLw3NaDcbz~O+03ugR zjjRCx#C-$-f;+f3*U)nBzaxaTi2+d4BRS0-@cHOl=mWsJRH5~2{M_-*5K|`v034J4 zdx1_^4hsUnzO*Yw`nFMS^CY1V*B^1XMa05Y$DF`Bi-vpd-u-Bi`7`ReuZMyB$>X>6 zu4dfM_bcP;uJxmvkFCXctoFx_SgRC_(ER}{7F zk^_f32BIoyuQL^;i^2p$3fd`SSnW6TX( z21rQwznre^xj??R!@oLsy23X=o80_cg=|L+Xnk2+!O!mr2Tb#9O0agwr#TAfgaofxzAEo&%xv{pkwiwhC-+#C!*%-?8TXBR%B5(oug-AOQA zh2w`U$Ilu2j0w@@-P2eD74&iUV957bx{$#AkwFtc9vlE@x)6Ig@FpDgX1m+5jYshx zL(mSTK3?L#b}H21RB4R$&N0z^7| zeNG+FE^u;f=}whCSYMF}K-J5Er!6XW=Zcq9h^^QwjFvK1UwYNB)6&y$1_#~7xGfSn z*gA`2U*1ahqy%t4Xawsm6IprQWCYC73-4O?2>2D#pgz2*qVRR@PvSNLS6+{+YYU53 z4#Yq@R*7kN+))l5#sBZIixdY|!w{DJP~;mJ;7gwCR;3Kv*$WMffL;Iq-! zPeUW}DwcTl&pYD`BIR(F)=c_&-tl$Io4&yvIpOMN;cuBF) zg9{+Vp!S>xjFL_^JGd+O&+GN7;R#&0Db^<5&1Xy_m24Jt4C|KHx;rUcU8ldtMf zlcuU+4t^pf6P08ZcbQz7w{Z>Da^aa6#5dX$)R*By>>~X1MFGPE06OFj*q#a46!Iq_uh#Bu z@#whLu;VixE#%ps=_Cev@ptF2}09;^)9-988 zCM-FN>5)pIrTYXmCBJl0F}tC@`tD^VL|IV-R#EHek5zP$7Vqr6HV2PG9k4h0^?g_Tvc9jF3IZE>Q}f7bN%Hjf-(N0YnlQpX&+ zb4o|pu}Gt*5gS;@OfnPZS+Ef^ee{{syf`-?&E3yUPfLtoR32u#5Anw=n!2#WPzT+c zWd>}K#Q`-Zr4`0c4x|;h32(>%kEzbO-*L%OiuJmS^P+w+2v}L`r!tsikv!^IhupD4 zI|LI>XfBLQnsm&K1t^>JXrZD#KPh4~euc09q-!+P4I*)kzft|&UMA;kxuyi0nVxhf zzlL0tCVDvEPJCr;p*-EMBD!(-GUDXVqfEm?JbZehj+CCIZpkLO_v$}%<}VfZH00!) zdw;%HTN0gllMzX@+AmhbBX6d|UmoBa;qxf>U;&&}de7N-&TmOan$~%6j$VB@?q}zc2{O=YqqsT=GPw<}_?z zot)Aeedx?MX?ekMK3m2|r`wfBMrmo-73SJS)+oH%yZ8oW;Y?Q$ny=1YpR>QcI z4@IqU4-8x2!ytc`w~1AqbN>Bt`b>r#-Aep&s;2+ZX-Dgp@zhk`?IXV7UXlO6 ziOW%Lg>>{^^{6sw0=Hw^u1gU>mnyGOAH`76#!mb-=?jFp z-w%fr2cE?+lUTU-wB{(Eh~Iyau| z>)Aq9&Q&Y{ls~p_+_TS%~uwfD8i%JV+nER6s_iMvSbu<0= zU>10c=ZP4I_m%G2_@6RcI90j<&EA{SlW-Dj@eI-KDdoBbj^LY8Wn2rlie?=AoThdO zZn1f*w29*>2Psis5d}IQ9|kt^xumN`X|uc_5eKoa5KDffGoTSUW$85?LUhI(HBbk; zEtb^R;-$BQLja!lr$>#WvvauZ`GE_Ux{SPYZuXtQ)`zs3e??~Y<@u;m#`M!4f)xxcOdx1`4XJEOEmMP$G z`M#%60X)qb%JYl2dNIEc-uEp~Q7x_vTDAq**bs=#ssN?DlY zPiiV@s-Z1UZ|}u#p@co%t!q8!TDoxGvyV8-lO{Iq8W4WS#GDvK&0gf56`A#iD#9h< zk+6Zbk_raqn}iqy-9QVOoF~fORlyAAW9fnNGQioWN~IZ6zb*E>(j%WMGza3x^$wxU z`5|Fx`~Ix<{+cZ)Q4i2dO%BRLF0G&W zZow4cE_;5e_LcYD0RHvyNJL3^-EoE?pqGu9QXqf((HFm)>(KUcyABoAbVNkXP>LZ4 z{C*6>F`K^{#1NmwYS;lxM&a3=3Jzz4Q$v9s~mHw3Rv|-F3){0uu>9 z!f6TWMi58eQat6;aqhyARU@v4Cx1O8pgSK7wa?6sq^^+u5Po}+J0I2N0P;LMde30{ zavOhS3*{D31@5F5oHMnbM8s-{v)dy^HyM9pe(aesC#-AxqxaU6D`jTug!0@1rEi*u zSG3&)s+K{G#Zxfy-4i^|qpDOHYn?To(v_}t>zcaiw@L=m5jB0x&|gXHieQ7oAZV=5 zQ_c7$^b5tf>$fIN+ul;I+07Rg77#TqTz0HsWMyTIQ%9l3fN=6e?V?0vSh$WmiIC$O z_H6hA$4O=m23?~Oju&D;bG9(I`6MN>y})RCvEA}sMTaoeyGv(qWa=v>pfQy zt`R5Ylpc@4Fv%y50S^ifh?fPdUxjYwXB- zD?Yvte?$*cr`p?FZHc`Rw7UCUx-^{0y_x%gJ}6C2wQ8J$R1Xg0CQkY}D!;Er_*K>G zcX4NtKdDvW)g%~vlf!_C)0RCyclJ4uBfb1sY`@t6dMVk%4I0#Sez^NTg76scPu>n< zxPx)enC{K7dvX~z!9IzJ5HkE@dkS{&aBfbJUBr3Ip;lLQ^^4Jl%~Nr@{amU0SHMGo zSbYAo_Pin&&v@q};kvCiJF+it47r9=`loxc<24!a<07E;buxdko=FS}OIPjnKAQ7g5MrdgX;VS$zK%&6K0w zpfupxGRD-sv*p`ncLJwXVZaQ1qb;b~N&HevPrG;9oK9GdoenE#^RxeY zCk9ty9djzLF)Z{=I1Ue{@9b&LL(5;#K!)B_Vu%g}~jWnC0?$NFt!s%eZTT!oKIxON0wIc$`-r=wH35;^dXef)j_P{Q>QnU+&( z=SLBW`QV0aw!@$E9ca9s*M z*{6_K3U;G=9y%2z2FavQ9ul2a`BF28JZ4=)%TDtG@`e|)aKA)M#@M{1&zO1BCdER>XI!e$@#x3d zo)NX4uay>(+T)8zN|9=%lJ%z1Haf5uAZfm`UXn?%or&^%IgQ3ZvWqTWiC=i7nZll; zgR?r9w2X6dnHvJs_QU>+j(JAse9MG7$$AIP44GITWFv_(_wvjuQ~yd~w!T`~h1A^E zE$4VV>bR=y=CQs1vkf6B_^RrV0FT}IhQeT2SRU;)Lfx&e&$h@FusyK-WhVjUHv(E9 zh3zhJ4$rh+v0UEH|L)U#RGHcY$tp5UA5#!$Zo>+=av5S&W8iV; EUz3{Gc>n+a delta 311 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 bzu1?G=iT*LK6@Lm2x9Pb^>bP0l+XkK4SbN5 literal 0 HcmV?d00001 diff --git a/Sledgemapper/Content/walls/wall08.png b/Sledgemapper/Content/walls/wall08.png new file mode 100644 index 0000000000000000000000000000000000000000..d1c1ff88724b31dc0da575c7d9062c9d4ad70115 GIT binary patch literal 1219 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 literal 0 HcmV?d00001 diff --git a/Sledgemapper/Content/walls/wall11.png b/Sledgemapper/Content/walls/wall11.png new file mode 100644 index 0000000000000000000000000000000000000000..0247761a7defd4878dcc13a6e102fb6a750e42ed GIT binary patch literal 1195 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK4*bPWHAGSf;qLHmC4XwsgjqF*`+n)y_Nlci%(ZuIbee=2hO_ z)>(Vzv(2)@HamZmRQ)afYkF<5MeQD&Uv(c}RjpzF$oDQ?a=ya^28S7RM>qE5-j=Z3 zw)r!^{;`S)sWbhqmDbr`TO2X%?b}^`=E=4vu0EZ8KKaQBmIU|o=km6HqQj@Je{NWm z(#Ig6h8I24JJ9#8Sp31y&C4$v*`L{eZvFQ6m!_}3f2^$h9n%|khO(0R41X%V7g_y$ zocOO`_s{gX|Ngvwzwz!|hBwCr84j_Gq9GLm&vI`cJF#)@-1 Date: Thu, 4 Feb 2021 10:02:53 +0000 Subject: [PATCH 04/12] fix stash conflicty --- Sledgemapper.Api/db/LocalDatabase.db | Bin 20480 -> 20480 bytes Sledgemapper.Api/db/sledgemapper.db | Bin 40960 -> 40960 bytes Sledgemapper/UI/MainWidget.Generated.cs | 9 ++++++++- Sledgemapper/UI/mainwidget.xml | 3 +++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Sledgemapper.Api/db/LocalDatabase.db b/Sledgemapper.Api/db/LocalDatabase.db index 22b8623b6d6a4c96d001c3bfc7c6179d7a5b57f0..29abb4332cafe77fabe12c434db60d37a26dd63e 100644 GIT binary patch delta 243 zcmVH$ngi>AEkUk;?SSFy+_KGeof${AHa;ucqJQm42Xqo(Z>lhGh)Fv7r9Hb tTCy delta 30 lcmZozz}T>WaRZA12NPc$1HV3B+-5<6Aim9Ub_)d=nE-wJ2Y&zn diff --git a/Sledgemapper.Api/db/sledgemapper.db b/Sledgemapper.Api/db/sledgemapper.db index 3991092d72fb7e356729169aaf303d3ec6fc53b3..6e140107bce9584788016802be9bacb6d5018fb3 100644 GIT binary patch literal 40960 zcmeI*?`s=%90&0Gk>*#M-F|ghsnheyaA9TSF3ly^A+)Yh;<~g=Q`SzFkgd0^GflcC z-4BLHyAAvU1fTds5%J+b@QL<;i2A@^i1^&0B0i9zBF;|1@8#}tm*#G3v%y$-A1qDo za-Yxl^ZNccZfUm3iP5>5%Act$&KGNZjM`2y3^l~_6h$%QPmugEH$QpeF<+3MwC%au zQ-(V9!h0cdG!QsLZCl;;a_Eh&_d7ohejS_%+#z{}fB*y_0D&zka3$aiKO3Q! zd*;fs>gDuwVXCSw9;uYe>gn2CrCfiRo^9S4Jd#Zf=Tdw+Gm@I-1-Fv~ek{Wa&8G_d zf%=~GtPr{AC#m~vsVCKHmE_dUC>YPvv$maqmb|uu)){(U+aWD!Bc2ec`g~!fmtKC# zEZI0_M#vQBRb!Xm$T*crPfXbhb~vRetu3V%PKYcoczxkWgud2WE1oK;%__~Wd`8mT z@N=Un2f$E}C)+w$0!sQLmwF+UW!u$5o*Tj0sljY(< z^<1T9{`5ANY3?R+Ms{0li{tJR3>1j_z1jxAi7l>DJB-Rd2oh;Q(mubV{uC>ICZx_x92& zSL`(!^?4j?YpKgAbW4xwHEq0}`aEkMgl3nGT`H@K_o!){@rDl`q-W|CRWFpteP^Mn zURYAgr`2^Y*`^BD9XwDbbG@IO8Ce;kec_%S`ua=tn8%6>qm{GzBhwT?(05uy`s+6BRFQe0V3T@JN7nY4TJ9(I-5_Dkryt`9rk=^P3E9J~?SANVw& z2E6`v{VCs1zU#g|?zvo>x6jl2foj00NIvpwJVbXqw}e_jj;N=J-`% zS{Rg~{lbheD3TxP5n)icR4kREqR=m7D>Z#>85H{k>+(7%ABrUg5=tVPlq4}OEAiAp zG4Tq0>D=ADLxsH$H-V_cpO`tp$iA@_o9%J%OZ%NvnX}cM7{(6PSHW>ezH2i%}^iN)4f1UlevZ zBp^dXtAO-`TLRY#q6sCcSP6Fin&0W#1!6lDMB_axZynKP=Jx(9tF7dfT&1G+Z+gW7Ph$;KstJ}JuD^@QY@h~ z3J88#2)QR9t#nJ^whoC&vJNFJA^)5CE(ak(qm9vaDoBX-A>{e$WTz4T>6TR@;og4N z4v^zYG|}*3uH=KQ%@>pP=F9HkU3p}YEJAW4KJ|7!&>CMNrxPBMWz+m|QHo2AMQ-ii z&+`7(_#%NJ@!R1UkjN6$m|<)GyqNbn#J{hPD}O9TdbhDcto^li(rd)Gb+6&yPW#Cv zCT2DN_nY|+*XG|NyleN0a$J_J=HLEkWw$3lK0xER>$^HK*{i~2t+-ed2CoWf?QfHW zL9$ek3%}kU#(Gg+DwXV)d{LM2f-K@dV?Z`qX2#daslE+Qu5~HFb>r;3=3+Xo! zR%eMnNZ5zOQg5oc8ncH#xU;f@Fjn z>S1I0iq7J*qAv4&9QQ(SgJn29MXb{ar4r|9$tDa#C=P7xSI^O%H8B{bKgJ8+Zp7B00bZa z0SG_<0uX=z1Rwwb2tYs==w#Sl+W1uhW+%-?=;mK*V!2zCC+J~&X#E!#ddO*A0pkRU z;#juNJY74H)jt1cxZf!54tc-^0SG_<0uX=z1Rwwb2tWV=5P-nrFA!inR5x8CU#wxh zw1?v8BBR~^lP~>i_y2!B{sp1}2tWV=5P$##AOHafKmY;|fB*z60rGu4it^JmQ~&&5 zyZ^@q0SG_<0uX=z1Rwwb2tWV=5P-ne6=;0^|0DPL)~yniK>z{}fB*y_009U<00Izz z00g#*fD%x~yGtIhK>z{}fB*y_009U<00Izz00bbgMFjk;{!aif9+nFfwfq12 z_y5gVQu&SckPGp90Cx400bZa0SG_< U0uX=z1Rwx`Eg+!X_b66qusuDwkBd-)&ozvsWYS9uort0}B@mvm~Q$Vu4S7Itv#QvovRLYH=}8l7WGr znOT_;$^&U+;svT_6mJ#tK?g4>LMTP0kS$Tn6V8eei@c#xH p@t$88=rm@2&P0$f*zE88-@&#DaYCF86aNO*@RpyQ3nb3U1OVNNMk@dS diff --git a/Sledgemapper/UI/MainWidget.Generated.cs b/Sledgemapper/UI/MainWidget.Generated.cs index f7c1c35..59bb4d9 100644 --- a/Sledgemapper/UI/MainWidget.Generated.cs +++ b/Sledgemapper/UI/MainWidget.Generated.cs @@ -1,4 +1,4 @@ -/* Generated by MyraPad at 03/02/2021 21:43:01 */ +/* Generated by MyraPad at 04/02/2021 10:02:37 */ using Myra; using Myra.Graphics2D; using Myra.Graphics2D.TextureAtlases; @@ -191,6 +191,11 @@ namespace Sledgemapper.UI }); verticalStackPanel1.Widgets.Add(scrollViewer1); + TxtOverlaySearch = new TextBox(); + TxtOverlaySearch.MinHeight = 40; + TxtOverlaySearch.Margin = new Thickness(0, 4); + TxtOverlaySearch.Id = "TxtOverlaySearch"; + GridOverlays = new Grid(); GridOverlays.ColumnSpacing = 8; GridOverlays.RowSpacing = 8; @@ -214,6 +219,7 @@ namespace Sledgemapper.UI { Type = Myra.Graphics2D.UI.ProportionType.Fill, }); + verticalStackPanel2.Widgets.Add(TxtOverlaySearch); verticalStackPanel2.Widgets.Add(scrollViewer2); var verticalSplitPane1 = new VerticalSplitPane(); @@ -307,6 +313,7 @@ namespace Sledgemapper.UI public ImageTextButton BtnToolbarDelete; public HorizontalStackPanel Toolbar; public Grid GridWalls; + public TextBox TxtOverlaySearch; public Grid GridOverlays; public Label lblConnectionStatus; public Label lblUsername; diff --git a/Sledgemapper/UI/mainwidget.xml b/Sledgemapper/UI/mainwidget.xml index 69d34c9..53e84c3 100644 --- a/Sledgemapper/UI/mainwidget.xml +++ b/Sledgemapper/UI/mainwidget.xml @@ -56,6 +56,9 @@ + + + From 808c0538be3005f079383f4d32a2241ae8a5742b Mon Sep 17 00:00:00 2001 From: Michele Date: Thu, 4 Feb 2021 11:06:17 +0000 Subject: [PATCH 05/12] searchable overlays, overlay name on hover --- Sledgemapper/Sledgemapper.cs | 110 +++++++++++++++++------- Sledgemapper/UI/MainWidget.Generated.cs | 22 ++--- Sledgemapper/UI/mainwidget.xml.xmmp | 82 ++++++++++++++++++ 3 files changed, 172 insertions(+), 42 deletions(-) create mode 100644 Sledgemapper/UI/mainwidget.xml.xmmp diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 4dfbe2a..eb96d6c 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -12,6 +12,7 @@ using Myra.Graphics2D.TextureAtlases; using Myra.Graphics2D.UI; using Myra.Graphics2D.UI.File; using Myra.Graphics2D.UI.Properties; +using Myra.Utility; using Newtonsoft.Json; using Sledgemapper.Shared.Entities; using Sledgemapper.UI; @@ -147,14 +148,19 @@ namespace Sledgemapper } } - private void AddItemToToolGrid(Grid grid, EventHandler eventAction, SpriteSheet spriteSheet) + private void AddItemToToolGrid(Grid grid, EventHandler eventAction, SpriteSheet spriteSheet, string e="") { var indexX = 0; var indexY = 0; - foreach (var item in spriteSheet.index) + //foreach (var item in spriteSheet.index) + grid.Widgets.Clear(); + _mainWidget.ScrOverlay.ResetScroll(); + foreach (var item in spriteSheet.index.Where(t=>String.IsNullOrWhiteSpace(e) || t.Key.ToLower().Contains(e.ToLower()))) { var tileButton = new ImageButton { Image = new TextureRegion(spriteSheet.Texture, item.Value), GridColumn = indexY, GridRow = indexX, Id = item.Key, Width = 40, Height = 40 }; tileButton.Click += eventAction; + tileButton.MouseMoved+=OnTileButtonTouchEntered; + tileButton.MouseLeft += OnTileButtonTouchLeft; grid.Widgets.Add(tileButton); indexY++; if (indexY == 4) @@ -165,6 +171,25 @@ namespace Sledgemapper } } + private void OnTileButtonTouchLeft(object sender, EventArgs e) + { + _desktop.HideContextMenu(); + _lblOverlayName.Visible=false; + } + + Label _lblOverlayName; + + private void OnTileButtonTouchEntered(object sender, EventArgs e) + { + var mouseState = Mouse.GetState().Position; +mouseState.X+=10; +mouseState.Y+=10; + _lblOverlayName.Visible=true; + _lblOverlayName.Text=((ImageButton)sender).Id; + _desktop.ShowContextMenu(_lblOverlayName, mouseState); + // _lblOverlayName.true; + } + protected override void LoadContent() { _spriteBatch = new SpriteBatch(GraphicsDevice); @@ -194,10 +219,13 @@ namespace Sledgemapper _mainWidget.BtnToolbarDelete.Click += OnBtnToolbarDeleteClicked; _wallsContent = Content.LoadContentFolder("walls"); - + _spriteSheet = new SpriteSheet(); _spriteSheet.LoadContent(Content); - +_lblOverlayName = new Label(); +_lblOverlayName.Background=new SolidBrush(Color.SlateGray); +_lblOverlayName.Padding=new Myra.Graphics2D.Thickness(4); + AddItemToToolGrid(_mainWidget.GridWalls, OnWallButtonClicked, _wallsContent); AddItemToToolGrid(_mainWidget.GridOverlays, OnOverlayButtonClicked, _spriteSheet); @@ -208,6 +236,8 @@ namespace Sledgemapper _mainWidget.BtnToolbarLine.Image = new TextureRegion(Content.Load("icon_line")); _mainWidget.BtnToolbarRoom.Image = new TextureRegion(Content.Load("icon_room")); _mainWidget.BtnToolbarDelete.Image = new TextureRegion(Content.Load("icon_delete")); + _mainWidget.TxtOverlaySearch.TextChangedByUser += OnTxtOverlaySearchChange; + _desktop.Root = _mainWidget; _transparentRedRectangle = new Texture2D(GraphicsDevice, 1, 1); @@ -217,38 +247,54 @@ namespace Sledgemapper _whiteRectangle.SetData(new[] { Color.White }); } - + private void OnTxtOverlaySearchChange(object sender, ValueChangedEventArgs e) + { + // var filteredWidget = _mainWidget.GridOverlays.Widgets.Where(m => m.Id.ToLower().Contains(e.NewValue.ToLower())).ToArray(); + // foreach (var w in _mainWidget.GridOverlays.Widgets) + // { + // w. + // w.Visible = false; + // } + + // foreach (var w in filteredWidget) + // { + // w.Visible = true; + // } + + AddItemToToolGrid(_mainWidget.GridOverlays, OnOverlayButtonClicked, _spriteSheet, e.NewValue); + + } private void OnBtnToolbarDeleteClicked(object sender, EventArgs e) { _state.InsertMode = InsertMode.NewDelete; - - _mainWidget.ClearSelection(); - ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); + + _mainWidget.ClearSelection(); + ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); ((ImageTextButton)sender).BorderThickness = new Myra.Graphics2D.Thickness(2); } private void OnBtnToolbarWallClicked(object sender, EventArgs e) { _state.InsertMode = InsertMode.NewWall; - _mainWidget.ClearSelection(); - ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); + _mainWidget.ClearSelection(); + ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); ((ImageTextButton)sender).BorderThickness = new Myra.Graphics2D.Thickness(2); } private void OnBtnToolbarTileClicked(object sender, EventArgs e) { _state.InsertMode = InsertMode.NewTile; - _mainWidget.ClearSelection(); - ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); + _mainWidget.ClearSelection(); + ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); ((ImageTextButton)sender).BorderThickness = new Myra.Graphics2D.Thickness(2); } private void OnBtnToolbarRoomClicked(object sender, EventArgs e) { _state.InsertMode = InsertMode.NewRoom; - _mainWidget.ClearSelection(); - ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); + _mainWidget.ClearSelection(); + ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); ((ImageTextButton)sender).BorderThickness = new Myra.Graphics2D.Thickness(2); } @@ -256,8 +302,8 @@ namespace Sledgemapper private void OnBtnToolbarLinClicked(object sender, EventArgs e) { _state.InsertMode = InsertMode.NewLine; - _mainWidget.ClearSelection(); - ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); + _mainWidget.ClearSelection(); + ((ImageTextButton)sender).Border = new SolidBrush(Color.Red); ((ImageTextButton)sender).BorderThickness = new Myra.Graphics2D.Thickness(2); } @@ -1025,22 +1071,22 @@ namespace Sledgemapper private bool IsMapElementOffscreen(BaseMapEntity item) { - SnapPoint start,end; + SnapPoint start, end; - switch (item) - { - case Line l: - start=l.Start; - end=l.End; - break; + switch (item) + { + case Line l: + start = l.Start; + end = l.End; + break; - case Room room: - start = room.Start; - end=room.End; - break; - default: - return true; - } + case Room room: + start = room.Start; + end = room.End; + break; + default: + return true; + } var visibleTilesX = GraphicsDevice.Viewport.Width / _state.TileSize + 1; var visibleTilesY = GraphicsDevice.Viewport.Height / _state.TileSize + 1; @@ -1433,11 +1479,11 @@ namespace Sledgemapper } } } - Effect outlineShader; + Effect outlineShader; private Texture2D _transparentRedRectangle; private Texture2D _whiteRectangle; private Dictionary _wallsContent; - + private SpriteSheet _spriteSheet; private void DrawDelete(Room tile) diff --git a/Sledgemapper/UI/MainWidget.Generated.cs b/Sledgemapper/UI/MainWidget.Generated.cs index 59bb4d9..321f7d2 100644 --- a/Sledgemapper/UI/MainWidget.Generated.cs +++ b/Sledgemapper/UI/MainWidget.Generated.cs @@ -1,4 +1,4 @@ -/* Generated by MyraPad at 04/02/2021 10:02:37 */ +/* Generated by MyraPad at 04/02/2021 10:36:48 */ using Myra; using Myra.Graphics2D; using Myra.Graphics2D.TextureAtlases; @@ -191,11 +191,6 @@ namespace Sledgemapper.UI }); verticalStackPanel1.Widgets.Add(scrollViewer1); - TxtOverlaySearch = new TextBox(); - TxtOverlaySearch.MinHeight = 40; - TxtOverlaySearch.Margin = new Thickness(0, 4); - TxtOverlaySearch.Id = "TxtOverlaySearch"; - GridOverlays = new Grid(); GridOverlays.ColumnSpacing = 8; GridOverlays.RowSpacing = 8; @@ -211,16 +206,22 @@ namespace Sledgemapper.UI }; GridOverlays.Id = "GridOverlays"; - var scrollViewer2 = new ScrollViewer(); - scrollViewer2.Content = GridOverlays; + ScrOverlay = new ScrollViewer(); + ScrOverlay.Id = "ScrOverlay"; + ScrOverlay.Content = GridOverlays; + + TxtOverlaySearch = new TextBox(); + TxtOverlaySearch.Height = 40; + TxtOverlaySearch.Margin = new Thickness(0, 4); + TxtOverlaySearch.Id = "TxtOverlaySearch"; var verticalStackPanel2 = new VerticalStackPanel(); verticalStackPanel2.Proportions.Add(new Proportion { Type = Myra.Graphics2D.UI.ProportionType.Fill, }); + verticalStackPanel2.Widgets.Add(ScrOverlay); verticalStackPanel2.Widgets.Add(TxtOverlaySearch); - verticalStackPanel2.Widgets.Add(scrollViewer2); var verticalSplitPane1 = new VerticalSplitPane(); verticalSplitPane1.Width = 200; @@ -313,8 +314,9 @@ namespace Sledgemapper.UI public ImageTextButton BtnToolbarDelete; public HorizontalStackPanel Toolbar; public Grid GridWalls; - public TextBox TxtOverlaySearch; public Grid GridOverlays; + public ScrollViewer ScrOverlay; + public TextBox TxtOverlaySearch; public Label lblConnectionStatus; public Label lblUsername; public Label lblSessionName; diff --git a/Sledgemapper/UI/mainwidget.xml.xmmp b/Sledgemapper/UI/mainwidget.xml.xmmp new file mode 100644 index 0000000..aca05ef --- /dev/null +++ b/Sledgemapper/UI/mainwidget.xml.xmmp @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 47ea480b18704a99c71ef79289843cd8b1ff8538 Mon Sep 17 00:00:00 2001 From: Michele Date: Thu, 4 Feb 2021 13:10:24 +0000 Subject: [PATCH 06/12] Display room size while drawing --- Sledgemapper/Sledgemapper.cs | 109 ++++++++++++++++++++++++++++------- 1 file changed, 89 insertions(+), 20 deletions(-) diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index eb96d6c..341d51c 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -148,18 +148,18 @@ namespace Sledgemapper } } - private void AddItemToToolGrid(Grid grid, EventHandler eventAction, SpriteSheet spriteSheet, string e="") + private void AddItemToToolGrid(Grid grid, EventHandler eventAction, SpriteSheet spriteSheet, string e = "") { var indexX = 0; var indexY = 0; //foreach (var item in spriteSheet.index) grid.Widgets.Clear(); _mainWidget.ScrOverlay.ResetScroll(); - foreach (var item in spriteSheet.index.Where(t=>String.IsNullOrWhiteSpace(e) || t.Key.ToLower().Contains(e.ToLower()))) + foreach (var item in spriteSheet.index.Where(t => String.IsNullOrWhiteSpace(e) || t.Key.ToLower().Contains(e.ToLower()))) { var tileButton = new ImageButton { Image = new TextureRegion(spriteSheet.Texture, item.Value), GridColumn = indexY, GridRow = indexX, Id = item.Key, Width = 40, Height = 40 }; tileButton.Click += eventAction; - tileButton.MouseMoved+=OnTileButtonTouchEntered; + tileButton.MouseMoved += OnTileButtonTouchEntered; tileButton.MouseLeft += OnTileButtonTouchLeft; grid.Widgets.Add(tileButton); indexY++; @@ -173,20 +173,20 @@ namespace Sledgemapper private void OnTileButtonTouchLeft(object sender, EventArgs e) { - _desktop.HideContextMenu(); - _lblOverlayName.Visible=false; + _desktop.HideContextMenu(); + _lblOverlayName.Visible = false; } Label _lblOverlayName; private void OnTileButtonTouchEntered(object sender, EventArgs e) { - var mouseState = Mouse.GetState().Position; -mouseState.X+=10; -mouseState.Y+=10; - _lblOverlayName.Visible=true; - _lblOverlayName.Text=((ImageButton)sender).Id; - _desktop.ShowContextMenu(_lblOverlayName, mouseState); + var mouseState = Mouse.GetState().Position; + mouseState.X += 10; + mouseState.Y += 10; + _lblOverlayName.Visible = true; + _lblOverlayName.Text = ((ImageButton)sender).Id; + _desktop.ShowContextMenu(_lblOverlayName, mouseState); // _lblOverlayName.true; } @@ -222,10 +222,10 @@ mouseState.Y+=10; _spriteSheet = new SpriteSheet(); _spriteSheet.LoadContent(Content); -_lblOverlayName = new Label(); -_lblOverlayName.Background=new SolidBrush(Color.SlateGray); -_lblOverlayName.Padding=new Myra.Graphics2D.Thickness(4); - + _lblOverlayName = new Label(); + _lblOverlayName.Background = new SolidBrush(Color.SlateGray); + _lblOverlayName.Padding = new Myra.Graphics2D.Thickness(4); + AddItemToToolGrid(_mainWidget.GridWalls, OnWallButtonClicked, _wallsContent); AddItemToToolGrid(_mainWidget.GridOverlays, OnOverlayButtonClicked, _spriteSheet); @@ -262,7 +262,7 @@ _lblOverlayName.Padding=new Myra.Graphics2D.Thickness(4); // } AddItemToToolGrid(_mainWidget.GridOverlays, OnOverlayButtonClicked, _spriteSheet, e.NewValue); - + } private void OnBtnToolbarDeleteClicked(object sender, EventArgs e) @@ -796,25 +796,94 @@ _lblOverlayName.Padding=new Myra.Graphics2D.Thickness(4); break; } + var ffont = _fonts.FirstOrDefault(m => int.Parse(m.Key.Replace("font", "")) > _state.TileSize / 3).Value ?? _fonts.Last().Value; + var fscale = 1.2f; + var width = Math.Abs((endposX - posX)); + var height = Math.Abs((posY - endposY)); + var tilesWidth = width / (double)_state.TileSize; + var tilesHeight = height / (double)_state.TileSize; + tilesWidth = Math.Round(tilesWidth * 2, MidpointRounding.AwayFromZero) / 2; + tilesHeight = Math.Round(tilesHeight * 2, MidpointRounding.AwayFromZero) / 2; + var xmeasure = ffont.MeasureString($"{tilesWidth}"); + var ymeasure = ffont.MeasureString($"{tilesHeight}"); + float widthX = 0, widthY = 0, heightX = 0, heightY = 0; + + Rectangle area = new Rectangle(); if (posX != endposX && posY != endposY) { - if ((posX > endposX && posY > endposY) || (posX < endposX && posY < endposY)) { - _spriteBatch.Draw(_transparentRedRectangle, new Rectangle(posX, posY, endposX - posX, endposY - posY), null, Color.White, 0, new Vector2(0, 0), SpriteEffects.None, 1); + area = new Rectangle(posX, posY, endposX - posX, endposY - posY); + + if (posX > endposX && posY > endposY) + { + widthX = endposX + (width / 2) - xmeasure.X / 2; + widthY = endposY - ymeasure.Y * 1.2f; + + heightX = posX + xmeasure.X / 2; + heightY = endposY + (height / 2) - ymeasure.Y / 2; + } + else if (posX < endposX && posY < endposY) + { + widthX = posX + (width / 2) - xmeasure.X / 2; + widthY = posY - ymeasure.Y * 1.2f; + + heightX = endposX + xmeasure.X / 2; + heightY = posY + (height/ 2) - ymeasure.Y / 2; + } } else { if (endposY < posY) { - _spriteBatch.Draw(_transparentRedRectangle, new Rectangle(posX, endposY, endposX - posX, posY - endposY), null, Color.White, 0, new Vector2(0, 0), SpriteEffects.None, 1); + area = new Rectangle(posX, endposY, endposX - posX, posY - endposY); + + widthX = posX + (width / 2) - xmeasure.X / 2; + widthY = endposY - ymeasure.Y * 1.2f; + + heightX = endposX + xmeasure.X / 2; + heightY = endposY + (height / 2) - ymeasure.Y / 2; } if (endposX < posX) { - _spriteBatch.Draw(_transparentRedRectangle, new Rectangle(endposX, posY, posX - endposX, endposY - posY), null, Color.White, 0, new Vector2(0, 0), SpriteEffects.None, 1); + area = new Rectangle(endposX, posY, posX - endposX, endposY - posY); + + widthX = endposX + (width / 2) - xmeasure.X / 2; + widthY = posY - ymeasure.Y * 1.2f; + + heightX = posX + xmeasure.X / 2; + heightY = posY + (height / 2) - ymeasure.Y / 2; } } + + _spriteBatch.Draw(_transparentRedRectangle, area, null, Color.White, 0, new Vector2(0, 0), SpriteEffects.None, 1); + + _spriteBatch.DrawString(ffont, + $"{tilesWidth}", + new Vector2( + widthX, + widthY + ), + Color.Red, + 0, + Vector2.Zero, + fscale, + SpriteEffects.None, + 0); + + _spriteBatch.DrawString(ffont, + $"{tilesHeight}", + new Vector2( + heightX, heightY + ), + Color.Red, + 0, + Vector2.Zero, + fscale, + SpriteEffects.None, + 0); + } } } From 85274034f3f32f5194e6b9f1f193d98cf81098d6 Mon Sep 17 00:00:00 2001 From: Michele Date: Thu, 4 Feb 2021 14:45:40 +0000 Subject: [PATCH 07/12] code cleanup --- Sledgemapper/Sledgemapper.cs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 341d51c..06ecc0e 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -800,14 +800,14 @@ namespace Sledgemapper var fscale = 1.2f; var width = Math.Abs((endposX - posX)); var height = Math.Abs((posY - endposY)); - var tilesWidth = width / (double)_state.TileSize; + var tilesWidth = width / (double)_state.TileSize; var tilesHeight = height / (double)_state.TileSize; tilesWidth = Math.Round(tilesWidth * 2, MidpointRounding.AwayFromZero) / 2; tilesHeight = Math.Round(tilesHeight * 2, MidpointRounding.AwayFromZero) / 2; var xmeasure = ffont.MeasureString($"{tilesWidth}"); var ymeasure = ffont.MeasureString($"{tilesHeight}"); float widthX = 0, widthY = 0, heightX = 0, heightY = 0; - + Rectangle area = new Rectangle(); if (posX != endposX && posY != endposY) { @@ -829,7 +829,7 @@ namespace Sledgemapper widthY = posY - ymeasure.Y * 1.2f; heightX = endposX + xmeasure.X / 2; - heightY = posY + (height/ 2) - ymeasure.Y / 2; + heightY = posY + (height / 2) - ymeasure.Y / 2; } } else @@ -873,16 +873,16 @@ namespace Sledgemapper 0); _spriteBatch.DrawString(ffont, - $"{tilesHeight}", - new Vector2( - heightX, heightY - ), - Color.Red, - 0, - Vector2.Zero, - fscale, - SpriteEffects.None, - 0); + $"{tilesHeight}", + new Vector2( + heightX, heightY + ), + Color.Red, + 0, + Vector2.Zero, + fscale, + SpriteEffects.None, + 0); } } From 461984460798ab7d62c7d92719cc9de649d92c89 Mon Sep 17 00:00:00 2001 From: Michele Date: Thu, 4 Feb 2021 23:18:08 +0000 Subject: [PATCH 08/12] Multiple players visible in cell --- Sledgemapper.Shared/Entities/Tile.cs | 59 ++++++++++++ Sledgemapper/Sledgemapper.cs | 138 ++++++++++++++++++++++++--- 2 files changed, 182 insertions(+), 15 deletions(-) diff --git a/Sledgemapper.Shared/Entities/Tile.cs b/Sledgemapper.Shared/Entities/Tile.cs index aa0583f..0b622d2 100644 --- a/Sledgemapper.Shared/Entities/Tile.cs +++ b/Sledgemapper.Shared/Entities/Tile.cs @@ -1,4 +1,5 @@ using System; +using System.Security.Cryptography; namespace Sledgemapper.Shared.Entities { @@ -22,6 +23,64 @@ namespace Sledgemapper.Shared.Entities public class Tile : BaseMapEntity { + + public bool Equals(Tile other) + { + if (other == null) return false; + return (X == other.X && Y == other.Y); + } + + public static bool operator ==(Tile a, Tile b) + { + // If both are null, or both are same instance, return true. + if (System.Object.ReferenceEquals(a, b)) + { + return true; + } + + // If one is null, but not both, return false. + if (((object)a == null) || ((object)b == null)) + { + return false; + } + + // Return true if the fields match: + return a.X == b.X && a.Y == b.Y; + } + + public static bool operator !=(Tile a, Tile b) + { + return !(a == b); + } + + + public override bool Equals(object obj) + { + // + // See the full list of guidelines at + // http://go.microsoft.com/fwlink/?LinkID=85237 + // and also the guidance for operator== at + // http://go.microsoft.com/fwlink/?LinkId=85238 + // + + if (obj == null || GetType() != obj.GetType()) + { + return false; + } + + return Equals(obj as Tile); + } + + // override object.GetHashCode + public override int GetHashCode() + { + unchecked + { + int hash = 13; + hash = (hash * 7) + X + Y; + return hash; + } + } } public class Line : BaseMapEntity diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 06ecc0e..5b81ac8 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -1304,22 +1304,130 @@ namespace Sledgemapper private void DrawPlayers() { - for (int i = 0; i < _sessionData.Players.Count; i++) + var ffont = _fonts.FirstOrDefault(m => int.Parse(m.Key.Replace("font", "")) > _state.TileSize).Value ?? _fonts.Last().Value; + var fscale = _state.TileSize / ((float)ffont.LineSpacing * 3f); + + var playerCells = _sessionData.Players.Select(m => m.Position).Distinct().ToList(); + + foreach (var cell in playerCells) { - Player player = _sessionData.Players[i]; - var color = player.Color.ToColor(); - _spriteBatch.DrawRectangle(new Rectangle(player.Position.X * _state.TileSize - 4, player.Position.Y * _state.TileSize - 4, _state.TileSize + 7, _state.TileSize + 7), color, 2); - var ffont = _fonts.FirstOrDefault(m => int.Parse(m.Key.Replace("font", "")) > _state.TileSize).Value ?? _fonts.Last().Value; - var fscale = _state.TileSize / ((float)ffont.LineSpacing * 2); - _spriteBatch.DrawString(ffont, - player.Initials, - new Vector2(player.Position.X * _state.TileSize + 2, player.Position.Y * _state.TileSize + _state.TileSize - 2 - ffont.LineSpacing * fscale), - color, - 0, - Vector2.Zero, - fscale, - SpriteEffects.None, - 0); + var playersInCell = _sessionData.Players.Where(m => m.Position == cell).ToList(); + var i = 0; + foreach (var player in playersInCell) + { + var color = player.Color.ToColor(); + + var rectangle = new Rectangle(); + var stringPosition = new Vector2(); + var measure = ffont.MeasureString(player.Initials); + var maxSize = Math.Max(measure.X, measure.Y); + + if (playersInCell.Count == 1) + { + fscale = (_state.TileSize - 2) / maxSize; + rectangle = new Rectangle( + player.Position.X * _state.TileSize, + player.Position.Y * _state.TileSize, + _state.TileSize - 1, + _state.TileSize - 1); + stringPosition = new Vector2( + player.Position.X * _state.TileSize, + player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale); + } + else if (playersInCell.Count == 2) + { + fscale = (_state.TileSize / 2 - 2) / maxSize; + + if (i == 0) + { + rectangle = new Rectangle( + player.Position.X * _state.TileSize, + player.Position.Y * _state.TileSize, + _state.TileSize / 2 - 1, + _state.TileSize - 1); + stringPosition = new Vector2( + player.Position.X * _state.TileSize, + player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale); + } + else + { + rectangle = new Rectangle( + player.Position.X * _state.TileSize + _state.TileSize / 2, + player.Position.Y * _state.TileSize, + _state.TileSize / 2 - 1, + _state.TileSize - 1); + stringPosition = new Vector2( + player.Position.X * _state.TileSize + _state.TileSize / 2, + player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale); + } + i++; + } + else if (playersInCell.Count >= 3) + { + fscale = (_state.TileSize / 2 - 2) / maxSize; + switch (i) + { + case 0: + rectangle = new Rectangle( + player.Position.X * _state.TileSize, + player.Position.Y * _state.TileSize, + _state.TileSize / 2 - 1, + _state.TileSize / 2 - 1); + stringPosition = new Vector2( + player.Position.X * _state.TileSize, + player.Position.Y * _state.TileSize + _state.TileSize / 2 - measure.Y * fscale); + + break; + case 1: + rectangle = new Rectangle( + player.Position.X * _state.TileSize + _state.TileSize / 2, + player.Position.Y * _state.TileSize, + _state.TileSize / 2 - 1, + _state.TileSize / 2 - 1); + stringPosition = new Vector2( + player.Position.X * _state.TileSize + _state.TileSize / 2, + player.Position.Y * _state.TileSize + _state.TileSize / 2 - measure.Y * fscale); + + break; + case 2: + rectangle = new Rectangle( + player.Position.X * _state.TileSize, + player.Position.Y * _state.TileSize + _state.TileSize / 2, + _state.TileSize / 2 - 1, + _state.TileSize / 2 - 1); + stringPosition = new Vector2( + player.Position.X * _state.TileSize, + player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale); + + break; + case 3: + default: + rectangle = new Rectangle( + player.Position.X * _state.TileSize + _state.TileSize / 2, + player.Position.Y * _state.TileSize + _state.TileSize / 2, + _state.TileSize / 2 - 1, + _state.TileSize / 2 - 1); + stringPosition = new Vector2( + player.Position.X * _state.TileSize + _state.TileSize / 2, + player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale); + + break; + } + i++; + } + + _spriteBatch.DrawRectangle(rectangle, color, 2); + _spriteBatch.DrawString(ffont, + player.Initials, + stringPosition, + color, + 0, + Vector2.Zero, + fscale, + SpriteEffects.None, + 0); + } + } foreach (var player in _sessionData.Players) From bce97de302f543389604de61598f70a1b4cb7be4 Mon Sep 17 00:00:00 2001 From: Michele Date: Tue, 9 Feb 2021 17:13:52 +0000 Subject: [PATCH 09/12] ping on map feature complete --- Sledgemapper.Api/Commands/PingCommand.cs | 13 + .../Controllers/SessionController.cs | 11 +- .../Handlers/NewTileCommandHandler.cs | 2 - .../Handlers/PingCommandHandler.cs | 28 ++ Sledgemapper.Api/Handlers/SendPingMessage.cs | 23 + Sledgemapper.Api/Hubs/SledgemapperHub.cs | 11 +- .../Notifications/PingNotification.cs | 14 + .../Clients/ISledgemapperClient.cs | 1 + Sledgemapper.Shared/Easings.cs | 450 ++++++++++++++++++ Sledgemapper.Shared/Entities/Session.cs | 326 ++++++------- Sledgemapper.Shared/Entities/Tile.cs | 7 + Sledgemapper/CommunicationManager.cs | 13 + Sledgemapper/Content/Content.mgcb | 94 ++-- Sledgemapper/Content/handcursors | Bin 0 -> 4969 bytes Sledgemapper/Content/handcursors.png | Bin 0 -> 349 bytes Sledgemapper/Content/handcursorsIndex | 7 + Sledgemapper/Content/rippleSpriteIndex | 24 + Sledgemapper/Content/rippleSpriteMap | Bin 0 -> 14526 bytes Sledgemapper/Sledgemapper.cs | 211 +++++++- 19 files changed, 1002 insertions(+), 233 deletions(-) create mode 100644 Sledgemapper.Api/Commands/PingCommand.cs create mode 100644 Sledgemapper.Api/Handlers/PingCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/SendPingMessage.cs create mode 100644 Sledgemapper.Api/Notifications/PingNotification.cs create mode 100644 Sledgemapper.Shared/Easings.cs create mode 100644 Sledgemapper/Content/handcursors create mode 100644 Sledgemapper/Content/handcursors.png create mode 100644 Sledgemapper/Content/handcursorsIndex create mode 100644 Sledgemapper/Content/rippleSpriteIndex create mode 100644 Sledgemapper/Content/rippleSpriteMap diff --git a/Sledgemapper.Api/Commands/PingCommand.cs b/Sledgemapper.Api/Commands/PingCommand.cs new file mode 100644 index 0000000..ef4db06 --- /dev/null +++ b/Sledgemapper.Api/Commands/PingCommand.cs @@ -0,0 +1,13 @@ +// using Sledgemapper.Shared.Entities; + +// namespace Sledgemapper.Api.Commands +// { +// public class PingCommand : BaseCommand +// { +// public Ping Location { get; private set; } +// public PingCommand(string sessionName, Ping location, int userId) : base(sessionName, userId) +// { +// Location = location; +// } +// } +// } diff --git a/Sledgemapper.Api/Controllers/SessionController.cs b/Sledgemapper.Api/Controllers/SessionController.cs index 2638ac5..4926ba2 100644 --- a/Sledgemapper.Api/Controllers/SessionController.cs +++ b/Sledgemapper.Api/Controllers/SessionController.cs @@ -2,6 +2,7 @@ using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Notifications; using Sledgemapper.Shared.Entities; using System.Threading.Tasks; @@ -30,6 +31,12 @@ namespace Sledgemapper.Api.Controllers return result; } + // [HttpPost("ping")] + // public async Task Post(string sessionName, [FromBody] Ping pingLocation) + // { + // await _mediator.Send(new PingCommand(sessionName, pingLocation, UserId)); + // } + [HttpPost("snapshot")] public async Task Post(string sessionName, [FromBody] Session session) { @@ -60,13 +67,13 @@ namespace Sledgemapper.Api.Controllers await _mediator.Send(new NewNoteCommand(sessionName, note, UserId)); } - [HttpPost("room")] + [HttpPost("room")] public async Task Post(string sessionName, [FromBody] Room room) { await _mediator.Send(new NewRoomCommand(sessionName, room, UserId)); } - [HttpPost("line")] + [HttpPost("line")] public async Task Post(string sessionName, [FromBody] Line line) { await _mediator.Send(new NewLineCommand(sessionName, line, UserId)); diff --git a/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs b/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs index 3169384..6b0a55c 100644 --- a/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs +++ b/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs @@ -35,7 +35,5 @@ namespace Sledgemapper.Api.Commands await _mediator.Publish(new NewTileNotification(session, notification.Tile, notification.UserId)); return true; } - - } } diff --git a/Sledgemapper.Api/Handlers/PingCommandHandler.cs b/Sledgemapper.Api/Handlers/PingCommandHandler.cs new file mode 100644 index 0000000..efc9325 --- /dev/null +++ b/Sledgemapper.Api/Handlers/PingCommandHandler.cs @@ -0,0 +1,28 @@ +// using MediatR; +// using Sledgemapper.Api.Data; +// using System.Threading; +// using System.Threading.Tasks; +// using Sledgemapper.Api.Notifications; +// using System.Linq; + +// namespace Sledgemapper.Api.Commands +// { +// public class PingCommandHandler : IRequestHandler +// { +// private readonly MyDbContext _dbcontext; +// private readonly IMediator _mediator; + +// public PingCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; } + +// public async Task Handle(PingCommand notification, CancellationToken cancellationToken) +// { +// var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName); + + +// await _mediator.Publish(new PingNotification(session, notification.Location, notification.UserId)); +// return true; +// } + + +// } +// } diff --git a/Sledgemapper.Api/Handlers/SendPingMessage.cs b/Sledgemapper.Api/Handlers/SendPingMessage.cs new file mode 100644 index 0000000..9b7f0d9 --- /dev/null +++ b/Sledgemapper.Api/Handlers/SendPingMessage.cs @@ -0,0 +1,23 @@ +// using MediatR; +// using Microsoft.AspNetCore.SignalR; +// using Sledgemapper.Api.Notifications; +// using Sledgemapper.Clients; +// using System.Threading; +// using System.Threading.Tasks; +// using Sledgemapper.Api.Hubs; + +// namespace Sledgemapper.Api.Handlers +// { +// public class SendPingMessage : INotificationHandler +// { +// private readonly IHubContext _hub; + +// public SendPingMessage(IHubContext hub) => _hub = hub; + +// public async Task Handle(PingNotification notification, CancellationToken cancellationToken) +// { + +// await _hub.Clients.Groups(notification.Session.SessionName).Ping(notification.Location, notification.UserId); +// } +// } +// } diff --git a/Sledgemapper.Api/Hubs/SledgemapperHub.cs b/Sledgemapper.Api/Hubs/SledgemapperHub.cs index c356461..235af86 100644 --- a/Sledgemapper.Api/Hubs/SledgemapperHub.cs +++ b/Sledgemapper.Api/Hubs/SledgemapperHub.cs @@ -51,7 +51,7 @@ namespace Sledgemapper.Api.Hubs await Clients.Group(sessionName).NewRoom(room); } - public async Task NewLine(string sessionName, Line line) + public async Task NewLine(string sessionName, Line line) { await Clients.Group(sessionName).NewLine(line); } @@ -86,6 +86,15 @@ namespace Sledgemapper.Api.Hubs await Clients.Group(sessionName).DeleteOverlay(tile); } + public async Task Ping(string sessionName, Tile location) + { + var userId = int.Parse(Context.User.Identity.Name); + var user = _datacontext.Users.First(u => u.Id == userId); + + var player = new Player { UserId = userId, Initials = user.Initials, Position = new Tile { X = 0, Y = 0 }, Color = UserColors[userId] }; + await Clients.Group(sessionName).Ping(new Ping{X=location.X, Y=location.Y, Player=player}); + } + public async Task JoinSession(string sessionName) { var session = _dbContext.Sessions.FirstOrDefault(s => s.SessionName == sessionName); diff --git a/Sledgemapper.Api/Notifications/PingNotification.cs b/Sledgemapper.Api/Notifications/PingNotification.cs new file mode 100644 index 0000000..e14c965 --- /dev/null +++ b/Sledgemapper.Api/Notifications/PingNotification.cs @@ -0,0 +1,14 @@ +// using Sledgemapper.Shared.Entities; + +// namespace Sledgemapper.Api.Notifications +// { +// public class PingNotification : BaseNotification +// { +// public Ping Location { get; private set; } + +// public PingNotification(Models.Session session, Ping location, int userId) : base(session, userId) +// { +// Location = location; +// } +// } +// } diff --git a/Sledgemapper.Shared/Clients/ISledgemapperClient.cs b/Sledgemapper.Shared/Clients/ISledgemapperClient.cs index a1ec349..4e8bc07 100644 --- a/Sledgemapper.Shared/Clients/ISledgemapperClient.cs +++ b/Sledgemapper.Shared/Clients/ISledgemapperClient.cs @@ -20,5 +20,6 @@ namespace Sledgemapper.Clients Task UpdateMap(Session player); Task RefreshPlayers(); Task NewLine(Line line); + Task Ping(Ping ping); } } diff --git a/Sledgemapper.Shared/Easings.cs b/Sledgemapper.Shared/Easings.cs new file mode 100644 index 0000000..b82cd35 --- /dev/null +++ b/Sledgemapper.Shared/Easings.cs @@ -0,0 +1,450 @@ + +using System; +#if UNITY +using UnityEngine; +using Math = UnityEngine.Mathf; +#endif + +static public class Easings +{ + /// + /// Constant Pi. + /// + private const float PI = (float)(float)Math.PI; + + /// + /// Constant Pi / 2. + /// + private const float HALFPI =(float) (float)Math.PI / 2.0f; + + /// + /// Easing Functions enumeration + /// + public enum Functions + { + Linear, + QuadraticEaseIn, + QuadraticEaseOut, + QuadraticEaseInOut, + CubicEaseIn, + CubicEaseOut, + CubicEaseInOut, + QuarticEaseIn, + QuarticEaseOut, + QuarticEaseInOut, + QuinticEaseIn, + QuinticEaseOut, + QuinticEaseInOut, + SineEaseIn, + SineEaseOut, + SineEaseInOut, + CircularEaseIn, + CircularEaseOut, + CircularEaseInOut, + ExponentialEaseIn, + ExponentialEaseOut, + ExponentialEaseInOut, + ElasticEaseIn, + ElasticEaseOut, + ElasticEaseInOut, + BackEaseIn, + BackEaseOut, + BackEaseInOut, + BounceEaseIn, + BounceEaseOut, + BounceEaseInOut + } + + /// + /// Interpolate using the specified function. + /// + static public float Interpolate(float p, Functions function) + { + switch(function) + { + default: + case Functions.Linear: return Linear(p); + case Functions.QuadraticEaseOut: return QuadraticEaseOut(p); + case Functions.QuadraticEaseIn: return QuadraticEaseIn(p); + case Functions.QuadraticEaseInOut: return QuadraticEaseInOut(p); + case Functions.CubicEaseIn: return CubicEaseIn(p); + case Functions.CubicEaseOut: return CubicEaseOut(p); + case Functions.CubicEaseInOut: return CubicEaseInOut(p); + case Functions.QuarticEaseIn: return QuarticEaseIn(p); + case Functions.QuarticEaseOut: return QuarticEaseOut(p); + case Functions.QuarticEaseInOut: return QuarticEaseInOut(p); + case Functions.QuinticEaseIn: return QuinticEaseIn(p); + case Functions.QuinticEaseOut: return QuinticEaseOut(p); + case Functions.QuinticEaseInOut: return QuinticEaseInOut(p); + case Functions.SineEaseIn: return SineEaseIn(p); + case Functions.SineEaseOut: return SineEaseOut(p); + case Functions.SineEaseInOut: return SineEaseInOut(p); + case Functions.CircularEaseIn: return CircularEaseIn(p); + case Functions.CircularEaseOut: return CircularEaseOut(p); + case Functions.CircularEaseInOut: return CircularEaseInOut(p); + case Functions.ExponentialEaseIn: return ExponentialEaseIn(p); + case Functions.ExponentialEaseOut: return ExponentialEaseOut(p); + case Functions.ExponentialEaseInOut: return ExponentialEaseInOut(p); + case Functions.ElasticEaseIn: return ElasticEaseIn(p); + case Functions.ElasticEaseOut: return ElasticEaseOut(p); + case Functions.ElasticEaseInOut: return ElasticEaseInOut(p); + case Functions.BackEaseIn: return BackEaseIn(p); + case Functions.BackEaseOut: return BackEaseOut(p); + case Functions.BackEaseInOut: return BackEaseInOut(p); + case Functions.BounceEaseIn: return BounceEaseIn(p); + case Functions.BounceEaseOut: return BounceEaseOut(p); + case Functions.BounceEaseInOut: return BounceEaseInOut(p); + } + } + + /// + /// Modeled after the line y = x + /// + static public float Linear(float p) + { + return p; + } + + /// + /// Modeled after the parabola y = x^2 + /// + static public float QuadraticEaseIn(float p) + { + return p * p; + } + + /// + /// Modeled after the parabola y = -x^2 + 2x + /// + static public float QuadraticEaseOut(float p) + { + return -(p * (p - 2)); + } + + /// + /// Modeled after the piecewise quadratic + /// y = (1/2)((2x)^2) ; [0, 0.5) + /// y = -(1/2)((2x-1)*(2x-3) - 1) ; [0.5, 1] + /// + static public float QuadraticEaseInOut(float p) + { + if(p < 0.5f) + { + return 2 * p * p; + } + else + { + return (-2 * p * p) + (4 * p) - 1; + } + } + + /// + /// Modeled after the cubic y = x^3 + /// + static public float CubicEaseIn(float p) + { + return p * p * p; + } + + /// + /// Modeled after the cubic y = (x - 1)^3 + 1 + /// + static public float CubicEaseOut(float p) + { + float f = (p - 1); + return f * f * f + 1; + } + + /// + /// Modeled after the piecewise cubic + /// y = (1/2)((2x)^3) ; [0, 0.5) + /// y = (1/2)((2x-2)^3 + 2) ; [0.5, 1] + /// + static public float CubicEaseInOut(float p) + { + if(p < 0.5f) + { + return 4 * p * p * p; + } + else + { + float f = ((2 * p) - 2); + return 0.5f * f * f * f + 1; + } + } + + /// + /// Modeled after the quartic x^4 + /// + static public float QuarticEaseIn(float p) + { + return p * p * p * p; + } + + /// + /// Modeled after the quartic y = 1 - (x - 1)^4 + /// + static public float QuarticEaseOut(float p) + { + float f = (p - 1); + return f * f * f * (1 - p) + 1; + } + + /// + // Modeled after the piecewise quartic + // y = (1/2)((2x)^4) ; [0, 0.5) + // y = -(1/2)((2x-2)^4 - 2) ; [0.5, 1] + /// + static public float QuarticEaseInOut(float p) + { + if(p < 0.5f) + { + return 8 * p * p * p * p; + } + else + { + float f = (p - 1); + return -8 * f * f * f * f + 1; + } + } + + /// + /// Modeled after the quintic y = x^5 + /// + static public float QuinticEaseIn(float p) + { + return p * p * p * p * p; + } + + /// + /// Modeled after the quintic y = (x - 1)^5 + 1 + /// + static public float QuinticEaseOut(float p) + { + float f = (p - 1); + return f * f * f * f * f + 1; + } + + /// + /// Modeled after the piecewise quintic + /// y = (1/2)((2x)^5) ; [0, 0.5) + /// y = (1/2)((2x-2)^5 + 2) ; [0.5, 1] + /// + static public float QuinticEaseInOut(float p) + { + if(p < 0.5f) + { + return 16 * p * p * p * p * p; + } + else + { + float f = ((2 * p) - 2); + return 0.5f * f * f * f * f * f + 1; + } + } + + /// + /// Modeled after quarter-cycle of sine wave + /// + static public float SineEaseIn(float p) + { + return (float)(float)Math.Sin((p - 1) * HALFPI) + 1; + } + + /// + /// Modeled after quarter-cycle of sine wave (different phase) + /// + static public float SineEaseOut(float p) + { + return (float)(float)Math.Sin(p * HALFPI); + } + + /// + /// Modeled after half sine wave + /// + static public float SineEaseInOut(float p) + { + return 0.5f * (1 - (float)(float)Math.Cos(p * PI)); + } + + /// + /// Modeled after shifted quadrant IV of unit circle + /// + static public float CircularEaseIn(float p) + { + return 1 - (float)Math.Sqrt(1 - (p * p)); + } + + /// + /// Modeled after shifted quadrant II of unit circle + /// + static public float CircularEaseOut(float p) + { + return (float)Math.Sqrt((2 - p) * p); + } + + /// + /// Modeled after the piecewise circular function + /// y = (1/2)(1 - (float)Math.Sqrt(1 - 4x^2)) ; [0, 0.5) + /// y = (1/2)((float)Math.Sqrt(-(2x - 3)*(2x - 1)) + 1) ; [0.5, 1] + /// + static public float CircularEaseInOut(float p) + { + if(p < 0.5f) + { + return 0.5f * (1 - (float)Math.Sqrt(1 - 4 * (p * p))); + } + else + { + return 0.5f * ((float)Math.Sqrt(-((2 * p) - 3) * ((2 * p) - 1)) + 1); + } + } + + /// + /// Modeled after the exponential function y = 2^(10(x - 1)) + /// + static public float ExponentialEaseIn(float p) + { + return (p == 0.0f) ? p : (float)Math.Pow(2, 10 * (p - 1)); + } + + /// + /// Modeled after the exponential function y = -2^(-10x) + 1 + /// + static public float ExponentialEaseOut(float p) + { + return (p == 1.0f) ? p : 1 - (float)Math.Pow(2, -10 * p); + } + + /// + /// Modeled after the piecewise exponential + /// y = (1/2)2^(10(2x - 1)) ; [0,0.5) + /// y = -(1/2)*2^(-10(2x - 1))) + 1 ; [0.5,1] + /// + static public float ExponentialEaseInOut(float p) + { + if(p == 0.0 || p == 1.0) return p; + + if(p < 0.5f) + { + return 0.5f * (float)Math.Pow(2, (20 * p) - 10); + } + else + { + return -0.5f * (float)Math.Pow(2, (-20 * p) + 10) + 1; + } + } + + /// + /// Modeled after the damped sine wave y = sin(13pi/2*x)*(float)Math.Pow(2, 10 * (x - 1)) + /// + static public float ElasticEaseIn(float p) + { + return (float)Math.Sin(13 * HALFPI * p) * (float)Math.Pow(2, 10 * (p - 1)); + } + + /// + /// Modeled after the damped sine wave y = sin(-13pi/2*(x + 1))*(float)Math.Pow(2, -10x) + 1 + /// + static public float ElasticEaseOut(float p) + { + return (float)Math.Sin(-13 * HALFPI * (p + 1)) * (float)Math.Pow(2, -10 * p) + 1; + } + + /// + /// Modeled after the piecewise exponentially-damped sine wave: + /// y = (1/2)*sin(13pi/2*(2*x))*(float)Math.Pow(2, 10 * ((2*x) - 1)) ; [0,0.5) + /// y = (1/2)*(sin(-13pi/2*((2x-1)+1))*(float)Math.Pow(2,-10(2*x-1)) + 2) ; [0.5, 1] + /// + static public float ElasticEaseInOut(float p) + { + if(p < 0.5f) + { + return 0.5f * (float)Math.Sin(13 * HALFPI * (2 * p)) * (float)Math.Pow(2, 10 * ((2 * p) - 1)); + } + else + { + return 0.5f * ((float)Math.Sin(-13 * HALFPI * ((2 * p - 1) + 1)) * (float)Math.Pow(2, -10 * (2 * p - 1)) + 2); + } + } + + /// + /// Modeled after the overshooting cubic y = x^3-x*sin(x*pi) + /// + static public float BackEaseIn(float p) + { + return p * p * p - p * (float)Math.Sin(p * PI); + } + + /// + /// Modeled after overshooting cubic y = 1-((1-x)^3-(1-x)*sin((1-x)*pi)) + /// + static public float BackEaseOut(float p) + { + float f = (1 - p); + return 1 - (f * f * f - f * (float)Math.Sin(f * PI)); + } + + /// + /// Modeled after the piecewise overshooting cubic function: + /// y = (1/2)*((2x)^3-(2x)*sin(2*x*pi)) ; [0, 0.5) + /// y = (1/2)*(1-((1-x)^3-(1-x)*sin((1-x)*pi))+1) ; [0.5, 1] + /// + static public float BackEaseInOut(float p) + { + if(p < 0.5f) + { + float f = 2 * p; + return 0.5f * (f * f * f - f * (float)Math.Sin(f * PI)); + } + else + { + float f = (1 - (2*p - 1)); + return 0.5f * (1 - (f * f * f - f * (float)Math.Sin(f * PI))) + 0.5f; + } + } + + /// + /// + static public float BounceEaseIn(float p) + { + return 1 - BounceEaseOut(1 - p); + } + + /// + /// + static public float BounceEaseOut(float p) + { + if(p < 4/11.0f) + { + return (121 * p * p)/16.0f; + } + else if(p < 8/11.0f) + { + return (363/40.0f * p * p) - (99/10.0f * p) + 17/5.0f; + } + else if(p < 9/10.0f) + { + return (4356/361.0f * p * p) - (35442/1805.0f * p) + 16061/1805.0f; + } + else + { + return (54/5.0f * p * p) - (513/25.0f * p) + 268/25.0f; + } + } + + /// + /// + static public float BounceEaseInOut(float p) + { + if(p < 0.5f) + { + return 0.5f * BounceEaseIn(p*2); + } + else + { + return 0.5f * BounceEaseOut(p * 2 - 1) + 0.5f; + } + } +} + \ No newline at end of file diff --git a/Sledgemapper.Shared/Entities/Session.cs b/Sledgemapper.Shared/Entities/Session.cs index 42c74fe..4ded5e6 100644 --- a/Sledgemapper.Shared/Entities/Session.cs +++ b/Sledgemapper.Shared/Entities/Session.cs @@ -27,10 +27,11 @@ namespace Sledgemapper.Shared.Entities Overlays = new ConcurrentDictionary(); Walls = new ConcurrentDictionary(); Notes = new ConcurrentDictionary(); - Lines=new ConcurrentDictionary(); - Rooms=new ConcurrentDictionary(); + Lines = new ConcurrentDictionary(); + Rooms = new ConcurrentDictionary(); Players = new List(); Colors = new List(); + Pings = new ConcurrentDictionary(); } public ConcurrentDictionary Map { get; set; } @@ -39,189 +40,190 @@ namespace Sledgemapper.Shared.Entities public ConcurrentDictionary Notes { get; set; } public bool IsValid { get; set; } public List Players { get; set; } - public List Colors { get; set; } - public string SessionName { get; set; } - public int SessionId { get; set; } - public ConcurrentDictionary Lines { get; set; } - public ConcurrentDictionary Rooms { get; set; } + public ConcurrentDictionary Pings { get; set; } + public List Colors { get; set; } + public string SessionName { get; set; } + public int SessionId { get; set; } + public ConcurrentDictionary Lines { get; set; } + public ConcurrentDictionary Rooms { get; set; } - public void NewTile(Tile selectedTile, string tileId) + public void NewTile(Tile selectedTile, string tileId) + { + if (selectedTile is null || string.IsNullOrWhiteSpace(tileId)) { - if (selectedTile is null || string.IsNullOrWhiteSpace(tileId)) - { - return; - } - - var tileExist = Map.TryGetValue(selectedTile.ToString(), out var tile); - var newTile = new Tile { X = selectedTile.X, Y = selectedTile.Y, ID = tileId }; - if (tileExist) - { - Map.TryRemove(tile.ToString(), out var _); - if (tile.ID == tileId) - { - newTile.Rotation = (tile.Rotation + 1) % 4; - } - } - - Map.TryAdd(newTile.ToString(), newTile); - OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newTile)); + return; } - public void NewOverlay(Overlay selectedOverlay, string overlayId) + var tileExist = Map.TryGetValue(selectedTile.ToString(), out var tile); + var newTile = new Tile { X = selectedTile.X, Y = selectedTile.Y, ID = tileId }; + if (tileExist) { - if (selectedOverlay is null || string.IsNullOrWhiteSpace(overlayId)) + Map.TryRemove(tile.ToString(), out var _); + if (tile.ID == tileId) { - return; - } - var overlayExist = Overlays.TryGetValue(selectedOverlay.ToString(), out var overlay); - var newOverlay = new Overlay { X = selectedOverlay.X, Y = selectedOverlay.Y, ID = overlayId, Intersection = selectedOverlay.Intersection }; - if (overlayExist) - { - Overlays.TryRemove(overlay.ToString(), out var _); - if (overlay.ID == overlayId) - { - newOverlay.Rotation = (overlay.Rotation + 1) % 4; - } - } - - Overlays.TryAdd(newOverlay.ToString(), newOverlay); - OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newOverlay)); - } - - public void NewWall(Wall selectedWall, string wallId) - { - if (selectedWall is null || string.IsNullOrWhiteSpace(wallId)) - { - return; - } - var tileExist = Walls.TryGetValue(selectedWall.ToString(), out var wall); - var newWall = new Wall { X = selectedWall.X, Y = selectedWall.Y, ID = wallId, Rotation = selectedWall.Rotation }; - if (tileExist) - { - Walls.TryRemove(wall.ToString(), out var _); - } - - Walls.TryAdd(newWall.ToString(), newWall); - OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newWall)); - } - - public void NewNote(Note selectedNote) - { - if (selectedNote is null) - { - return; - } - var noteExists = Notes.TryGetValue(selectedNote.ToString(), out var note); - var newNote = new Note { X = selectedNote.X, Y = selectedNote.Y, Text=selectedNote.Text }; - if (noteExists) - { - Walls.TryRemove(note.ToString(), out var _); - } - - Notes.TryAdd(newNote.ToString(), newNote); - OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newNote)); - } - - public void DeleteWall(Wall wall) - { - if (wall is null) - { - return; - } - var removed = Walls.TryRemove(wall.ToString(), out var _); - if (removed) - { - OnRaiseMapEntityDeletedEvent(new MapEntityDeletedEventArgs(wall)); + newTile.Rotation = (tile.Rotation + 1) % 4; } } - public void DeleteNote(Note note) + Map.TryAdd(newTile.ToString(), newTile); + OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newTile)); + } + + public void NewOverlay(Overlay selectedOverlay, string overlayId) + { + if (selectedOverlay is null || string.IsNullOrWhiteSpace(overlayId)) { - if (note is null) + return; + } + var overlayExist = Overlays.TryGetValue(selectedOverlay.ToString(), out var overlay); + var newOverlay = new Overlay { X = selectedOverlay.X, Y = selectedOverlay.Y, ID = overlayId, Intersection = selectedOverlay.Intersection }; + if (overlayExist) + { + Overlays.TryRemove(overlay.ToString(), out var _); + if (overlay.ID == overlayId) { - return; - } - var removed = Notes.TryRemove(note.ToString(), out var _); - if (removed) - { - OnRaiseMapEntityDeletedEvent(new MapEntityDeletedEventArgs(note)); + newOverlay.Rotation = (overlay.Rotation + 1) % 4; } } - public void DeleteOverlay(Overlay overlay) + Overlays.TryAdd(newOverlay.ToString(), newOverlay); + OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newOverlay)); + } + + public void NewWall(Wall selectedWall, string wallId) + { + if (selectedWall is null || string.IsNullOrWhiteSpace(wallId)) { - if (overlay is null) - { - return; - } - var removed = Overlays.TryRemove(overlay.ToString(), out var _); - if (removed) - { - OnRaiseMapEntityDeletedEvent(new MapEntityDeletedEventArgs(overlay)); - } + return; + } + var tileExist = Walls.TryGetValue(selectedWall.ToString(), out var wall); + var newWall = new Wall { X = selectedWall.X, Y = selectedWall.Y, ID = wallId, Rotation = selectedWall.Rotation }; + if (tileExist) + { + Walls.TryRemove(wall.ToString(), out var _); } - public void DeleteTile(Tile tile) + Walls.TryAdd(newWall.ToString(), newWall); + OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newWall)); + } + + public void NewNote(Note selectedNote) + { + if (selectedNote is null) { - if (tile is null) - { - return; - } - var removed = Map.TryRemove(tile.ToString(), out var _); - if (removed) - { - OnRaiseMapEntityDeletedEvent(new MapEntityDeletedEventArgs(tile)); - } + return; + } + var noteExists = Notes.TryGetValue(selectedNote.ToString(), out var note); + var newNote = new Note { X = selectedNote.X, Y = selectedNote.Y, Text = selectedNote.Text }; + if (noteExists) + { + Walls.TryRemove(note.ToString(), out var _); } - protected virtual void OnRaiseMapEntityAddedEvent(MapEntityAddedEventArgs e) + Notes.TryAdd(newNote.ToString(), newNote); + OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newNote)); + } + + public void DeleteWall(Wall wall) + { + if (wall is null) { - MapEntityAdded?.Invoke(this, e); + return; } - - protected virtual void OnRaiseMapEntityDeletedEvent(MapEntityDeletedEventArgs e) + var removed = Walls.TryRemove(wall.ToString(), out var _); + if (removed) { - MapEntityDeleted?.Invoke(this, e); - } - - public void NewLine(Line line) - { - if (line is null) - { - return; - } - - var lineExist = Lines.TryGetValue(line.ToString(), out var tile); - var newLine = new Line { Start=line.Start, End=line.End, Width=line.Width}; - if (lineExist) - { - Lines.TryRemove(line.ToString(), out var _); - } - - Lines.TryAdd(newLine.ToString(), newLine); - - //TODO fix this - OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newLine)); - } - - public void NewRoom(Room line) - { - if (line is null) - { - return; - } - - var lineExist = Rooms.TryGetValue(line.ToString(), out var tile); - var newLine = new Room { Start=line.Start, End=line.End, Delete=line.Delete}; - if (lineExist) - { - Rooms.TryRemove(line.ToString(), out var _); - } - - Rooms.TryAdd(newLine.ToString(), newLine); - - //TODO fix this - OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newLine)); + OnRaiseMapEntityDeletedEvent(new MapEntityDeletedEventArgs(wall)); } } + + public void DeleteNote(Note note) + { + if (note is null) + { + return; + } + var removed = Notes.TryRemove(note.ToString(), out var _); + if (removed) + { + OnRaiseMapEntityDeletedEvent(new MapEntityDeletedEventArgs(note)); + } + } + + public void DeleteOverlay(Overlay overlay) + { + if (overlay is null) + { + return; + } + var removed = Overlays.TryRemove(overlay.ToString(), out var _); + if (removed) + { + OnRaiseMapEntityDeletedEvent(new MapEntityDeletedEventArgs(overlay)); + } + } + + public void DeleteTile(Tile tile) + { + if (tile is null) + { + return; + } + var removed = Map.TryRemove(tile.ToString(), out var _); + if (removed) + { + OnRaiseMapEntityDeletedEvent(new MapEntityDeletedEventArgs(tile)); + } + } + + protected virtual void OnRaiseMapEntityAddedEvent(MapEntityAddedEventArgs e) + { + MapEntityAdded?.Invoke(this, e); + } + + protected virtual void OnRaiseMapEntityDeletedEvent(MapEntityDeletedEventArgs e) + { + MapEntityDeleted?.Invoke(this, e); + } + + public void NewLine(Line line) + { + if (line is null) + { + return; + } + + var lineExist = Lines.TryGetValue(line.ToString(), out var tile); + var newLine = new Line { Start = line.Start, End = line.End, Width = line.Width }; + if (lineExist) + { + Lines.TryRemove(line.ToString(), out var _); + } + + Lines.TryAdd(newLine.ToString(), newLine); + + //TODO fix this + OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newLine)); + } + + public void NewRoom(Room line) + { + if (line is null) + { + return; + } + + var lineExist = Rooms.TryGetValue(line.ToString(), out var tile); + var newLine = new Room { Start = line.Start, End = line.End, Delete = line.Delete }; + if (lineExist) + { + Rooms.TryRemove(line.ToString(), out var _); + } + + Rooms.TryAdd(newLine.ToString(), newLine); + + //TODO fix this + OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newLine)); + } +} } diff --git a/Sledgemapper.Shared/Entities/Tile.cs b/Sledgemapper.Shared/Entities/Tile.cs index 0b622d2..f1e21e1 100644 --- a/Sledgemapper.Shared/Entities/Tile.cs +++ b/Sledgemapper.Shared/Entities/Tile.cs @@ -21,6 +21,13 @@ namespace Sledgemapper.Shared.Entities public double Timestamp { get; set; } } + public class Ping : BaseMapEntity + { + public Player Player { get; set; } + public int Iterations {get;set;} + public double StartTime {get;set;} + } + public class Tile : BaseMapEntity { diff --git a/Sledgemapper/CommunicationManager.cs b/Sledgemapper/CommunicationManager.cs index 0fc37b6..9dd0972 100644 --- a/Sledgemapper/CommunicationManager.cs +++ b/Sledgemapper/CommunicationManager.cs @@ -155,6 +155,11 @@ namespace Sledgemapper p.Position = player.Position; } }); + + Connection.On("Ping", (ping) => + { + SessionData.Pings.TryAdd(Guid.NewGuid(), ping); + }); } private Task GetToken() @@ -233,6 +238,14 @@ namespace Sledgemapper } } + + internal async Task Ping(Tile hoveredTile) + { + if (Connection!=null && Connection.State == HubConnectionState.Connected) + { + await Connection.InvokeAsync("Ping",SessionData.SessionName, hoveredTile); + } + } } class AuthenticatedHttpClientHandler : HttpClientHandler diff --git a/Sledgemapper/Content/Content.mgcb b/Sledgemapper/Content/Content.mgcb index d40c401..7b85633 100644 --- a/Sledgemapper/Content/Content.mgcb +++ b/Sledgemapper/Content/Content.mgcb @@ -93,6 +93,23 @@ /processorParam:TextureFormat=Compressed /build:fonts/font99.spritefont +#begin handcursors +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:handcursors + +#begin handcursorsIndex +/importer:XmlImporter +/processor: +/build:handcursorsIndex + #begin icon_delete.png /importer:TextureImporter /processor:TextureProcessor @@ -141,6 +158,23 @@ /processorParam:TextureFormat=Color /build:location.png +#begin rippleSpriteIndex +/importer:XmlImporter +/processor:PassThroughProcessor +/build:rippleSpriteIndex + +#begin rippleSpriteMap +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:rippleSpriteMap + #begin shaders/OutlineShader.fx /importer:EffectImporter /processor:EffectProcessor @@ -380,30 +414,6 @@ /processorParam:TextureFormat=Color /build:walls/wall01.png -#begin walls/wall01.png -/importer:TextureImporter -/processor:TextureProcessor -/processorParam:ColorKeyColor=255,0,255,255 -/processorParam:ColorKeyEnabled=True -/processorParam:GenerateMipmaps=False -/processorParam:PremultiplyAlpha=True -/processorParam:ResizeToPowerOfTwo=False -/processorParam:MakeSquare=False -/processorParam:TextureFormat=Color -/build:walls/wall01.png - -#begin walls/wall02.png -/importer:TextureImporter -/processor:TextureProcessor -/processorParam:ColorKeyColor=255,0,255,255 -/processorParam:ColorKeyEnabled=True -/processorParam:GenerateMipmaps=False -/processorParam:PremultiplyAlpha=True -/processorParam:ResizeToPowerOfTwo=False -/processorParam:MakeSquare=False -/processorParam:TextureFormat=Color -/build:walls/wall02.png - #begin walls/wall02.png /importer:TextureImporter /processor:TextureProcessor @@ -428,18 +438,6 @@ /processorParam:TextureFormat=Color /build:walls/wall03.png -#begin walls/wall03.png -/importer:TextureImporter -/processor:TextureProcessor -/processorParam:ColorKeyColor=255,0,255,255 -/processorParam:ColorKeyEnabled=True -/processorParam:GenerateMipmaps=False -/processorParam:PremultiplyAlpha=True -/processorParam:ResizeToPowerOfTwo=False -/processorParam:MakeSquare=False -/processorParam:TextureFormat=Color -/build:walls/wall03.png - #begin walls/wall04.png /importer:TextureImporter /processor:TextureProcessor @@ -452,30 +450,6 @@ /processorParam:TextureFormat=Color /build:walls/wall04.png -#begin walls/wall04.png -/importer:TextureImporter -/processor:TextureProcessor -/processorParam:ColorKeyColor=255,0,255,255 -/processorParam:ColorKeyEnabled=True -/processorParam:GenerateMipmaps=False -/processorParam:PremultiplyAlpha=True -/processorParam:ResizeToPowerOfTwo=False -/processorParam:MakeSquare=False -/processorParam:TextureFormat=Color -/build:walls/wall04.png - -#begin walls/wall05.png -/importer:TextureImporter -/processor:TextureProcessor -/processorParam:ColorKeyColor=255,0,255,255 -/processorParam:ColorKeyEnabled=True -/processorParam:GenerateMipmaps=False -/processorParam:PremultiplyAlpha=True -/processorParam:ResizeToPowerOfTwo=False -/processorParam:MakeSquare=False -/processorParam:TextureFormat=Color -/build:walls/wall05.png - #begin walls/wall05.png /importer:TextureImporter /processor:TextureProcessor diff --git a/Sledgemapper/Content/handcursors b/Sledgemapper/Content/handcursors new file mode 100644 index 0000000000000000000000000000000000000000..ef1ac08c7e56c616d4294ea5a486f5b6e56dbec8 GIT binary patch literal 4969 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 literal 0 HcmV?d00001 diff --git a/Sledgemapper/Content/handcursorsIndex b/Sledgemapper/Content/handcursorsIndex new file mode 100644 index 0000000..9f60bbe --- /dev/null +++ b/Sledgemapper/Content/handcursorsIndex @@ -0,0 +1,7 @@ + + + +handcursor_000 0 60 60 +handcursor_0161 0 60 60 + + diff --git a/Sledgemapper/Content/rippleSpriteIndex b/Sledgemapper/Content/rippleSpriteIndex new file mode 100644 index 0000000..e345a97 --- /dev/null +++ b/Sledgemapper/Content/rippleSpriteIndex @@ -0,0 +1,24 @@ + + + +ripple_000 0 128 128 +ripple_01129 0 128 128 +ripple_02258 0 128 128 +ripple_030 129 128 128 +ripple_04129 129 128 128 +ripple_050 258 128 128 +ripple_06129 258 128 128 +ripple_07258 129 128 128 +ripple_08258 258 128 128 +ripple_09387 0 128 128 +ripple_10387 129 128 128 +ripple_11516 0 128 128 +ripple_12387 258 128 128 +ripple_13516 129 128 128 +ripple_14645 0 128 128 +ripple_15774 0 128 128 +ripple_16645 129 128 128 +ripple_17516 258 128 128 +ripple_18645 258 128 128 + + diff --git a/Sledgemapper/Content/rippleSpriteMap b/Sledgemapper/Content/rippleSpriteMap new file mode 100644 index 0000000000000000000000000000000000000000..0e766035561f14714ca623e0d6d7f4e06cab4048 GIT binary patch literal 14526 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

o311tF(nr{BtB474%$Fc2 z-fmSZx0R36%jFZ&xa-F1=9ukQkvrnQCCeKEPNE#mzDATEbJZC5Le zzL}j-xNP`qX&?Fn6ph2=9Yj9Dvo&2WeBaac6j^J61##;EQ2vSw6T=p_*c5QTwi$@{-9Iwz@SoJ>Rkv$&aTNhr0)=@$zcnNNfcH+hTBMFZlS9f=F z@jz|7NU9snKQ9p3<)Q47vtP=q3q-yEXTaH`^MW>c8C`b1`=J7ecbIFZLx28%^7&-B zG5hKkG?<16di{t@wTX6m{nTNoU~BaMgmE6m($$BqX@X$$(PQX3j5M`blDl!bCt*$O z5cD0{vuS6%x#zXiis2dX^`a=I*xcy+FR!dhdsQh3K{22VJi}%~v(Z$5t=TxGTWD9! zlK6cR7#eI!d-M|*4<0e|=y6xqear;l8!(tqDc^!1k6-#ZU}PCK>mODj(sP!8y$2l+ zN7UH-Iq_C3#JQDPPz*c7F2b!eBCWSLh<~b)JX>`XOvc@lcD@8Syc*u?A zOZ|@-eN(;%B*G`Pk@PPvOX^Ae(Dk9~b}ql!aPmPf?jK zN>vG9wT5_0^_Od}BGGz$X&VI&eV!nG4(m4Sp6NafHsa?%cR|FDzhn-}F*uZ?L61+O z=<}6VLj}5TU=^I=Oj!jGwg9grN11*>o+C!B;PALdME^xFE;c1gE=E2E6zo;HN#RPT zWd6h;niZ$C3-$s>x?v|TkYNG<7{L@xmNS;FF;7_3);z7}*L5pm?txreP9H>J46F=t zEx{OG^)4UX(8)G%*>Bq`TuAf8C8Cp5OThsN$X>7N>~HQACG+_n*)Z4+wCR*7@D<8_(2)5r;1Be=TL^fY+4M^cIUc2i)1qT89zzT#6a z)TBY3Pn2i8N{3!U36#h|b`|g&&M3@N`B1xHzm{6sJ*}C8D>dR4`#3Fr3J*_p4;URLZRbKooGpY*P{o!LS>{Y5xF3bwV^GlHLFg?x|<5 z!NJ{}LI65}pf?v|ep-1S_l2 zEomM0P^VNq3*s{I>b1`;=W)P%Bbn`Aq9NM%nFHQGXZ(t(1n>fHw$gN(PpWGF3ElQ_ z5AdrVvEjyV4vipLB6gX^KP3do#GF_Uef_871nLi$dN>2!hrtTu1`&f*bE$GPAz8PI zlUt<65eqz*lFLgjOi|PhREg~NxKV}GYm&Qk3%-d>IWMGy7w6)sa{L+?p<4`R1&x!i zp9+KeY*h9_jp*vD>GK~+fv3M3OrGj=8Q~Gk$MNi1H^C)`S(WC%1{;n?5eK+@X7Qv z-D1LG&kgiobcH&B0q`Mmr8l`x#1j`g>s&aJ5->_ZWiH!hGKE2_f10Ta1V8kd#e@W& zVlOeP`Z!4*>NNxS;+kH{ht>@(pQw+T%|oQ<9EHOvciz!NK~r69owwNEY)OkeWDOCV zT1B0r+=8nkjn+QYGcxmDK2MRdmT0v8q)7P>XL78PXh{;P|DYw`fNclgyNTd#JOCz? zut}Un`O`vr+8-yBiK&XLm<67H?+8N~w>Fh5 zN-vTV0-z_45ffd&b+7mcof!yH$9pij@)N0W_@YI$&J|Lf@+DdkGhu6^hIzzY(?aq+O1`yo2Q21Q2+Y=)N0$lM>2#V-!1zJ<# zgck^I@rm$Dq_KyEBb1()mtq+{WZsGZ1vLt?MPdGH`hLl z)wPxiHJcW$*lp+$8~h-WxQyiHj1LFy|2r@|;lAoFUZy+$Jpk%{LwQl~G5-#IaX_0M zgC{@g00;+qa%WFZ{;?Vm--1AH9WWdMPPOcc3_j-zKpezBXq+pN#7iKi^}1~K0nmlw z3LK-adGLV@{yapKKnQ(cfI5PGTZ9&G0uaunn0{(tJDTPjcSEBTM|UoyxlJy1_V9V~ zNpV6iKItLL{(C<=MI{2-s$v>IK+|JBZLSXm<+-;#xQ%k zLl64i4epSV)c@-6zn7Uw1&;Cj_mLp> z=lS%eAaU(2nskId*HUri1VAiyb{5~H9P@Rn_SDFgAD z2I>OXCEGw$M;*_4JJE-j!gmMdj7`tlMA;PMyNm<+$$|F%6Z1M}ixM>Q=`mKnXP4^& zOCH)ruC;$|kxtTVel+nLQ2?3czo86vr0Q*}bLu~(0QLg#;WZHj@Z-;{vR-6D}k0%zS1Iq&crb5u)oR}I|oWfMqeT{4WC7KV;D za1j0PKHgL`{?8o7DjKsQ`_OxBhSXVSC^zq@NZV+q_S?+3yf=0?3#ko) z7o`#XJ!u%7+303;^iY7W%_pPM;EUgvsNL+~Wfi*MbP$!3e1}hYIK5uEx9d>_wcwN` zPLLojimJ5jzSbS(brf9#)GtO@i^N16n{ec`&#D!hTz*GQIBEij5 zT&!vRgzoB#HK(CHX(%iDdv5@3Tx+jd&EXS`6m$S`8uA3~Q|7qn8R^E!-dzWe;)h>& zi^NAb+rNt15K%PRP8oT(wJr<9+D0#|en5--Wwn||LLo^qqO+Z?M)qHA<)}Y^w9Jb- zioiXs3Mwb8e@ftyBQ0{QIXGP$@DSY3L&ZiMTfb3JZ8zIOJHtFiRK??{A*nEms|5b$ zU?#{t0W^el3ek;5-3I(QvG~9PjEh|=|t*fJpS!^-{(v%kREd0uG>B&=aY1t znE?1sp#1tHl#cPGbkhYsa;zPE5y=V(Rqd2UY)X*O8qonx)4z|)D)|{j^r}w3K~4bg z+hS-AV3VOsmK=f#JX<_Y)+6L!u!&osyDMc++qa$U-BQAUy_Y+xYxe#F}jpepxr!Lu@R)`Og~2Qos{S-BtrY3-~ijk0a0 zl7-zr9L#mC2<`%Lvry8w_WJ|Mc5OK10>DB=jtfT|>30)wP`=K^riLC0y4&@FB)RQ{ z7yQq?@aHs{o3_3Gwl|+jQUN||*WubMWh7}-MTRAdb^uTYl;onRpQ#ysMMK#TF=`N) z(`IL+AH*wxY+m6I8kgifNGb&b;Wo;9^cdkVnPLeqgtEGBLvDHez)jkyKuM z;nJl<2bS$h!B}v-y_B&__>;IsGMA^~;T>OFJVKJlT(x#%k55=6W6bF%?HJJ!*S|TqK%>mnK zmtZ}1&Y>Bjn+Z_-d}Xkuj52Lfrl7`5#Zi@UM?l%nzhf*;Y>h2F?bpJO)rk_ZlaL&x zHEVGWP?D}^Ts)^KMVRp*FbEJo^DTld|Laiwhc|r70YXI?T_Qqo9XC!l$$Y;GNNd9y zexhS+wbNfby#F4-(z2Sk3U%S(J$8uuOh{#!_J%kl8+k~jZ}yvPK6KUpZVX@=APdu* zCI3WcVDRoummQ=7)rYm~Zq{%z^Z`bQl!m$lGt1hX&)e3dKwtk~_$=++;38YQri(npVzyAeBxD!Oj)AM|S1$g@X}A9o$)6@upD;vaQw zAug5srIxp-N?IvvNQexrU)S@x#<1Wg?gzfhbpgqTRx#0Z8=W1&_=w2M@AH^`b^5H4 zRpMNJdFK{ubD$_P4~q;ANo*e6n;UIKH^MJLN*b6g`?c*#CemtBWOo>Fo`IkR7}DIz z=??Y1;|1pMY%4^#3O^`o5XLBbGL{RTt%ZGhyRCeI!K?>3kCH-u>{KPnr~sh=EOn5} zLMk*PGn<||IlEaP2+zi59o=fD?3HJs$c`25aa+zr6+9E!G>qk~xgunHJ>7HhwOT=CDa}{QwC(Gnx&Mq4TNY}^!814I` z$7zzZ@O@Fj>%sNaEaWbj#WT`vNM2;Yz%5B~;s>7(vTJ-ij4T-zr!sqTUGrW2Ahk~5 zNzd^eF%R6?ZL^yLwxQ;x1LL#Hl=>DYH_PTtWYU9GNWn1J<5IyKh+lkd`bfFY31+W8 zH{F!LJV27nW!)@Dd~~oeW9IPSwX~(=a=G2Vp~k3spNA%Hs1g?fj-&0WHUj9oVGnuX zB*~!b6(wl9w6%{8y|r$mIjT;5L-pxmu#1Pb-jt9jr?YNYeX6?NotfCeQ7&S)BM#gRgU3_d5!a0?!!by z!zq0SY~c){_U|5;p7qRE-G#lQo}ru^(KN;Ms|rCzI6FQxWp}O`iRIgY3dt47k9=9z5L3e75_w>M8DfwhCKOk!&bnQ?a#sv)%$@L@*sdGj3?_6#I*ETV4O z#Qh;M@(w;Kg2Sqr&C8KnNKvPNJ84k?902h0G>qD>V%p1LlQ?lC3 zcvE9D971kR*`2S!AGvvDZMoxaIiQLZcw`;26ZjRcwL68i)@7~i0`gnhtaO|>NmZTg zZ~EI+9gbT@f~3v7o_==kt40ZcjI2sTLMg7sNFXful>o$eXY8B|r4lLA=L`&Ntil5M zr`rltM@n8JX-cv)5U&E-v^dq-H+s!OgYdq?(PY`Yn5pUpGdSnxwbL<|(4#@pD-MkA zf8+z7gq-2LASEjI`?u6=Mpess2S$BFHxF6DsZV1?8(WdG)E^QQ*%f4xdAb z6wS6f&^n2uyFZTwp-c4m0*V(?jQn)QGU4;;)%RZ;DQJxmqVvS6rQd{7)b|EI!4!6T z;vy?u_^d`AS+a=9x*}%NpZVQX#zxR(6D|*Wb2vKv9bX6aeK#p7`M8meZ-*oeqs0^npTDE!5v%Y! zzJs~6diS18W(#nNK-xB|0Iz8hK`$~NH6IvjuT^cGOC1L!@NI3CEUT;M2}-m?Dk|q( zsZ#<78Qw83W|X%kH*`Cp*S=jUKQdno9Nwcwx`8&r8GlrGlGaHd)STt2J%K4hPcF=E zl(3v-eI4{E>vVZgeu$yf-`<5DjUB+D`j1)iSx^i3)YM!3&yb=42Xt4b=y7aai-DR4 zM6&vhg>udpt zGOVUUAS!l1Y=zmz?|doEH}{2DbKsc&r(D$`nMg$?kV~}loep~paN-*a-wu$#KOT-L zIhp4BUg}vR05>xFWDI(&uH-?QuXw0p+7_!Qn9}rI4v_CVCxor9RplIY9s_6$=nw*G zy$t&@$(MmZj|M~c^ z&@Djt7a*_jE+sqQW1`u>8)Rx35pl59|6+12NiHDl3HZx<|K3OW4j_S@uj-SULtkC7% z3aYQtxM*M8#LFTSc}Ig#sH1o95(U^}_vT{6CUR>@5GJSl~=7J`f zgBr8lk}lOQZ(#=STE3bs-+Vjh{pfTftCnuGd3botani@-u~3wqXWE$YcdzO#C{5kdC9NoQ{QpTe7f ziidG8#N7I+^S&h^(=oN>+&t=C26aozo=;v0o8)Tv^{bMmS^N=d183p08 zw&jgqGve}Ii2VQ(51x}ic(kS>^Eo^y!;D1S(dHOJ5~{f#^h;qKanldMdfVWJM%=2_ zOt;>ig{Uowm1n_!b#-f2)#i>uOIho+*4EQTIJP6J3jmzEx3uCiSzlZ_z7svUwOp9y z!Ky?A5cKFn027j<{YMS#Lp9gm21KjOUZ&^DH%|Zx2C&wm%BB3-k!+TQG7}L|Mv997 z0zfkR3}o?mXRxDxQf19Xqf53Vea&dd5cF5nmW~1m6VzoujzO0JpayC>sLSK?rmin{ zfVEoCm>IRk9GEU(){yCv#^6hH3WzjC>h^x^3^sWn{nJ7OrZCgO7Z9D z=z>A3MIn+`v%S7}R$F#! zMgVxX+&tf4j4rb~>gfy8zFV57u>Sr#CEE#%!|V1})ux|WoehI{VghcR*^IgS4bV&wWXqrPP!%?N zkE|CX<1&FHiV&S6R_*kdwjT42*;~^LQVKh-%0$Xt;2EIwj1koC(-PXK{`|!Yb6!rg zQx43|t+zPMIte}Hszr(&I12AQY$@0FgrsASK4xU)U~oH#@Ex{xni)Ij+{TFB%E)Et zZX#L16Qsho!(n}Fka-;qVxB5g6iRc{5~e5+0$GO!L(Z0m9U^K|_m*E|>oj2BY!s#b&?7?d_i4k^uv?t4ENnu$2gjw!Up;! zI1^P*+NRQh>&0V~7pFSCv|LNFz=zfJvpRCBGnb7rnIbldJvl-d%fPGRw-Fp@&Jo$8 z{`Qj7qB2<6IejDH@ zAnKVpR{n0uU=O60oj&eXgFI39QKZ~P}fUQmr~K_sh)uw+s4)nw(~ zr&0(*e;LU%N^T?~Yf(R}uax!deN9DsvaF9y(j9UV8g}ZhVEG*wcgH((;RspRE}xMy znQ09#2D#XAQiVWnuBkedh2N5KZE3s28zudq$k0SDwc1?RtnDM$(iP^O>dah=sQY$_ z>)H4~vmds8?crC-b_7ZQkP&uWr+zj&<40Tw-x5)2tyIvg9w*HZ9>B9t>&4fpgQw6A z!0xqd+!9KCjd0sI$ai^N_0#d?_j4%#ErJjz7v1;SKZ7_wlp;nySK4C6u%rbD)n(o@#2!N@__gT48a$*j8I~ud6#q zH9DPfrw@ogZ3fnDE5PpDa4JVP5}svhi%3oW{R@nqGm}xWGavEhhO^qf#TWW!u7$vE z?`F2pfk1s%wWH=@Qh9^V^DG@1>Cx|Tt$aO{fUJ#qkIsW?r?5??SSIAC+!~@E#>eDv9JM`7-iKLk= z#zzU6E$#twgWDI;v31)&zPYGmyq>suUS0`PR-ks0hoh5iOrdtq^nUKf(XiS5e6WVN zxhACE=@;+vKrl63+>UFfj;6Xte#mP9Aqgaz$hU%I9~SdtPq0-!gP0PqOqwnSrv0XW zJCUT&K}!?s16b(dpO~}9Q*U0k`g(UkBXZ-Uf#5bc)B{r{DeF$KhG!dhB_P~;A@taJ z(#~#&N_hXfRN}+3!Vd6w_#Xfs_?Th>V3)D9jAvN_0|~@ATNto= zOLVsMV@rSXzXN7I8O0P=D*ktbhhxns+H?s#7wS(zgSmdFqg1ydAub@S3VzdMx9Lo} zsDwF7eCQ03uE2_Q9ofyjFVSvxfv3RthXRhP5~`8)ruPL!i> z^||=gEwa_y6+nL`(mkZKx%bN4kRqgRgZqw&nsNr!eCOh*5H2^yVG`9WNE+$|jxG#TO+f6jO+VvE z{nWs%3&*F{zyB>Df-XF$LCkjlEDbw73d?Okd*_n2_fNavZ=L60Ay2IZ~1Ss rnXx%-9k+E2s`bD8d8qS^9J0YBM+#b(Rs06QWY~4>n_5L0xBvKWVTpnE literal 0 HcmV?d00001 diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 5b81ac8..3b5a22b 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -6,6 +6,7 @@ using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using MonoGame.Extended; +using MonoGame.Extended.VectorDraw; using Myra; using Myra.Graphics2D.Brushes; using Myra.Graphics2D.TextureAtlases; @@ -24,6 +25,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using AsyncAwaitBestPractices; namespace Sledgemapper { @@ -177,6 +179,7 @@ namespace Sledgemapper _lblOverlayName.Visible = false; } + private SpriteSheet _rippleSpriteSheet; Label _lblOverlayName; private void OnTileButtonTouchEntered(object sender, EventArgs e) @@ -221,7 +224,10 @@ namespace Sledgemapper _wallsContent = Content.LoadContentFolder("walls"); _spriteSheet = new SpriteSheet(); - _spriteSheet.LoadContent(Content); + _spriteSheet.LoadContent(Content, "spriteIndex", "sprites"); + _rippleSpriteSheet = new SpriteSheet(); + _rippleSpriteSheet.LoadContent(Content, "handcursorsIndex", "handcursors"); + _lblOverlayName = new Label(); _lblOverlayName.Background = new SolidBrush(Color.SlateGray); _lblOverlayName.Padding = new Myra.Graphics2D.Thickness(4); @@ -375,6 +381,7 @@ namespace Sledgemapper window.ShowModal(_desktop); noteWindow.NoteText.SetKeyboardFocus(); } + private bool _showRipple = false; protected override void Update(GameTime gameTime) { @@ -619,6 +626,17 @@ namespace Sledgemapper } } + if (oldState.IsKeyDown(Keys.LeftShift) && newState.IsKeyUp(Keys.LeftShift)) + { + _communicationManager.Ping(_state.HoveredTile).SafeFireAndForget(); + + _sessionData.Pings.TryAdd(Guid.NewGuid(),new Ping{ + X=_state.HoveredTile.X, +Y=_state.HoveredTile.Y, +Player=new Player{Color=Color.Purple.ToHexString()} + }); + } + foreach (var key in newState.GetPressedKeys()) { switch (key) @@ -688,7 +706,7 @@ namespace Sledgemapper _spriteBatch.Begin( transformMatrix: Matrix.CreateTranslation(_viewportCenter), - sortMode: SpriteSortMode.Texture); + sortMode: SpriteSortMode.Texture, samplerState: SamplerState.PointClamp); DrawTiles(); @@ -711,8 +729,10 @@ namespace Sledgemapper DrawLinePreview(); DrawRoomPreview(); - _spriteBatch.End(); + DrawRipple(gameTime); + + try { @@ -724,6 +744,83 @@ namespace Sledgemapper } base.Draw(gameTime); } + private int _rippleFrameIndex = 0; + + + private void DrawRipple(GameTime gameTime) + { + _spriteBatch.Begin( + blendState: BlendState.NonPremultiplied, + transformMatrix: Matrix.CreateTranslation(_viewportCenter)); + + var durationMs = 2000; + var baseRadius = _state.TileSize / 4f; + var baseOuterRadius = (float)_state.TileSize; + var iterations = 3f; + var guids = _sessionData.Pings.Keys.ToArray(); + + foreach (var guid in guids) + { + var pingFound = _sessionData.Pings.TryGetValue(guid, out var ping); + if (!pingFound) + { + continue; + } + + if (ping.StartTime == 0) + { + ping.StartTime = gameTime.TotalGameTime.TotalMilliseconds; + } + + var x = ping.X * _state.TileSize + _state.TileSize / 2f; + var y = ping.Y * _state.TileSize + _state.TileSize / 2f; + + if (IsOffscreen(new Tile { X = ping.X, Y = ping.Y })) + { + DrawPingPointer(ping, gameTime); + } + else + { + + _spriteBatch.DrawCircle( + center: new Vector2(x, y), + radius: baseRadius, + sides: 20, + color: ping.Player.Color.ToColor(), + thickness: baseRadius); + + for (var i = 0; i < iterations; i++) + { + var cycleTime = (((float)gameTime.TotalGameTime.TotalMilliseconds + (float)i * durationMs / iterations) % durationMs) / durationMs; + var easing = Easings.Interpolate(cycleTime, Easings.Functions.SineEaseInOut); + _spriteBatch.DrawCircle( + center: new Vector2(x, y), + radius: baseRadius + baseOuterRadius * easing, + sides: 20, + color: new Color(ping.Player.Color.ToColor(), (1 - easing)), + thickness: 2 + 5 * (1 - easing)); + + + } + } + } + foreach (var guid in guids) + { + var pingFound = _sessionData.Pings.TryGetValue(guid, out var ping); + if (!pingFound) + { + continue; + } + + if ((gameTime.TotalGameTime.TotalMilliseconds - ping.StartTime) > 20000 ) + { + _sessionData.Pings.TryRemove(guid, out var _); + } + } + + + _spriteBatch.End(); + } private void DrawRoomPreview() { @@ -1440,6 +1537,106 @@ namespace Sledgemapper } } + private void DrawPingPointer(Ping ping, GameTime gameTime) + { + var durationMs = 2000f; + var baseRadius = _state.TileSize / 4f; + var baseOuterRadius = (float)_state.TileSize; + var iterations = 3f; + + + var center = new Point((Window.ClientBounds.Width + 200) / 2 - (int)_viewportCenter.X, Window.ClientBounds.Height / 2 - (int)_viewportCenter.Y); + + var cx = center.X / _state.TileSize; + var cy = center.Y / _state.TileSize; + + var p1 = new Vector2(cx * _state.TileSize, cy * _state.TileSize); + var p2 = new Vector2(ping.X * _state.TileSize, ping.Y * _state.TileSize); + + var p3 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, 0 - _viewportCenter.Y); + var p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); + var ua1 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); + + p3 = new Vector2(200 - _viewportCenter.X, 0 - _viewportCenter.Y); + p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, 0 - _viewportCenter.Y); + var ua2 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); + + p3 = new Vector2(200 - _viewportCenter.X, 0 - _viewportCenter.Y); + p4 = new Vector2(200 - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); + var ua3 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); + + p3 = new Vector2(200 - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); + p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); + var ua4 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); + + var uas = new List { ua1, ua2, ua3, ua4 }; + if (uas.Any(u => u > 0 && u < 1)) + { + var ua = uas.Where(u => u > 0 && u < 1).Min(); + var i = uas.IndexOf(ua); + var x = (p1.X + ua * (p2.X - p1.X)); + var y = (p1.Y + ua * (p2.Y - p1.Y)); + Vector2[] vertexes = new Vector2[0]; + switch (i) + { + case 0: + vertexes = new Vector2[] { new Vector2(x, y), new Vector2(x - 20, y + 10), new Vector2(x - 20, y - 10), new Vector2(x, y) }; + break; + case 1: + y += 20; + vertexes = new Vector2[] { new Vector2(x, y), new Vector2(x - 10, y + 20), new Vector2(x + 10, y + 20), new Vector2(x, y) }; + break; + case 2: + x += 0; + vertexes = new Vector2[] { new Vector2(x, y), new Vector2(x + 20, y + 10), new Vector2(x + 20, y - 10), new Vector2(x, y) }; + break; + case 3: + y -= 20; + vertexes = new Vector2[] { new Vector2(x, y), new Vector2(x - 10, y - 20), new Vector2(x + 10, y - 20), new Vector2(x, y) }; + break; + } + + _spriteBatch.DrawPolygon(Vector2.Zero, vertexes, ping.Player.Color.ToColor(), 4); + + + for (var j = 0; j < iterations; j++) + { + var cycleTime = (((float)gameTime.TotalGameTime.TotalMilliseconds + (float)j * durationMs / iterations) % durationMs) / durationMs; + var easing = Easings.Interpolate(cycleTime, Easings.Functions.SineEaseInOut); + var v2 = new Vector2[vertexes.Length]; + + + var tCenter = new Vector2((vertexes[0].X + vertexes[1].X + vertexes[2].X) / 3f, (vertexes[0].Y + vertexes[1].Y + vertexes[2].Y) / 3f); + + // var v1s = ((v2[0].X-tCenter.X)*(2 * (1 - easing)))+tCenter.X + + for (int i1 = 0; i1 < v2.Length; i1++) + { + + var svx = ((vertexes[i1].X - tCenter.X) * (1 + (2 * easing))) + tCenter.X; + var svy = ((vertexes[i1].Y - tCenter.Y) * (1 + (2 * easing))) + tCenter.Y; + v2[i1] = new Vector2(svx, svy); + } + + _spriteBatch.DrawPolygon( + offset: Vector2.Zero, + points: v2, + color:new Color(ping.Player.Color.ToColor(), 1f-easing), + thickness: 2+2*(1-easing)); + + // _spriteBatch.DrawCircle( + // center: new Vector2(x, y), + // radius: baseRadius + baseOuterRadius * easing, + // sides: 20, + // color: new Color(ping.Player.Color.ToColor(), (1 - easing)), + // thickness: 2 + 5 * (1 - easing)); + + + } + + } + } + private void DrawPlayerPointer(Player player) { var center = new Point((Window.ClientBounds.Width + 200) / 2 - (int)_viewportCenter.X, Window.ClientBounds.Height / 2 - (int)_viewportCenter.Y); @@ -2328,10 +2525,10 @@ namespace Sledgemapper internal Texture2D Texture; internal Dictionary index; - public void LoadContent(ContentManager content) + public void LoadContent(ContentManager content, string spriteIndex, string texture) { - index = content.Load>("spriteIndex"); - Texture = content.Load("sprites"); + index = content.Load>(spriteIndex); + Texture = content.Load(texture); } internal Rectangle? SourceRectangle(string spriteName) @@ -2349,4 +2546,6 @@ namespace Sledgemapper } } } + + } From efc9e13737766013a80e786e5b96b0094ee1051e Mon Sep 17 00:00:00 2001 From: Michele Date: Wed, 10 Feb 2021 23:27:20 +0000 Subject: [PATCH 10/12] improvin player pointers --- Sledgemapper/CommunicationManager.cs | 4 +- Sledgemapper/Settings.cs | 2 +- Sledgemapper/Sledgemapper.cs | 259 ++++++++------------------- 3 files changed, 76 insertions(+), 189 deletions(-) diff --git a/Sledgemapper/CommunicationManager.cs b/Sledgemapper/CommunicationManager.cs index 9dd0972..ccb35e9 100644 --- a/Sledgemapper/CommunicationManager.cs +++ b/Sledgemapper/CommunicationManager.cs @@ -239,11 +239,11 @@ namespace Sledgemapper } - internal async Task Ping(Tile hoveredTile) + internal async Task Ping(Tile location) { if (Connection!=null && Connection.State == HubConnectionState.Connected) { - await Connection.InvokeAsync("Ping",SessionData.SessionName, hoveredTile); + await Connection.InvokeAsync("Ping",SessionData.SessionName, location); } } } diff --git a/Sledgemapper/Settings.cs b/Sledgemapper/Settings.cs index 25b39f6..e6f884f 100644 --- a/Sledgemapper/Settings.cs +++ b/Sledgemapper/Settings.cs @@ -19,7 +19,7 @@ namespace Sledgemapper GridColor = Color.Black; NoteColor = Color.DarkRed; OverlayTintColor = new Color(24, 118, 157); -TileDeleteDivider=14; + TileDeleteDivider = 14; try { MachineName = Environment.MachineName; diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 3b5a22b..51b0cc0 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -456,6 +456,8 @@ namespace Sledgemapper var newNoteButton = new TextButton { Text = "New Note", Width = 80, Height = 20, Padding = new Myra.Graphics2D.Thickness(2), HorizontalAlignment = HorizontalAlignment.Left }; newNoteButton.Click += OnContextMenuNewNoteClick; popup.AddChild(newNoteButton); + + } else { @@ -470,6 +472,12 @@ namespace Sledgemapper popup.AddChild(deleteNoteButton); } + var pingButton = new TextButton { Text = "Ping", Width = 80, Height = 20, Padding = new Myra.Graphics2D.Thickness(2), HorizontalAlignment = HorizontalAlignment.Left }; + //pingButton.Click += OnContextMenuPingClick; + var location = new Tile { X = _state.HoveredTile.X, Y = _state.HoveredTile.Y }; + pingButton.Click += (s, e) => OnContextMenuPingClick(s, e, location); + popup.AddChild(pingButton); + _desktop.ShowContextMenu(popup, mouseState.Position); } @@ -629,12 +637,6 @@ namespace Sledgemapper if (oldState.IsKeyDown(Keys.LeftShift) && newState.IsKeyUp(Keys.LeftShift)) { _communicationManager.Ping(_state.HoveredTile).SafeFireAndForget(); - - _sessionData.Pings.TryAdd(Guid.NewGuid(),new Ping{ - X=_state.HoveredTile.X, -Y=_state.HoveredTile.Y, -Player=new Player{Color=Color.Purple.ToHexString()} - }); } foreach (var key in newState.GetPressedKeys()) @@ -688,10 +690,17 @@ Player=new Player{Color=Color.Purple.ToHexString()} var center = new Point((Window.ClientBounds.Width + 200) / 2 - _state.TileSize / 2, Window.ClientBounds.Height / 2 - _state.TileSize / 2); var dx = center.X - x * _state.TileSize - _viewportCenter.X; var dy = center.Y - y * _state.TileSize - _viewportCenter.Y; + _viewportCenter.X += dx; _viewportCenter.Y += dy; } + private void OnContextMenuPingClick(object sender, EventArgs e, Tile location) + { + _desktop.HideContextMenu(); + _communicationManager.Ping(location).SafeFireAndForget(); + } + protected override void Draw(GameTime gameTime) { if (_spriteBatch is null) @@ -812,7 +821,7 @@ Player=new Player{Color=Color.Purple.ToHexString()} continue; } - if ((gameTime.TotalGameTime.TotalMilliseconds - ping.StartTime) > 20000 ) + if ((gameTime.TotalGameTime.TotalMilliseconds - ping.StartTime) > 3000) { _sessionData.Pings.TryRemove(guid, out var _); } @@ -1089,88 +1098,16 @@ Player=new Player{Color=Color.Purple.ToHexString()} var isoffscreen = IsOffscreen(_state.SelectedTile); if (isoffscreen) { - var center = new Point((Window.ClientBounds.Width + 200) / 2 - (int)_viewportCenter.X, Window.ClientBounds.Height / 2 - (int)_viewportCenter.Y); - - var cx = center.X / _state.TileSize; - var cy = center.Y / _state.TileSize; - - var p1 = new Vector2(cx * _state.TileSize, cy * _state.TileSize); - var p2 = new Vector2(_state.SelectedTile.X * _state.TileSize, _state.SelectedTile.Y * _state.TileSize); - - var p3 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, 0 - _viewportCenter.Y); - var p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); - var ua1 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); - - p3 = new Vector2(200 - _viewportCenter.X, 0 - _viewportCenter.Y); - p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, 0 - _viewportCenter.Y); - var ua2 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); - - p3 = new Vector2(200 - _viewportCenter.X, 0 - _viewportCenter.Y); - p4 = new Vector2(200 - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); - var ua3 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); - - p3 = new Vector2(200 - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); - p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); - var ua4 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); - - var uas = new float[] { ua1, ua2, ua3, ua4 }; - if (uas.Any(u => u > 0 && u < 1)) + var validPointer = GetPointerVector(new Point(_state.SelectedTile.X, _state.SelectedTile.Y), out var points); + if (validPointer) { - var ua = uas.Where(u => u > 0 && u < 1).Min(); - - int i = 0; - for (var j = 0; j < 4; j++) - { - if (uas[j] == ua) - { - i = j; - } - } - - - var x = (p1.X + ua * (p2.X - p1.X)); - var y = (p1.Y + ua * (p2.Y - p1.Y)); - - - var v = _vector2Pool.Rent(4); - switch (i) - { - case 0: - v[0] = new Vector2(x, y); - v[1] = new Vector2(x - 20, y + 10); - v[2] = new Vector2(x - 20, y - 10); - v[3] = new Vector2(x, y); - break; - case 1: - v[0] = new Vector2(x, y); - v[1] = new Vector2(x - 10, y + 20); - v[2] = new Vector2(x + 10, y + 20); - v[3] = new Vector2(x, y); - y += 20; - break; - case 2: - x += 0; - v[0] = new Vector2(x, y); - v[1] = new Vector2(x + 20, y + 10); - v[2] = new Vector2(x + 20, y - 10); - v[3] = new Vector2(x, y); - break; - case 3: - y -= 20; - v[0] = new Vector2(x, y); - v[1] = new Vector2(x - 10, y - 20); - v[2] = new Vector2(x + 10, y - 20); - v[3] = new Vector2(x, y); - break; - } - _spriteBatch.DrawPolygon(Vector2.Zero, v, Color.Red, 2); - _vector2Pool.Return(v); - + _spriteBatch.DrawPolygon(Vector2.Zero, points, Color.Red, 2); } } - - - _spriteBatch.DrawRectangle(new Rectangle((_state.SelectedTile.X * _state.TileSize) - 2, (_state.SelectedTile.Y * _state.TileSize) - 2, _state.TileSize + 3, _state.TileSize + 3), Color.Red, 2); + else + { + _spriteBatch.DrawRectangle(new Rectangle((_state.SelectedTile.X * _state.TileSize) - 2, (_state.SelectedTile.Y * _state.TileSize) - 2, _state.TileSize + 3, _state.TileSize + 3), Color.Red, 2); + } } } @@ -1543,124 +1480,67 @@ Player=new Player{Color=Color.Purple.ToHexString()} var baseRadius = _state.TileSize / 4f; var baseOuterRadius = (float)_state.TileSize; var iterations = 3f; + var validPointer = GetPointerVector(new Point(ping.X, ping.Y), out var points); - - var center = new Point((Window.ClientBounds.Width + 200) / 2 - (int)_viewportCenter.X, Window.ClientBounds.Height / 2 - (int)_viewportCenter.Y); - - var cx = center.X / _state.TileSize; - var cy = center.Y / _state.TileSize; - - var p1 = new Vector2(cx * _state.TileSize, cy * _state.TileSize); - var p2 = new Vector2(ping.X * _state.TileSize, ping.Y * _state.TileSize); - - var p3 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, 0 - _viewportCenter.Y); - var p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); - var ua1 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); - - p3 = new Vector2(200 - _viewportCenter.X, 0 - _viewportCenter.Y); - p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, 0 - _viewportCenter.Y); - var ua2 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); - - p3 = new Vector2(200 - _viewportCenter.X, 0 - _viewportCenter.Y); - p4 = new Vector2(200 - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); - var ua3 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); - - p3 = new Vector2(200 - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); - p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); - var ua4 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); - - var uas = new List { ua1, ua2, ua3, ua4 }; - if (uas.Any(u => u > 0 && u < 1)) + if (validPointer) { - var ua = uas.Where(u => u > 0 && u < 1).Min(); - var i = uas.IndexOf(ua); - var x = (p1.X + ua * (p2.X - p1.X)); - var y = (p1.Y + ua * (p2.Y - p1.Y)); - Vector2[] vertexes = new Vector2[0]; - switch (i) - { - case 0: - vertexes = new Vector2[] { new Vector2(x, y), new Vector2(x - 20, y + 10), new Vector2(x - 20, y - 10), new Vector2(x, y) }; - break; - case 1: - y += 20; - vertexes = new Vector2[] { new Vector2(x, y), new Vector2(x - 10, y + 20), new Vector2(x + 10, y + 20), new Vector2(x, y) }; - break; - case 2: - x += 0; - vertexes = new Vector2[] { new Vector2(x, y), new Vector2(x + 20, y + 10), new Vector2(x + 20, y - 10), new Vector2(x, y) }; - break; - case 3: - y -= 20; - vertexes = new Vector2[] { new Vector2(x, y), new Vector2(x - 10, y - 20), new Vector2(x + 10, y - 20), new Vector2(x, y) }; - break; - } - - _spriteBatch.DrawPolygon(Vector2.Zero, vertexes, ping.Player.Color.ToColor(), 4); + _spriteBatch.DrawPolygon(Vector2.Zero, points, ping.Player.Color.ToColor(), 4); for (var j = 0; j < iterations; j++) { var cycleTime = (((float)gameTime.TotalGameTime.TotalMilliseconds + (float)j * durationMs / iterations) % durationMs) / durationMs; var easing = Easings.Interpolate(cycleTime, Easings.Functions.SineEaseInOut); - var v2 = new Vector2[vertexes.Length]; - + var v2 = new Vector2[points.Length]; - var tCenter = new Vector2((vertexes[0].X + vertexes[1].X + vertexes[2].X) / 3f, (vertexes[0].Y + vertexes[1].Y + vertexes[2].Y) / 3f); - // var v1s = ((v2[0].X-tCenter.X)*(2 * (1 - easing)))+tCenter.X + var tCenter = new Vector2((points[0].X + points[1].X + points[2].X) / 3f, (points[0].Y + points[1].Y + points[2].Y) / 3f); + for (int i1 = 0; i1 < v2.Length; i1++) { - var svx = ((vertexes[i1].X - tCenter.X) * (1 + (2 * easing))) + tCenter.X; - var svy = ((vertexes[i1].Y - tCenter.Y) * (1 + (2 * easing))) + tCenter.Y; + var svx = ((points[i1].X - tCenter.X) * (1 + (2 * easing))) + tCenter.X; + var svy = ((points[i1].Y - tCenter.Y) * (1 + (2 * easing))) + tCenter.Y; v2[i1] = new Vector2(svx, svy); } _spriteBatch.DrawPolygon( offset: Vector2.Zero, points: v2, - color:new Color(ping.Player.Color.ToColor(), 1f-easing), - thickness: 2+2*(1-easing)); - - // _spriteBatch.DrawCircle( - // center: new Vector2(x, y), - // radius: baseRadius + baseOuterRadius * easing, - // sides: 20, - // color: new Color(ping.Player.Color.ToColor(), (1 - easing)), - // thickness: 2 + 5 * (1 - easing)); - + color: new Color(ping.Player.Color.ToColor(), 1f - easing), + thickness: 2 + 2 * (1 - easing)); } } } - private void DrawPlayerPointer(Player player) + private bool GetPointerVector(Point target, out Vector2[] points) { - var center = new Point((Window.ClientBounds.Width + 200) / 2 - (int)_viewportCenter.X, Window.ClientBounds.Height / 2 - (int)_viewportCenter.Y); + var leftBound = 200; + var topBound = 75; + var bottomBound = 25; + points = new Vector2[0]; + var center = new Point((Window.ClientBounds.Width + leftBound) / 2 - (int)_viewportCenter.X, Window.ClientBounds.Height / 2 - (int)_viewportCenter.Y); - var cx = center.X / _state.TileSize; - var cy = center.Y / _state.TileSize; + var p1 = new Vector2(center.X, center.Y); + var p2 = new Vector2(target.X * _state.TileSize, target.Y * _state.TileSize); - var p1 = new Vector2(cx * _state.TileSize, cy * _state.TileSize); - var p2 = new Vector2(player.Position.X * _state.TileSize, player.Position.Y * _state.TileSize); - - var p3 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, 0 - _viewportCenter.Y); - var p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); + var p3 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, topBound - _viewportCenter.Y); + var p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y-bottomBound); var ua1 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); - p3 = new Vector2(200 - _viewportCenter.X, 0 - _viewportCenter.Y); - p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, 0 - _viewportCenter.Y); + p3 = new Vector2(leftBound - _viewportCenter.X, topBound - _viewportCenter.Y); + p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, topBound - _viewportCenter.Y); var ua2 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); - p3 = new Vector2(200 - _viewportCenter.X, 0 - _viewportCenter.Y); - p4 = new Vector2(200 - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); + p3 = new Vector2(leftBound - _viewportCenter.X, topBound - _viewportCenter.Y); + p4 = new Vector2(leftBound - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y-bottomBound); var ua3 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); - p3 = new Vector2(200 - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); - p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y); + p3 = new Vector2(leftBound - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y-bottomBound); + p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y-bottomBound); var ua4 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); var uas = new List { ua1, ua2, ua3, ua4 }; @@ -1670,26 +1550,33 @@ Player=new Player{Color=Color.Purple.ToHexString()} var i = uas.IndexOf(ua); var x = (p1.X + ua * (p2.X - p1.X)); var y = (p1.Y + ua * (p2.Y - p1.Y)); - Vector2[] vertexes = new Vector2[0]; + switch (i) { case 0: - vertexes = new Vector2[] { new Vector2(x, y), new Vector2(x - 20, y + 10), new Vector2(x - 20, y - 10), new Vector2(x, y) }; + points = new Vector2[] { new Vector2(x, y), new Vector2(x - 20, y - 10), new Vector2(x - 20, y + 10),new Vector2(x, y) }; break; case 1: - y += 20; - vertexes = new Vector2[] { new Vector2(x, y), new Vector2(x - 10, y + 20), new Vector2(x + 10, y + 20), new Vector2(x, y) }; + points = new Vector2[] { new Vector2(x, y), new Vector2(x - 10, y + 20), new Vector2(x + 10, y + 20), new Vector2(x, y) }; break; case 2: - x += 0; - vertexes = new Vector2[] { new Vector2(x, y), new Vector2(x + 20, y + 10), new Vector2(x + 20, y - 10), new Vector2(x, y) }; + points = new Vector2[] { new Vector2(x, y), new Vector2(x + 20, y + 10), new Vector2(x + 20, y - 10), new Vector2(x, y) }; break; case 3: - y -= 20; - vertexes = new Vector2[] { new Vector2(x, y), new Vector2(x - 10, y - 20), new Vector2(x + 10, y - 20), new Vector2(x, y) }; + points = new Vector2[] { new Vector2(x, y), new Vector2(x + 10, y - 20),new Vector2(x - 10, y - 20), new Vector2(x, y) }; break; } - _spriteBatch.DrawPolygon(Vector2.Zero, vertexes, player.Color.ToColor(), 2); + return true; + } + return false; + } + + private void DrawPlayerPointer(Player player) + { + var validPointer = GetPointerVector(new Point(player.Position.X, player.Position.Y), out var points); + if (validPointer) + { + _spriteBatch.DrawPolygon(Vector2.Zero, points, player.Color.ToColor(), 2); } } @@ -1697,20 +1584,18 @@ Player=new Player{Color=Color.Purple.ToHexString()} private bool IsOffscreen(Tile position) { - var visibleTilesX = GraphicsDevice.Viewport.Width / _state.TileSize + 1; - var visibleTilesY = GraphicsDevice.Viewport.Height / _state.TileSize + 1; + var boxTL = new Point(200 - _state.TileSize / 2, 75 - _state.TileSize / 2); + var boxBR = new Point(GraphicsDevice.Viewport.Width + _state.TileSize / 2, GraphicsDevice.Viewport.Height - 25 + _state.TileSize / 2); - var screenPositionTopLeft = new Point(200 - _state.TileSize + 0 * _state.TileSize - (int)_viewportCenter.X, 0 * _state.TileSize + _state.TileSize - (int)_viewportCenter.Y); - var screenPositionBottomRight = new Point(visibleTilesX * _state.TileSize - (int)_viewportCenter.X, visibleTilesY * _state.TileSize - 20 - (int)_viewportCenter.Y); - var tileTopLeft = new Point(screenPositionTopLeft.X / _state.TileSize, screenPositionTopLeft.Y / _state.TileSize); - var tileBottomRight = new Point(screenPositionBottomRight.X / _state.TileSize, screenPositionBottomRight.Y / _state.TileSize); + var tileTL = new Point(position.X * _state.TileSize + (int)_viewportCenter.X, position.Y * _state.TileSize + (int)_viewportCenter.Y); + var tileBR = new Point(position.X * _state.TileSize + (int)_viewportCenter.X + _state.TileSize, position.Y * _state.TileSize + (int)_viewportCenter.Y + _state.TileSize); - if (position.X < tileTopLeft.X || position.Y < tileTopLeft.Y || position.X > tileBottomRight.X || position.Y > tileBottomRight.Y) + if (tileTL.X <= boxTL.X || tileTL.Y <= boxTL.Y || tileBR.X >= boxBR.X || tileBR.Y >= boxBR.Y) { return true; } - return false; + return false; } private int _borderWidth => (_state.TileSize / 6) % 2 == 0 ? (_state.TileSize / 6) : (_state.TileSize / 6) + 1; @@ -2304,6 +2189,8 @@ Player=new Player{Color=Color.Purple.ToHexString()} noteWindow.NoteText.SetKeyboardFocus(); } + + private void OnContextMenuDeleteNoteClick(object sender, EventArgs e) { _desktop.HideContextMenu(); From 73c8ca4e0fcf074cf251248198b8b9608a1d2ef3 Mon Sep 17 00:00:00 2001 From: Michele Date: Thu, 11 Feb 2021 10:03:40 +0000 Subject: [PATCH 11/12] refined player pointers. final ping changes --- Sledgemapper/Settings.cs | 2 ++ Sledgemapper/Sledgemapper.cs | 68 +++++++++++++++++++++++------------- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/Sledgemapper/Settings.cs b/Sledgemapper/Settings.cs index e6f884f..3188725 100644 --- a/Sledgemapper/Settings.cs +++ b/Sledgemapper/Settings.cs @@ -12,6 +12,7 @@ namespace Sledgemapper public Color NoteColor { get; set; } public string MachineName { get; set; } public int TileDeleteDivider { get; set; } + public int PingDuration {get;set;} public Settings() { @@ -20,6 +21,7 @@ namespace Sledgemapper NoteColor = Color.DarkRed; OverlayTintColor = new Color(24, 118, 157); TileDeleteDivider = 14; + PingDuration = 4000; try { MachineName = Environment.MachineName; diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 51b0cc0..2b7723c 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -634,7 +634,7 @@ namespace Sledgemapper } } - if (oldState.IsKeyDown(Keys.LeftShift) && newState.IsKeyUp(Keys.LeftShift)) + if (oldState.IsKeyDown(Keys.P) && newState.IsKeyUp(Keys.P)) { _communicationManager.Ping(_state.HoveredTile).SafeFireAndForget(); } @@ -738,11 +738,11 @@ namespace Sledgemapper DrawLinePreview(); DrawRoomPreview(); + _spriteBatch.End(); + DrawRipple(gameTime); - - try { _desktop?.Render(); @@ -753,8 +753,6 @@ namespace Sledgemapper } base.Draw(gameTime); } - private int _rippleFrameIndex = 0; - private void DrawRipple(GameTime gameTime) { @@ -821,7 +819,7 @@ namespace Sledgemapper continue; } - if ((gameTime.TotalGameTime.TotalMilliseconds - ping.StartTime) > 3000) + if ((gameTime.TotalGameTime.TotalMilliseconds - ping.StartTime) > _settings.PingDuration) { _sessionData.Pings.TryRemove(guid, out var _); } @@ -1343,11 +1341,12 @@ namespace Sledgemapper var playerCells = _sessionData.Players.Select(m => m.Position).Distinct().ToList(); - foreach (var cell in playerCells) + foreach (var cell in playerCells.Where(c => !IsOffscreen(c))) { var playersInCell = _sessionData.Players.Where(m => m.Position == cell).ToList(); var i = 0; foreach (var player in playersInCell) + { var color = player.Color.ToColor(); @@ -1365,7 +1364,7 @@ namespace Sledgemapper _state.TileSize - 1, _state.TileSize - 1); stringPosition = new Vector2( - player.Position.X * _state.TileSize, + player.Position.X * _state.TileSize + 1, player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale); } else if (playersInCell.Count == 2) @@ -1380,7 +1379,7 @@ namespace Sledgemapper _state.TileSize / 2 - 1, _state.TileSize - 1); stringPosition = new Vector2( - player.Position.X * _state.TileSize, + player.Position.X * _state.TileSize + 1, player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale); } else @@ -1391,7 +1390,7 @@ namespace Sledgemapper _state.TileSize / 2 - 1, _state.TileSize - 1); stringPosition = new Vector2( - player.Position.X * _state.TileSize + _state.TileSize / 2, + player.Position.X * _state.TileSize + _state.TileSize / 2 + 1, player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale); } i++; @@ -1408,7 +1407,7 @@ namespace Sledgemapper _state.TileSize / 2 - 1, _state.TileSize / 2 - 1); stringPosition = new Vector2( - player.Position.X * _state.TileSize, + player.Position.X * _state.TileSize + 1, player.Position.Y * _state.TileSize + _state.TileSize / 2 - measure.Y * fscale); break; @@ -1419,7 +1418,7 @@ namespace Sledgemapper _state.TileSize / 2 - 1, _state.TileSize / 2 - 1); stringPosition = new Vector2( - player.Position.X * _state.TileSize + _state.TileSize / 2, + player.Position.X * _state.TileSize + _state.TileSize / 2 + 1, player.Position.Y * _state.TileSize + _state.TileSize / 2 - measure.Y * fscale); break; @@ -1430,7 +1429,7 @@ namespace Sledgemapper _state.TileSize / 2 - 1, _state.TileSize / 2 - 1); stringPosition = new Vector2( - player.Position.X * _state.TileSize, + player.Position.X * _state.TileSize + 1, player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale); break; @@ -1442,7 +1441,7 @@ namespace Sledgemapper _state.TileSize / 2 - 1, _state.TileSize / 2 - 1); stringPosition = new Vector2( - player.Position.X * _state.TileSize + _state.TileSize / 2, + player.Position.X * _state.TileSize + _state.TileSize / 2 + 1, player.Position.Y * _state.TileSize + _state.TileSize - measure.Y * fscale); break; @@ -1518,17 +1517,32 @@ namespace Sledgemapper private bool GetPointerVector(Point target, out Vector2[] points) { - var leftBound = 200; - var topBound = 75; - var bottomBound = 25; + var offset = _state.TileSize / 2; + var leftBound = 200 + offset; + var topBound = 75 + offset; + var bottomBound = 25 + offset; + var rightBound = offset; points = new Vector2[0]; var center = new Point((Window.ClientBounds.Width + leftBound) / 2 - (int)_viewportCenter.X, Window.ClientBounds.Height / 2 - (int)_viewportCenter.Y); + // center var p1 = new Vector2(center.X, center.Y); - var p2 = new Vector2(target.X * _state.TileSize, target.Y * _state.TileSize); - var p3 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, topBound - _viewportCenter.Y); - var p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y-bottomBound); + // point + var p2 = new Vector2( + target.X * _state.TileSize + offset, + target.Y * _state.TileSize + offset); + + // top right + var p3 = new Vector2( + Window.ClientBounds.Width - _viewportCenter.X - rightBound, + topBound - _viewportCenter.Y); + + //bottom right + var p4 = new Vector2( + Window.ClientBounds.Width - _viewportCenter.X - rightBound, + Window.ClientBounds.Height - _viewportCenter.Y - bottomBound); + var ua1 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); p3 = new Vector2(leftBound - _viewportCenter.X, topBound - _viewportCenter.Y); @@ -1536,11 +1550,11 @@ namespace Sledgemapper var ua2 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); p3 = new Vector2(leftBound - _viewportCenter.X, topBound - _viewportCenter.Y); - p4 = new Vector2(leftBound - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y-bottomBound); + p4 = new Vector2(leftBound - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y - bottomBound); var ua3 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); - p3 = new Vector2(leftBound - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y-bottomBound); - p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y-bottomBound); + p3 = new Vector2(leftBound - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y - bottomBound); + p4 = new Vector2(Window.ClientBounds.Width - _viewportCenter.X, Window.ClientBounds.Height - _viewportCenter.Y - bottomBound); var ua4 = ((p4.X - p3.X) * (p1.Y - p3.Y) - (p4.Y - p3.Y) * (p1.X - p3.X)) / ((p4.Y - p3.Y) * (p2.X - p1.X) - (p4.X - p3.X) * (p2.Y - p1.Y)); var uas = new List { ua1, ua2, ua3, ua4 }; @@ -1554,16 +1568,20 @@ namespace Sledgemapper switch (i) { case 0: - points = new Vector2[] { new Vector2(x, y), new Vector2(x - 20, y - 10), new Vector2(x - 20, y + 10),new Vector2(x, y) }; + x += offset; + points = new Vector2[] { new Vector2(x, y), new Vector2(x - 20, y - 10), new Vector2(x - 20, y + 10), new Vector2(x, y) }; break; case 1: + y -= offset; points = new Vector2[] { new Vector2(x, y), new Vector2(x - 10, y + 20), new Vector2(x + 10, y + 20), new Vector2(x, y) }; break; case 2: + x -= offset; points = new Vector2[] { new Vector2(x, y), new Vector2(x + 20, y + 10), new Vector2(x + 20, y - 10), new Vector2(x, y) }; break; case 3: - points = new Vector2[] { new Vector2(x, y), new Vector2(x + 10, y - 20),new Vector2(x - 10, y - 20), new Vector2(x, y) }; + y += offset; + points = new Vector2[] { new Vector2(x, y), new Vector2(x + 10, y - 20), new Vector2(x - 10, y - 20), new Vector2(x, y) }; break; } return true; From 9e9e03b4c7fa255d48890c65a23b8ed6e14acb47 Mon Sep 17 00:00:00 2001 From: Michele Date: Thu, 11 Feb 2021 10:04:56 +0000 Subject: [PATCH 12/12] remove commented out code --- Sledgemapper/Sledgemapper.cs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 2b7723c..07b9220 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -154,7 +154,6 @@ namespace Sledgemapper { var indexX = 0; var indexY = 0; - //foreach (var item in spriteSheet.index) grid.Widgets.Clear(); _mainWidget.ScrOverlay.ResetScroll(); foreach (var item in spriteSheet.index.Where(t => String.IsNullOrWhiteSpace(e) || t.Key.ToLower().Contains(e.ToLower()))) @@ -190,7 +189,6 @@ namespace Sledgemapper _lblOverlayName.Visible = true; _lblOverlayName.Text = ((ImageButton)sender).Id; _desktop.ShowContextMenu(_lblOverlayName, mouseState); - // _lblOverlayName.true; } protected override void LoadContent() @@ -255,20 +253,7 @@ namespace Sledgemapper private void OnTxtOverlaySearchChange(object sender, ValueChangedEventArgs e) { - // var filteredWidget = _mainWidget.GridOverlays.Widgets.Where(m => m.Id.ToLower().Contains(e.NewValue.ToLower())).ToArray(); - // foreach (var w in _mainWidget.GridOverlays.Widgets) - // { - // w. - // w.Visible = false; - // } - - // foreach (var w in filteredWidget) - // { - // w.Visible = true; - // } - AddItemToToolGrid(_mainWidget.GridOverlays, OnOverlayButtonClicked, _spriteSheet, e.NewValue); - } private void OnBtnToolbarDeleteClicked(object sender, EventArgs e) @@ -381,7 +366,6 @@ namespace Sledgemapper window.ShowModal(_desktop); noteWindow.NoteText.SetKeyboardFocus(); } - private bool _showRipple = false; protected override void Update(GameTime gameTime) { @@ -473,7 +457,6 @@ namespace Sledgemapper } var pingButton = new TextButton { Text = "Ping", Width = 80, Height = 20, Padding = new Myra.Graphics2D.Thickness(2), HorizontalAlignment = HorizontalAlignment.Left }; - //pingButton.Click += OnContextMenuPingClick; var location = new Tile { X = _state.HoveredTile.X, Y = _state.HoveredTile.Y }; pingButton.Click += (s, e) => OnContextMenuPingClick(s, e, location); popup.AddChild(pingButton);