View Full Version : [VB6] Creare una griglia di esagoni
wingman87
18-11-2006, 20:00
Quello che vorrei creare è un piccolo campo di combattimento tipo quelli di heroes of might & magic, come l'immagine:
http://linuxgazette.net/issue60/misc/andreiana/homm_combat3.jpg
il problema che ho adesso è creare questi esagoni, avrei voluto usare delle shape perchè poi fare degli effetti al mouseon è molto semplice ma non esistono le shape esagonali.. Allora ho provato con le image ma se carico un immagine con un esagono non riesco a fare effetti di trasparenza nelle zone in cui le image si dovrebbero sovrapporre.. Come fare? Le shape sarebbero perfette perchè potrei mettere anche un'immagine di sfondo al form. Con le image non penso si possa fare (se riesco a fare la trasparenza però potrei sempre disegnare solo il contorno dell'esagono così lo sfondo si vedrebbe). Grazie a tutti.
wingman87
19-11-2006, 09:47
Ho trovato una soluzione, basta usare dei cerchi, non sono esagoni ma il risultato è lo stesso, quest'immagine l'ho vista girando su internet..
http://www.freesharewarecenter.com/files/hg.gif
Ora però sarei curioso di sapere se si può fare con gli esagoni..
wingman87
19-11-2006, 12:11
Allora, come vedete ho fatto la griglia:
http://img216.imageshack.us/img216/5025/immagineas8.th.jpg (http://img216.imageshack.us/my.php?image=immagineas8.jpg)
Ora c'è un altro problema, siccome io avevo bisogno dell'evento mousemove e le shape non ce l'hanno ho dovuto creare un piccolo controllo che consta solo di una shape ma che mostra anche quest'evento. Quando usavo solo le shape il caricamento del form era istantaneo, ora che invece uso il controllo ci mette un bel po' a seconda di quanti ne instanzio. Questi sono i codici che uso:
Controllo:
Event MouseMove()
Event MouseClick()
Private Sub UserControl_Initialize()
SHex.FillStyle = 0
End Sub
Private Sub UserControl_Resize()
UserControl.Width = UserControl.Height
SHex.Height = UserControl.Height
SHex.Width = SHex.Height
End Sub
Public Property Let FillColor(ByVal Color As Long)
SHex.FillColor = Color
End Property
Public Property Let Diametro(ByVal Diametro As Integer)
UserControl.Height = Diametro
End Property
Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseMove
End Sub
Private Sub UserControl_Click()
RaiseEvent MouseClick
End Sub
Form:
Const NLHex = 12
Const HWHex = 600
Private LastHex As Integer
Private Sub Form_load()
Dim X As Integer, Y As Integer, ind As Integer
LastHex = -1
Hex(0).Diametro = HWHex
For Y = 0 To NLHex - 1
For X = 0 To NLHex - 1
ind = X + Y * NLHex
If ind <> 0 Then
Load Hex(ind)
Hex(ind).Top = Y * (HWHex - 120)
If Y Mod 2 = 0 Then
Hex(ind).Left = X * HWHex
Else
Hex(ind).Left = X * HWHex + HWHex / 2
End If
Hex(ind).Visible = True
End If
Next X
Next Y
Me.Height = (HWHex - 120) * NLHex + 650
Me.Width = HWHex * NLHex + 500
End Sub
Private Sub Hex_MouseMove(Index As Integer)
If LastHex = Index Then
Exit Sub
End If
If LastHex <> -1 Then
Hex(LastHex).FillColor = vbGreen
End If
Hex(Index).FillColor = vbRed
LastHex = Index
End Sub
Si può fare qualcosa x velocizzarlo?
wingman87
20-11-2006, 13:40
Ho abbandonato l'oggetto e ho usato delle image. L'oggetto era comodo perchè era più intuitivo, anche perchè gli avrei aggiunto tante altre cose. Vorrà dire che sarà un po' + complicato ma sicuramente + veloce.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.