Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - moto proiettile: distanza
Forum - C# / VB.NET - moto proiettile: distanza

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 18:14
Venerdì, 04/06/2010
sto facendo un programma che simula il moto di un proiettile...
tutto ok, funziona tutto bene tranne la distanza raggiunta dal proiettile
il proiettile è un immagine in una picture box

quindi finche il proiettile non esce dal bordo della finestra la distanza è uguale alla posizione finale meno quella iniziale.

il problema c'è quando supera il bordo (in questo caso torna al bordo di partenza) solo che non so come calcolare la distanza in questo modo...

ho provato alcune formule senza successo...

allego un immagine col problema


walker93 ha allegato un file: moto.GIF (3226 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da walker93 il 04/06/2010 alle 18:16
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:21
Venerdì, 04/06/2010
Semplicemente, sposti l'origine del rendering in avanti. Dovrai anche evidenziare il nuovo punto iniziale.

Se lo spostamento compiuto (e non la posizione del proiettile) è maggiore della larghezza della picturebox, puoi allargarla (PictureBox.Size) o zoomare l'immagine (PictureBox.SizeMode).

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 19:02
Venerdì, 04/06/2010
l'applicazione già la mostro a schermo intero
la picture box di fondo è uniforme ,stesso colore non c'è un immagine solo lo sfondo colorato d'azzurro per il cielo
come faccio a capire che è zoomato???

PM Quote
Avatar
paoloricciuti (Ex-Member)
Pro


Messaggi: 137
Iscritto: 27/04/2010

Segnala al moderatore
Postato alle 2:21
Sabato, 05/06/2010
Non ne capisco di VB però giusto una cosa: se il tuo problema è sapere la distanza percorsa dal proiettile le due formule da te usate funzionano. Infatti per passare da 900 a 100 percorre 200 passi (da 900 a 1000 e da 0 a 100) se invece il tuo problema è sapere dove atterra c'è un problema di fondo, visto che utilizzi la variabile fine che è+ effettivamente dove atterra il proiettile.

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 14:51
Sabato, 05/06/2010
il problema è che se sparo a 45° gradi percorro ad esempio 160 px se sparo a 135° cioè stessa inclinazione ma all'indietro mi calcola una distanza differente sebbene non cambi la forza dello sparo



walker93 ha allegato un file: sparo45.GIF (1721 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 16:02
Domenica, 06/06/2010
Io credevo che il problema fosse semplicemente disegnare opportunamente i risultati, ma se le formule che hai usato danno risultati che contrastano con le tue ipotesi, allora il problema, come diceva paoloricciuti, è di fondo. Perciò sarebbe meglio se postassi il codice, in modo che possiamo vedere cosa non va.

P.S.: non calcoli anche la velocità del vento, vero? Altrimenti potrebbe dipendere da quello...

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 17:27
Domenica, 06/06/2010
ecco ho messo le parti che ritengo rilevanti
Codice sorgente - presumibilmente Delphi

  1. 'dentro al timer interval=10
  2.        i += 0.15
  3.        If i = 0.15 Then
  4.            start = proiettile.Left + proiettile.Width
  5.        End If
  6.        proiettile.Left = proiettile.Left + velx * i
  7.        'se supera il bordo destro(dist è la distanza)
  8.         If proiettile.Left + proiettile.Width > sfondo.Width Then
  9.             Threading.Thread.Sleep(200)
  10.             dist += sfondo.Width - (proiettile.Left + proiettile.Width)
  11.             proiettile.Left = 0
  12.             'start = proiettile.Width
  13.            indietro = False
  14.            Threading.Thread.Sleep(200)
  15.        ElseIf proiettile.Left < 0 Then 'altrimenti se supera quello sinistro
  16.             Threading.Thread.Sleep(200)
  17.             dist += -start 'proiettile.Left
  18.            proiettile.Left = sfondo.Width - proiettile.Width
  19.            'start = sfondo.Width + proiettile.Width
  20.             Threading.Thread.Sleep(200)
  21.             indietro = True
  22.         End If
  23.         If proiettile.Top + proiettile.Height >= sfondo.Top Then
  24.             'se va sotto terra lo fermo
  25.            i = 0
  26.            Timer1.Enabled = False
  27.            proiettile.Top = sfondo.Top - proiettile.Height
  28.            If start < proiettile.Left Then
  29.                dist += (proiettile.Left - start)
  30. 'vecchi tentativi:
  31. '-sfondo.Width - proiettile.Left + proiettile.Width
  32. '-((proiettile.Left - start) + mom)
  33.             Else
  34.                 dist += (start - proiettile.Left)
  35. '-proiettile.Left + proiettile.Width - start
  36.            End If
  37.            dimax.Text = dist \ 10
  38.            mom = 0
  39.            dist = 0
  40.        End If


no niente vento...

Ultima modifica effettuata da walker93 il 06/06/2010 alle 17:30
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 20:15
Martedì, 08/06/2010
Non riesco bene a carpire il preciso funzionamento di quel codice, anche se mi sono chiare le linee generali.
Forse sarebbe meglio se spezzassi adeguatamente i compiti. Assumiamo che il codice sia in un timer:
Codice sorgente - presumibilmente VB.NET

  1. 'a > accelerazione, di tipo Point
  2. 'v > velocità, di tipo Point
  3. 'p > posizione, di tipo point
  4.  
  5. 'non è definito l'operatore * tra point e double, ma assumiamo
  6. 'per semplicità che esista
  7. v += a * Timer1.Interval / 1000
  8. p += v * Timer1.Interval / 1000
  9.  
  10. p.X = p.X Mod sfondo.Width
  11. If p.X < 0 Then
  12.    p.X = sfondo.Width - p.X
  13. End If
  14.  
  15. If p.y > sfondo.Height Then
  16.    Timer1.Stop()
  17.    p.y = sfondo.Height
  18. End If


PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 22:23
Martedì, 08/06/2010
scusami ma proprio non mi è chiaro...
come fanno accelerazione e velocità a essere di tipo point???
e se i valori di a e di timer1.interval non cambiano:
v viene incrementata sempre dello stesso valore...(Es.  2 poi 4,6,8,10,12,14,16)
la velocità non dovrebbe incrementare...

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo