Newsgroup: it.comp.lang.visual-basic
Titolo: oggetti animati su form, ma come?

Ciao, su un form vorrei disegnare più cerchi che posso spostare tramite 
mouse, e che che in fase di collisione si spostano.....come posso fare?
Con lo user control ottengo un'area rettangolare all'interno di questa posso 
disegnare il cerchio, ma l'area è cmq rettangolare.
Grazie :) 

Intanto per cominciare io suddividerei in 2 problemi:
1) Come disegnare i cerchi
2) Come verificare se c'� collisione
1) Potresti per esempio utilizzare una picturebox
2) Evidentemente non puoi basarti sulle dimensioni
    della picturbox in quanto, almeno per gli angoli,
    devi permettere anche una sovrapposizione.
    Per fare i colcoli se c'� collisione devi considerare
    i centri ed i diametri dei cerchi interessati.
    Penso comunque non sia semplice soprattutto
    quando verranno coinvolti nello spostamento un
    notevole numero di cerchi.
In bocca al lupo.
Sauro 

    Per fare i colcoli se c'ï¿½ collisione devi considerare



Ricordi i patriot?
Erano piccoli missili israeliani (di produzione USA)
che in pochi secondi intercettavano in volo altri
missili piů grandi e li facevano esplodere prima
che toccassero terra.
Se sapessi fare quel software non sarei qui a
risponderti.  ;-)
Tornando a noi, credo occorra un po' di
trigonometria per fare i calcoli
Se i due cerchi fossero sullo stesso asse il calcolo
sarebbe semplice;
If Centro1+Raggio1+Raggio2 <= Centro2 Then
  'Collisione
Endif
Se i centri sono "disassati" la situazone si complica.
Io, non conoscendo altra matematica utile, ricorrerei
ai principi del triangolo rettangolo.
Supponendo che il secondo cerchio sia piů a destra
e piů in basso del primo:
Private Function Collisione as boolen
    Dim Cateto1 as long
    Dim Cateto1 as long
    Dim Ipotenusa as long
    Cateto1=differenza tra i .left dei controlli
    Cateto2=differenza tra i .top dei controlli
    Ipotenusa=Sqr(Cateto1*Cateto2)
    If Centro1+Raggio1+Raggio2 <= Ipotenusa Then
        Collisione=True
    EndIf
End Function
Poi devi cominciare a fare gli spostamenti.
Di nuovo in bocca al lupo
Sauro 

 il problema è determinare la collisione....ma nei giochi come fanno? :S
In modo molto superficiale analizzerei così:
Il cerchio è inscritto nella picture (che sarà un quadrato);
Il diametro del cerchio è conosciuto;
Le coordinate del centro del cerchio e quindi della picture sono conosciute;
Si ha collisione quando la distanza tra i centri di due cerchi è <= alla 
somma dei singoli raggi (ipotizzando che cerchi diversi abbiamo diametri 
diversi, altrimenti sarebbe più semplice);
La distanza tra i due centri la possiamo calcolare come:
SQRT( (X1-X2)^2 + (Y1-Y2)^2 )
Ovviamente si dovrà testare -ad ogni step- le coordinate di un cerchio 
rispetto a tutti gli altri presenti sulla scena.
ciao
stefano

 risponderti.  ;-)
Cut
ahuahau
Comunque, ho fatto qualche prova e ho vari problemi:
-settando una foto sullo sfondo della form, ho settato lo sfondo dello user 
control a invisibile, ma quando l'oggetto si muove sulla form ï¿½ come se la 
parte invisibile ritagliasse un pezzo dell'immagine e lo porta dietro pari 
allo spostamento per poi ridisegnare la fotografia.
-lo user control occupa comunque una porzione rettangolare, non c'ï¿½ modo di 
fare una forma anche irregolare.
-per la trigonometria o geomtria non ho problemi, pensavo esistesse un modo 
+ performante. Nel caso in cui ho un oggetto irregolare che ruota su se 
stesso, la vedo dura fare tutti i calcoli.
Di seguito il sorgente per chi volesse cimentarsi ( vb2010)
Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As 
System.EventArgs) Handles Me.Load
        Dim k = New sprite(Me)
        Me.Controls.Add(k)
    End Sub
End Class
Public Class sprite
    Inherits System.Windows.Forms.UserControl
    Private coefy As Integer = 1
    Private coefx As Integer = 1
    Friend WithEvents Timer1 As System.Windows.Forms.Timer
    Private alfa As Integer = 0
    Private gr As Graphics
    Private piu As Point
    Public Property max_width As Integer
    Public Property max_height As Integer
    Public Property velocita_rotazione As Integer
    Public Sub New(ByRef form As Form)
        Timer1 = New Timer
        Timer1.Interval = 60
        AddHandler Timer1.Tick, AddressOf timer_tick
        Me.max_width = form.ClientSize.Width
        Me.max_height = form.ClientSize.Height
        'gr = Graphics.FromHwnd(container.Handle)
        Dim k = Me.Parent
        Timer1.Enabled = True
        Me.BackColor = Color.FromArgb(0, 0, 0, 0)
    End Sub
    Public Sub timer_tick()
        If location.X < 0 Then
            coefx = 1
        End If
        If location.X > max_width Then
            coefx = -1
        End If
        If location.Y < 0 Then
            coefy = 1
        End If
        If location.Y > max_height Then
            coefy = -1
        End If
        Me.Location = New Point(Location.X + coefx * 3, Location.Y + coefy * 
3)
        Invalidate()
    End Sub
    Private Sub sprite_MouseDown(ByVal sender As System.Object, ByVal e As 
System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
        Timer1.Enabled = False
        piu.X = Me.Left - Control.MousePosition.X
        piu.Y = Control.MousePosition.Y - Me.Top
    End Sub
    Private Sub sprite_Mouseup(ByVal sender As System.Object, ByVal e As 
System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
        Timer1.Enabled = True
    End Sub
    Protected Overrides Sub OnPaintBackground(ByVal e As 
System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaintBackground(e)
        e.Graphics.DrawEllipse(Pens.Black, New Rectangle(0, 0, 20, 20))
    End Sub
    'MyBase.OnPaint(e)
    Private Sub sprite_MouseMove(ByVal sender As System.Object, ByVal e As 
System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
        If e.Button = Windows.Forms.MouseButtons.Left Then
            Me.Top = Control.MousePosition.Y - piu.Y
            Me.Left = piu.X + Control.MousePosition.X
        End If
    End Sub
End Class
 

 wrote:
ti ricordi li sprite del commodore 64 ???
C'è chi fornisce qualcosa di simile
http://www.swingame.com/wiki/index.php?title=Main_Page
oppure in casa Microsoft.....
c'è un namespace per le directx
http://msdn.microsoft.com/en-us/library/bb318660(v=VS.85).aspx

 
http://www.swingame.com/wiki/index.php?title=Main_Page
Ok, ci daro un occhio, grazie 1000!