Oppure

Loading
16/06/10 20:35
walker93
il codice è ancora quello o cambiato solo la formula...

'handles timer1.tick interval=1
        i += 0.15
        If i = 0.15 Then
            attrad = Math.Atan((vely / velx))
            att = attrad / Math.PI * 180
            dist += ((vel ^ 2 * Math.Sin(2 * angr)) / g.Text)
            dimax.Text = dist
            altmax = Math.Abs((((vel ^ 2) * Math.Sin(angr) * Math.Cos(angr)) / g.Text) / 2)
            almax.Text = altmax
            temp += (2 * vel * Math.Sin(angr)) / g.Text
            tem.Text = temp
            start = proiettile.Left
        End If

        proiettile.Top = proiettile.Top - vely * i + (1 / 2 * g.Text * i ^ 2)
        If proiettile.Top < massimo Then
            massimo = proiettile.Top
        End If
        If proiettile.Top + proiettile.Height >= sfondo.Top Then
            i = 0
            Timer1.Enabled = False
            proiettile.Top = sfondo.Top - proiettile.Height
            vai.Enabled = True
            Button1.Enabled = True
            Button2.Enabled = True
        End If
        proiettile.Left = proiettile.Left + velx * i
        If proiettile.Left > sfondo.Width Then
            Threading.Thread.Sleep(100)
            proiettile.Left = 0
            ind.Left = 0
            Threading.Thread.Sleep(100)
        ElseIf proiettile.Left < 0 Then
            Threading.Thread.Sleep(100)
            proiettile.Left = sfondo.Width - proiettile.Width
            ind.Left = proiettile.Left
            Threading.Thread.Sleep(100)
        End If
        ind.Left = proiettile.Left
        If proiettile.Top < PictureBox1.Top Then
            ind.Visible = True
            proiettile.Visible = False
        Else
            ind.Visible = False
            proiettile.Visible = True
        End If

le formule sono tratte da wikipedia:
it.wikipedia.org/wiki/…
Ultima modifica effettuata da walker93 16/06/10 20:39
aaa
17/06/10 16:04
Il Totem
i += 0.15
        if i = 0.15 then
            attrad = Math.Atan((vely / velx))
            att = attrad / Math.PI * 180
            dist += ((vel ^ 2 * Math.Sin(2 * angr)) / g.Text)
            dimax.Text = dist
            altmax = Math.Abs((((vel ^ 2) * Math.Sin(angr) * Math.Cos(angr)) / g.Text) / 2)
            almax.Text = altmax
            temp += (2 * vel * Math.Sin(angr)) / g.Text
            tem.Text = temp
            start = proiettile.Left
        end if


Hai messo un codice che deve essere eseguito una sola volta in un timer, con una condizione. Questo NON si deve fare. Scrivilo prima di avviare il timer. attrad e att non vengono usati. Poi sommi alla distanza la gittata: questo a cosa serve? Inoltre non tieni conto della posizione iniziale (nel codice non c'è menzione a nessuna textbox che indichi la posizione).

proiettile.Top + proiettile.Height >= sfondo.Top

Questa condizione è verificata se il proiettile è nello sfondo... Sei sicuro che sia giusta?

proiettile.left raggiunge sfondo.width prima dell'effettiva fine dello sfondo, a meno che lo sfondo non abbia coordinata x=0 sul form. Non ti sembra più utile definire un paio di coordinate per questo proiettile invece che lavorare con quelle proprietà?
Dim proX, proY As Int32
proX = proiettile.Location.X - sfondo.Location.X
proY = proiettile.Location.Y - sfondo.Location.Y

In questo sistema di riferimento, il punto (0,0) coincide con il vertice superiore sinistro dello sfondo, ed è coerente scrivere "If proX > sfondo.Width Then".
aaa
21/06/10 15:26
walker93
Postato originariamente da Il Totem:

Hai messo un codice che deve essere eseguito una sola volta in un timer, con una condizione. Questo NON si deve fare. Scrivilo prima di avviare il timer. attrad e att non vengono usati.

su questo devo darti ragione(sia sulla condizione sia su attrad e att)
att e attrad li avevo provati a usare per disegnare la parabola con graphics e non li ho più tolti
Poi sommi alla distanza la gittata: questo a cosa serve? Inoltre non tieni conto della posizione iniziale (nel codice non c'è menzione a nessuna textbox che indichi la posizione).

sommando alla distanza la gittata posso fare più lanci in sequenza senza azzerrare la posizione iniziale...infatti se mi servisse calcolare la distanza raggiunta sparando tre volte: la 1° a 45° la 2° a 80° e la terza a 25 m/s anzichè 20, posso farlo senza preoccuparmi di segnarmi la distanza singola dei lanci su blocco note e fare la somma a mano...(c'è il pulsante per azzerare la posizione iniziale che azzera anche la distanza).

ho rimosso la funzione per cambiare la posizione iniziale del proiettile quando mi sono reso conto che avevo problemi non solo sulla distanza ma anche sull'altezza...
proiettile.Top + proiettile.Height >= sfondo.Top


Questa condizione è verificata se il proiettile è nello sfondo... Sei sicuro che sia giusta?

si, sfondo è la picturebox verde che simula il suolo,e non il cielo azzurro...(come sarebbe normale pensare)
proiettile.left raggiunge sfondo.width prima dell'effettiva fine dello sfondo, a meno che lo sfondo non abbia coordinata x=0 sul form. Non ti sembra più utile definire un paio di coordinate per questo proiettile invece che lavorare con quelle proprietà?
In questo sistema di riferimento, il punto (0,0) coincide con il vertice superiore sinistro dello sfondo, ed è coerente scrivere "If proX > sfondo.Width Then".

lo sfondo ha proprio x=0 sul form.
scrivendo proiettile.left so bene a cosa mi riferisco... anche con proX lo saprei ma preferisco qualcosa di più diretto...
Ultima modifica effettuata da walker93 21/06/10 15:27
aaa