View Full Version : [vb net 2008] movimento e sovrapposizioni
superbau
05-10-2009, 20:54
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
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
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?
Non ci ho capito una mazza. :D
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...
superbau
06-10-2009, 10:00
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....
http://digilander.libero.it/superbau/sfondamento.jpg
immagine originale:
http://digilander.libero.it/superbau/poporing-01.bmp
mentre questo è cosa succede nel primo esempio dove ho postato il codice, però appunto mi risulta ardua la movimentazione:
http://digilander.libero.it/superbau/corretto.jpg
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:) ciao
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(). :
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
A questo punto il più è fatto. Oggetti trasparenti e inoltre spostamenti più fluidi. Unico inconveniente, se pcb_1 e pcb_2 si sovrappongono tra loro compare la porzione del quadro esterno della gif interessata dalla sovrapposizione... Vedi se può bastare. Per risolvere quest'ultimo problema credo si debba creare un Clipping Path "deducendolo" dal contorno, ossia dal confine che c'è tra parte interna della gif ( quella da salvare ), e parte esterna ( quella da tagliare )... Non la vedo una cosa tanto semplice.
superbau
11-10-2009, 22:30
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?
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 ) :
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
GetRegion esegue il clipping :
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
Direi che ci siamo. ;)
superbau
12-10-2009, 15:31
ti ringrazio, provo subito. Cmq mi riferivo a flash, la esiste propio la trasparenza.
superbau
12-10-2009, 18:14
ora finalmente ho capito per benino, ti sono riconoscente, mi hai aiutato non di poco, grazie ancora
ti ringrazio, provo subito. Cmq mi riferivo a flash, la esiste propio la trasparenza.
Ah beh, se mi parli di Flash, ovviamente la gestione della grafica vettoriale è sicuramente più veloce che non in un linguaggio multi-purpose.
Ma non tenterei nemmeno un confronto tra ActionScript e VB.NET in Windows ( a netto favore di VB... ).
ora finalmente ho capito per benino, ti sono riconoscente, mi hai aiutato non di poco, grazie ancora
Perfetto. ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.