実際のゲーム画面はこちらです。
Formの上にPictureboxを配置し、Graphicsを用いて表を作成しています。
セルがオレンジで囲まれているのは、MauseMoveイベントにより、マウスがホバーしているセルに着色しています。
今できずに悩んでいることは、picturebox内のセルに対し、文字の入力を行う処理です。
つまり、
1、マウスで座標を指定
2、入力されたキー情報を受け取る
3、入力されたきー情報を対象の座標(オレンジ枠セル)に出力
出力に関しては、
Graphics.DrawStringメソッドorTextRenderer.DrawTextメソッドを用いることで実現できるのかな、と考えておりますが、座標の指定がうまくできていないのかなと考えております。
こちらはForm1のクラスです。
VB
1Public Class Form1 2 Dim S As New source 3 4 Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint 5 6 S.Draw(e.Graphics) 7 8 End Sub 9 10 Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove 11 12 Dim ThisCell As Cell 13 14 'マウスがある位置のセルを取得 15 ThisCell = S.CellFromPoint(e.X, e.Y) 16 17 If Not IsNothing(ThisCell) Then 18 19 ThisCell.Focus() 20 Console.ReadLine() 21 22 '現在の状態を描画(PictureBox1のPaintイベントを発生させる) 23 PictureBox1.Invalidate() '←実際の描画はすべてここで行う 24 25 End If 26 27 End Sub 28 29End Class
VB
1Public Class Cell 2 Public Status As CellStatus 3 Public S As source 4 Public Position As Point '論理位置 5 Public Rectangle As Rectangle '物理位置 6 Public Focused As Boolean 7 8 '■コンストラクタ 9 Public Sub New(ByVal S As source, ByVal Position As Point) 10 11 Me.S = S 12 Me.Position = Position 13 14 Dim Rect As New Rectangle 15 16 '物理位置を求める。 17 Rect.X = Position.X * source.CellSize 18 Rect.Y = Position.Y * source.CellSize 19 Rect.Width = source.CellSize 20 Rect.Height = source.CellSize 21 22 Me.Rectangle = Rect 23 End Sub 24 25 '■Focus 26 Public Sub Focus() 27 28 Dim X As Integer 29 Dim Y As Integer 30 31 '同じグリッドに属する自分以外のセルを非アクティブにする。 32 For X = 0 To source.XCount - 1 33 For Y = 0 To source.YCount - 1 34 S.Cells(X, Y).Focused = False 35 Next 36 Next 37 38 '自分自身をアクティブにする。 39 Me.Focused = True 40 41 End Sub 42 43 Public Sub Draw(ByVal g As Graphics) 44 45 Dim CellRect As Rectangle 46 Dim oPen As New Pen(Color.Orange, 3) 47 48 CellRect = Me.Rectangle 49 CellRect.Inflate(-2, -2) 50 Dim fnt As New Font("MS UI Gothic", 20) 51 52 If Me.Focused Then 53 g.DrawRectangle(oPen, CellRect) 54 End If 55 56 End Sub 57End Class
VB
1Public Class source 2 3 Public Const CellSize As Integer = 50 'セルのサイズ 4 Public Const XCount As Integer = 9 '盤の横方向のセル数 5 Public Const YCount As Integer = 9 '盤の縦方向のセル数 6 Dim aCell(XCount - 1, YCount - 1) As Cell '全セルを表す配列 7 8 Public Sub New() 9 10 Dim X As Integer 11 Dim Y As Integer 12 13 For X = 0 To XCount - 1 14 For Y = 0 To YCount - 1 15 aCell(X, Y) = New Cell(Me, New Point(X, Y)) 16 Next 17 Next 18 19 End Sub 20 21 Public Sub Draw(ByVal g As Graphics) 22 23 Dim X As Integer 24 Dim Y As Integer 25 Dim aPen As New Pen(Color.Gray, 2) 26 Dim bPen As New Pen(Color.Black, 3) 27 28 '四角形 29 g.FillRectangle(Brushes.White, 0, 0, XCount * CellSize, YCount * CellSize) 30 31 '縦線 32 For X = 0 To XCount 33 If X Mod 3 = 0 Then 34 g.DrawLine(bPen, X * CellSize, 0, X * CellSize, YCount * CellSize) 35 Else 36 g.DrawLine(aPen, X * CellSize, 0, X * CellSize, YCount * CellSize) 37 End If 38 39 Next 40 41 '横線 42 For Y = 0 To YCount 43 If Y Mod 3 = 0 Then 44 g.DrawLine(bPen, 0, Y * CellSize, XCount * CellSize, Y * CellSize) 45 Else 46 g.DrawLine(aPen, 0, Y * CellSize, XCount * CellSize, Y * CellSize) 47 End If 48 49 Next 50 51 For Y = 0 To YCount - 1 52 For X = -0 To XCount - 1 53 Cells(X, Y).Draw(g) 54 Next 55 Next 56 End Sub 57 58 Public Property Cells(ByVal X As Integer, ByVal Y As Integer) As Cell 59 Get 60 Return aCell(X, Y) 61 End Get 62 Set(ByVal value As Cell) 63 aCell(X, Y) = value 64 End Set 65 End Property 66 67 Public Function CellFromPoint(ByVal X As Integer, ByVal Y As Integer) As Cell 68 69 Dim ThisCell As Cell 70 71 If X < 0 OrElse X >= XCount * CellSize Then 72 Return Nothing 73 End If 74 75 If Y < 0 OrElse Y >= YCount * CellSize Then 76 Return Nothing 77 End If 78 79 ThisCell = Cells(X \ CellSize, Y \ CellSize) 80 81 Return ThisCell 82 83 End Function 84 85End Class
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/28 07:10
2019/11/28 08:53