前幾天寫了一個六邊形陣列的算法,今天周末比較閑,下午沒事就做了做兵棋的地圖操作,一點一點的做吧,總會做好,畢竟我也經常玩各種棋,對做一個這類型的小游戲非常感興趣。
首先來解釋下,下面要出現代碼的操作。如上圖,當鼠標指針移動到地圖的四個邊時,地圖會自動左右上下滑動(地圖比這個from要大很多,不這么做地圖顯示不完整了,不要跟我說用滾動條,那個給人感覺不好,這也是兵棋里不會缺少的操作吧),同時下面的消息框會記錄鼠標的位置,這個消息框前期為我開發時顯示一些測試信息用的,后期應該會把它改成一個功能區(部隊參數、將領參數、環境參數、消息顯示等等吧)
下面把源代碼放出來,懂得大大們可以指點下怎么做。
C#開發中,控件和控件之間的消息傳遞有多種方式,我一般選擇委托,畢竟靈活方便。以下是兩種傳遞消息的模式,我選擇了第一個,放棄了第二個;其實個人覺得第二個方法更優秀,它作為一個繼承基類,可以很安全的把消息傳遞給它的上層類;第一種采用靜態,優勢是靈活方便,弊端是一個委托幾乎只在一個功能上使用。
選擇的傳遞消息模式
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace UI 7 { 8 public enum MsgType 9 { 10 /// <summary> 11 /// 常規消息顯示(黑色) 12 /// </summary> 13 Show, 14 /// <summary> 15 /// 提示信息(綠色) 16 /// </summary> 17 Info, 18 /// <summary> 19 /// 狀態欄顯示 20 /// </summary> 21 State, 22 /// <summary> 23 /// 錯誤消息,可識別,可控類型(藍色) 24 /// </summary> 25 Error, 26 /// <summary> 27 /// 警告消息,程序異常,不可處理(紅色) 28 /// </summary> 29 Warn, 30 /// <summary> 31 /// 他人發送消息的顏色 32 /// </summary> 33 OtherMessage, 34 /// <summary> 35 /// 本人發送消息的顏色 36 /// </summary> 37 OwnerMessage 38 } 39 40 class MsgEventArgs 41 { 42 PRivate string _message; 43 44 public string Message 45 { 46 get { return _message; } 47 set { _message = value; } 48 } 49 50 private MsgType _type; 51 52 public MsgType Type 53 { 54 get { return _type; } 55 set { _type = value; } 56 } 57 58 public MsgEventArgs(string msg) 59 { 60 this._message = msg; 61 62 this._type = MsgType.Show; 63 } 64 public MsgEventArgs(string msg, MsgType type) 65 { 66 this._message = msg; 67 this._type = type; 68 } 69 } 70 71 class MsgEvnet 72 { 73 public delegate void MsgEvent(object sender, MsgEventArgs msg); 74 public static event MsgEvent msgEvent; 75 76 public static void SendMsg(string msg) 77 { 78 if (MsgEvnet.msgEvent != null) 79 { 80 MsgEvnet.msgEvent(null, new MsgEventArgs(msg)); 81 } 82 } 83 84 public static void SendMsg(string msg, MsgType type) 85 { 86 if (MsgEvnet.msgEvent != null) 87 { 88 MsgEvnet.msgEvent(null, new MsgEventArgs(msg, type)); 89 } 90 } 91 92 public static void SendMsg(object sender, string msg) 93 { 94 if (MsgEvnet.msgEvent != null) 95 { 96 MsgEvnet.msgEvent(sender, new MsgEventArgs(msg)); 97 } 98 } 99 100 public static void SendMsg(object sender, string msg, MsgType type)101 {102 if (MsgEvnet.msgEvent != null)103 {104 MsgEvnet.msgEvent(sender, new MsgEventArgs(msg, type));105 }106 }107 }108 }消息委托類
放棄的傳遞消息模式
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace UI 7 { 8 public enum MsgType 9 {10 /// <summary>11 /// 常規消息顯示(黑色)12 /// </summary>13 Show,14 /// <summary>15 /// 提示信息(綠色)16 /// </summary>17 Info,18 /// <summary>19 /// 狀態欄顯示20 /// </summary>21 State,22 /// <summary>23 /// 錯誤消息,可識別,可控類型(藍色)24 /// </summary>25 Error,26 /// <summary>27 /// 警告消息,程序異常,不可處理(紅色)28 /// </summary>29 Warn,30 /// <summary>31 /// 他人發送消息的顏色32 /// </summary>33 OtherMessage,34 /// <summary>35 /// 本人發送消息的顏色36 /// </summary>37 OwnerMessage38 }39 40 public class MsgEventArgs : EventArgs41 {42 public string Message;43 public MsgType Type;44 45 public MsgEventArgs(string msg)46 {47 this.Message = msg;48 49 this.Type = MsgType.Show;50 }51 public MsgEventArgs(string msg, MsgType type)52 {53 this.Message = msg;54 this.Type = type;55 }56 }57 58 public class MsgEvent59 {60 public event EventHandler<MsgEventArgs> msgEvent;61 62 public void SendMsg(string msg)63 {64 if (this.msgEvent != null)65 {66 this.msgEvent(this, new MsgEventArgs(msg));67 }68 }69 70 public void SendMsg(string msg, MsgType type)71 {72 if (this.msgEvent != null)73 {74 this.msgEvent(this, new MsgEventArgs(msg, type));75 }76 }77 }78 }放棄的消息傳遞模式
下面這段代碼之前放出來過(http://www.49028c.com/preacher/p/4105810.html),做了幾點修改,計算的方式:根據每個正六邊形的中心點,計算出下三邊的相對位置然后繪制下三邊。以下算法中,把之前的基類Control改為了Label,主要方便控件透明,Control為基類是不支持控件透明。
六邊形陣列繪制算法
1 using System; 2 using System.Drawing.Drawing2D; 3 using System.Drawing; 4 using System.Windows.Forms; 5 using System.Collections.Generic; 6 7 namespace UI.Controls 8 { 9 public class SixSidesControl : Label 10 { 11 double G3 = Math.Sin(60 * Math.PI / 180);//二分之根號三 12 private int m_sideLength = 20; 13 14 public int SideLength 15 { 16 get { return m_sideLength; } 17 set 18 { 19 m_sideLength = value; 20 Invalidate(); 21 } 22 } 23 24 25 private float m_lineThickness = 1; 26 27 public float LineThickness 28 { 29 get { return m_lineThickness; } 30 set 31 { 32 m_lineThickness = value; 33 Invalidate(); 34 } 35 } 36 37 38 private Color m_lineColor = Color.Black; 39 40 public Color LineColor 41 { 42 get { return m_lineColor; } 43 set 44 { 45 m_lineColor = value; 46 Invalidate(); 47 } 48 } 49 50 public SixSidesControl() 51 { 52 SetStyle(ControlStyles.UserPaint, true); 53 SetStyle(
新聞熱點
疑難解答