|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2006
Città: Vicenza
Messaggi: 1150
|
[vb net 2008] movimento e sovrapposizioni
questo è la porzione di codice su cui sto facendo dei test, vorrei fare questa cosa senza dover refreshare il tutto ogni volta.
In pratica ho due o + oggetti. Visto che la trasparenza di buca tutti gli oggetti fini ad arrivare al form, ho cercato di eliminare gli oggetti, facendo in modo che le immagini dei due oggetti appartenessero ad un unico oggetto. Così facendo, che sia uno sofrapposto all'altro, la trasparenza esiste e non bucano niente, pk non ci sono oggetti. Il problema è muovere questi oggetti, risulta per me, macchinoso e molto pesante visto il refresh da fare, specie se ne avrò + di uno in movimento. Cosa mi consigliate di fare per avere la possibilità di avere img1 sovrapposta a img2 (o viceversa) con entrabe le img con sfondo trasparente senza che quando si sormontino, non si "buchino" fra di loro facendo alla stesso tempo muoverle? uff spero di non essere stato troppo contorto ciaoo ciao Codice:
Public Class Form1
' variabili pubbliche
Public Poporing As New Point
Public punto2 As New Point
Public x, y As Integer
Public premutoMovX As Integer
Public img1 As Bitmap = New Bitmap("poporing/poporing-01.bmp")
Public imgBg As Bitmap = New Bitmap("poporing/russia_field12.bmp")
Private Sub bGschermo00001(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
'sfondo
punto2 = New Point(10, 10)
e.Graphics.DrawImage(imgBg, punto2)
'oggetto in movimento
If premutoMovX = 1 Then
x = x + 10
Else
x = 30
End If
Poporing = New Point(x, 25)
img1.MakeTransparent(Color.Red)
e.Graphics.DrawImage(img1, Poporing)
e.Dispose()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
premutoMovX = 1
Refresh()
End Sub
End Class
__________________
Motherboard:Asus Commando - CPU: q6600 2.4Ghz - cpu cooler: Asus V40 - RAM: ddr2 8Gb - HD: Samsung 850evo 512Gb- GPU: Asus 770gtx ti - Extra Gpu coller:Manatthan coller 210140 - Monitor: Asus VK266H - Aliment.: SilentMaxX IC-tech 600w - Mouse: MXmaster - SO: windows 10. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Esattamente cos'è che vuoi fare ? Comunque, il concetto del BackColor Transparent di .Net è fuorviante. In realtà si limita a copiare il colore di backround del Parent, perciò non direi che i controlli "si bucano" a vicenda. Forse puoi ottenere risultati migliori, e più velocemente, creando controlli PictureBox, e giocando con le immagini di sfondo e con l'Alpha blending... |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2006
Città: Vicenza
Messaggi: 1150
|
provo a spiegarmi meglio
1) ho due oggetti A e B 2) Entrambi hanno parti TRASPARENTI 3) Entrabi si muovono sulle assi x,y 4) e qui sta il problemone: quando i due oggetti si sovrappongono, la "fantomatica trasparenza" svanisce e compare nella parte trasparente il form dando l'effetto che l'immagine sotto sia bucata la dove viene intersecata con un'ltra immagine trasparente. spero di essere stato + chiaro. eCCO io vorrei sapere come evitare che si buchino e che la trasparenza resti tale anche quando si sovrappone 1 o + oggetti. Nell'esempio che ho riportato ho risolto il problema facendo semplicemente a meno di creare oggetti, però mi risulta ardua la cosa quando tento di spostare una delle due immagini. Ti allego un screeshoot. P.s. Potrei ovviare mettendo lo sfondo nel background del form, ma il problema mi ritornerebbe dopo quando avrò cmq un'altro oggetto da sovrapporre.... ![]() immagine originale: ![]() mentre questo è cosa succede nel primo esempio dove ho postato il codice, però appunto mi risulta ardua la movimentazione: ![]() se riescia postarmi un esempio con due img che non si "buchino" o come dici te, " che non prendano il colore del form" te ne sarei grato, son settimane che ci sbatto la mia dura testa di coccio misto marmo. Se ci si riesce, muovere due oggetti img1 e img2 ec... mi risulta alcquanto semplice e banale rispetto alla strada che avevo intrapreso io conil mio primo codice
__________________
Motherboard:Asus Commando - CPU: q6600 2.4Ghz - cpu cooler: Asus V40 - RAM: ddr2 8Gb - HD: Samsung 850evo 512Gb- GPU: Asus 770gtx ti - Extra Gpu coller:Manatthan coller 210140 - Monitor: Asus VK266H - Aliment.: SilentMaxX IC-tech 600w - Mouse: MXmaster - SO: windows 10. Ultima modifica di superbau : 06-10-2009 alle 11:25. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
L'operazione di spostamento risulta pesante anche perchè sei andato a scrivere nell'evento Paint, cosa sempre assai delicata, perchè Paint viene chiamato molto frequentemente.
Una soluzione semplice ed efficace è la seguente : > Ho una Form con 3 PictureBox : pcb_sfondo / pcb_1 / pcb_2. > pcb_1 e pcb_2 hanno BackColor = Transparent, inoltre è necessario che l'immagine che contengono sia in formato GIF. Quindi l'immagine gif sarà l'oggetto che voglio rappresentare, contornato da un colore ( nel mio caso Black ) opportuno, che serve a gestire la trasparenza dell'oggetto. > Definisco le proprietà di immagine e trasparenza una volta sola ( Ad es, nel Load ), quindi nessun bisogno di refreshare N volte al secondo con Paint(). : Codice:
pcb_sfondo.Image = Image.FromFile(percorso & "sfondo.gif")
Dim bmp1 As New Bitmap(percorso & "file1.gif")
bmp1.MakeTransparent(Color.Black)
pcb_1.Image = bmp1
pcb_1.Parent = pcb_sfondo
Dim bmp2 As New Bitmap(percorso & "file2.gif")
bmp2.MakeTransparent(Color.Black)
pcb_2.Image = bmp2
pcb_2.Parent = pcb_sfondo
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Aug 2006
Città: Vicenza
Messaggi: 1150
|
niente non riesco a cavare un ragno dal buco... nessuno nuova ideaa su come fare?
a me serve poter sovrappore 2 oggetti con delle trasparenze, lasciando quste ultime intatte, senza che l'oggetto che sormonti prenda il colore o l'immagine del form sottostante. non so.. usando le direct x forse.. non ne ho idea.. bho.. si che su altri programmi è così banale sta cosa... possibile sia così frustrante in vbnet?
__________________
Motherboard:Asus Commando - CPU: q6600 2.4Ghz - cpu cooler: Asus V40 - RAM: ddr2 8Gb - HD: Samsung 850evo 512Gb- GPU: Asus 770gtx ti - Extra Gpu coller:Manatthan coller 210140 - Monitor: Asus VK266H - Aliment.: SilentMaxX IC-tech 600w - Mouse: MXmaster - SO: windows 10. Ultima modifica di superbau : 11-10-2009 alle 23:33. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
In che linguaggio sarebbe così "banale" ?
Come già detto, devi trovare un modo per fare il clipping dell'area esterna all'immagine. Ad esempio con questo metodo ( in questo caso posso usare immagini di ogni tipo, non solo .gif ) : Codice:
pcb_sfondo.Image = Image.FromFile(percorso & "sfondo.bmp")
Dim bmp1 As New Bitmap(percorso & "img1.bmp")
pcb_1.Image = bmp1
pcb_1.Region = GetRegion(bmp1, bmp1.GetPixel(0, 0))
pcb_1.Parent = pcb_sfondo
Dim bmp2 As New Bitmap(percorso & "img2.bmp")
pcb_2.Image = bmp2
pcb_2.Region = GetRegion(bmp2, bmp2.GetPixel(0, 0))
pcb_2.Parent = pcb_sfondo
Codice:
Private Function GetRegion(ByVal bm As Bitmap, ByVal bg_color As Color) As Region
Dim new_region As New Region
new_region.MakeEmpty()
Dim rect As New Rectangle
Dim in_image As Boolean = False
Dim X As Integer
For Y As Integer = 0 To bm.Height - 1
X = 0
Do While X < bm.Width
If Not in_image Then
If Not bm.GetPixel(X, Y).Equals(bg_color) Then
in_image = True
rect.X = X
rect.Y = Y
rect.Height = 1
End If
ElseIf bm.GetPixel(X, Y).Equals(bg_color) Then
in_image = False
rect.Width = X - rect.X
new_region.Union(rect)
End If
X = X + 1
Loop
If in_image Then
in_image = False
rect.Width = bm.Width - rect.X
new_region.Union(rect)
End If
Next Y
Return new_region
End Function
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Aug 2006
Città: Vicenza
Messaggi: 1150
|
ti ringrazio, provo subito. Cmq mi riferivo a flash, la esiste propio la trasparenza.
__________________
Motherboard:Asus Commando - CPU: q6600 2.4Ghz - cpu cooler: Asus V40 - RAM: ddr2 8Gb - HD: Samsung 850evo 512Gb- GPU: Asus 770gtx ti - Extra Gpu coller:Manatthan coller 210140 - Monitor: Asus VK266H - Aliment.: SilentMaxX IC-tech 600w - Mouse: MXmaster - SO: windows 10. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2006
Città: Vicenza
Messaggi: 1150
|
ora finalmente ho capito per benino, ti sono riconoscente, mi hai aiutato non di poco, grazie ancora
__________________
Motherboard:Asus Commando - CPU: q6600 2.4Ghz - cpu cooler: Asus V40 - RAM: ddr2 8Gb - HD: Samsung 850evo 512Gb- GPU: Asus 770gtx ti - Extra Gpu coller:Manatthan coller 210140 - Monitor: Asus VK266H - Aliment.: SilentMaxX IC-tech 600w - Mouse: MXmaster - SO: windows 10. |
|
|
|
|
|
#9 | ||
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Ma non tenterei nemmeno un confronto tra ActionScript e VB.NET in Windows ( a netto favore di VB... ). Quote:
|
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:08.






















