walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/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
Ultima modifica effettuata da walker93 il 04/06/2010 alle 18:16 |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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).
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/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???
|
|
paoloricciuti (Ex-Member)
Pro
Messaggi: 137
Iscritto: 27/04/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.
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/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
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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...
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/2010
|
ecco ho messo le parti che ritengo rilevanti
Codice sorgente - presumibilmente Delphi |
'dentro al timer interval=10 i += 0.15 If i = 0.15 Then start = proiettile.Left + proiettile.Width End If proiettile.Left = proiettile.Left + velx * i 'se supera il bordo destro(dist è la distanza) If proiettile.Left + proiettile.Width > sfondo.Width Then Threading.Thread.Sleep(200) dist += sfondo.Width - (proiettile.Left + proiettile.Width) proiettile.Left = 0 'start = proiettile.Width indietro = False Threading.Thread.Sleep(200) ElseIf proiettile.Left < 0 Then 'altrimenti se supera quello sinistro Threading.Thread.Sleep(200) dist += -start 'proiettile.Left proiettile.Left = sfondo.Width - proiettile.Width 'start = sfondo.Width + proiettile.Width Threading.Thread.Sleep(200) indietro = True End If If proiettile.Top + proiettile.Height >= sfondo.Top Then 'se va sotto terra lo fermo i = 0 Timer1.Enabled = False proiettile.Top = sfondo.Top - proiettile.Height If start < proiettile.Left Then dist += (proiettile.Left - start) 'vecchi tentativi: '-sfondo.Width - proiettile.Left + proiettile.Width '-((proiettile.Left - start) + mom) Else dist += (start - proiettile.Left) '-proiettile.Left + proiettile.Width - start End If dimax.Text = dist \ 10 mom = 0 dist = 0 End If
|
no niente vento...
Ultima modifica effettuata da walker93 il 06/06/2010 alle 17:30 |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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 |
'a > accelerazione, di tipo Point 'v > velocità, di tipo Point 'p > posizione, di tipo point 'non è definito l'operatore * tra point e double, ma assumiamo 'per semplicità che esista v += a * Timer1.Interval / 1000 p += v * Timer1.Interval / 1000 p.X = p.X Mod sfondo.Width If p.X < 0 Then p.X = sfondo.Width - p.X End If If p.y > sfondo.Height Then Timer1.Stop() p.y = sfondo.Height End If
|
|
|
walker93 (Member)
Expert
Messaggi: 460
Iscritto: 31/01/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...
|
|