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
Visual Basic 6 - la pallina che rimbalza
Forum - Visual Basic 6 - la pallina che rimbalza

Avatar
Cronos (Normal User)
Pro


Messaggi: 105
Iscritto: 07/09/2009

Segnala al moderatore
Postato alle 15:22
Lunedì, 18/01/2010
nel form vi sono un immagine (una palla) = image1 ed uno shape = shape1. Dopo essere venuto a conoscenza (e per questo devo ringraziare il sito) riguardo al modo di far muovere una pallina, volevo fare in modo che la pallina, quando toccasse lo shape, rimbalzasse verso l'alto e ho sccritto questo codice:


Option Explicit
Dim velocità As Integer

Private Sub Form_Load()
velocità = 50
End Sub

Private Sub Timer1_Timer()
Image1.Top = Image1.Top + velocità
If Image1.Top + Image1.Height >= Shape1.Top Then Image1.Top = Image1.Top - velocità
End Sub


Il problema stà nel fatto che la pallina quando tocca lo shape (a forma di barra) non rimbalza, ma si ferma!! e da parecchi giori che ci giro dietro, ma non ho trovato nessun modo per risolvere la questione (nemmeno su google!) qualcuno mi potrebbe gentilmente dire perchè la pallina non rimbalza ma si ferma!!
grazie

Ultima modifica effettuata da Cronos il 18/01/2010 alle 15:22
PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 16:02
Lunedì, 18/01/2010
Modifica così
Codice sorgente - presumibilmente VB.NET

  1. Option Explicit
  2. Dim velocità As Integer
  3. Dim IncrementaY As Integer
  4.  
  5. Private Sub Form_Load()
  6.  velocità = 50
  7.  IncrementaY = 1
  8. End Sub
  9.  
  10. Private Sub Timer1_Timer()
  11.  Image1.Top = Image1.Top + velocità * IncrementaY
  12.  If Image1.Top + Image1.Height >= Shape1.Top Then  IncrementaY = -1
  13. End Sub



Prima la pallina tornava indietro ma il timer comunque la rimandava avanti!!
Ciao

Ultima modifica effettuata da Alfonso il 18/01/2010 alle 16:05
PM Quote
Avatar
Louis (Normal User)
Pro


Messaggi: 150
Iscritto: 22/04/2008

Segnala al moderatore
Postato alle 17:34
Lunedì, 18/01/2010
Alfonso ci ha visto giusto ...
però quando torna al Top la pallina deve invertire il moto ...
quindi:
Codice sorgente - presumibilmente VB.NET

  1. Dim vel As Integer
  2. Dim IncY As Integer
  3. Dim j As Long
  4. '-----------------------------
  5. Private Sub Form_Load()
  6.     j = Image1.Top
  7.     vel = 50
  8.     IncY = 1
  9. End Sub
  10. '-----------------------------
  11. Private Sub Timer1_Timer()
  12. Image1.Picture = ImageList1.ListImages(1).Picture
  13.     Image1.Top = Image1.Top + vel * IncY
  14.     If Image1.Top + Image1.Height >= Shape1.Top Then
  15.         IncY = -1
  16.     ElseIf (Image1.Top) <= j Then
  17.         IncY = 1
  18.     End If
  19. End Sub



PM Quote
Avatar
Cronos (Normal User)
Pro


Messaggi: 105
Iscritto: 07/09/2009

Segnala al moderatore
Postato alle 17:54
Lunedì, 18/01/2010
Avete ragione (che imbarazzo, cadere su un errore così) :blush::blush::blush:

PM Quote
Avatar
Cronos (Normal User)
Pro


Messaggi: 105
Iscritto: 07/09/2009

Segnala al moderatore
Postato alle 18:03
Lunedì, 18/01/2010
Non ho capito però come funziona il tuo codice Louis. Non è che me lo potresti spiegare velocemente?
Scusa la mia ignoranza e la mia testardaggine, ma se non lo capisco non riesco magari a rifarlo in un secondo momento!! :blush::blush:

PM Quote
Avatar
Louis (Normal User)
Pro


Messaggi: 150
Iscritto: 22/04/2008

Segnala al moderatore
Postato alle 18:05
Lunedì, 18/01/2010
Ma dai ... su ... non era un errore così banale (io ne ho fatti, e ne faccio, di peggio!)
Comunque per analizzare il comportamento del codice scritto, ti conviene mettere un punto di interruzione e poi fare il passo a passo con F8.
Codice sorgente - presumibilmente VB.NET

  1. Option Explicit
  2. Dim vel As Integer
  3. Dim IncY As Integer
  4. Dim j As Long
  5. '-----------------------------
  6. Private Sub Form_Load()
  7.     ' Assumo all'avvio il valore Top del contenitore dell'immagine:
  8.     j = Image1.Top
  9.     ' Valore del Interval del Timer:
  10.     vel = 50
  11.     ' Tolgo il valore negativo posto quando il contenitore
  12.     ' dell'immagine ha raggiunto Shape1.Top:
  13.     IncY = 1
  14.  
  15. End Sub
  16. '-----------------------------
  17. Private Sub Timer1_Timer()
  18. ' Rendo disponibile l'immagine caricata nel controllo ImageList:
  19.    Image1.Picture = ImageList1.ListImages(1).Picture
  20.     ' Questo é il tuo codice, salvo IncY indicato da Alfonso che
  21.     ' diviene negativo o positivo a seconda dei casi:
  22.     Image1.Top = Image1.Top + vel * IncY
  23.     If Image1.Top + Image1.Height >= Shape1.Top Then
  24.         IncY = -1
  25.         ' Qua indico che quando il valore Top del contenitore dell'immagine é
  26.         ' divenuto uguale a quello iniziale deve togliere il valore negativo:
  27.         ElseIf (Image1.Top) <= j Then
  28.         IncY = 1
  29.     End If
  30. End Sub


' Spero che ora sia chiaro.
:k:  

Ultima modifica effettuata da Louis il 18/01/2010 alle 18:20
PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 18:51
Lunedì, 18/01/2010
Però:
Codice sorgente - presumibilmente Visual Basic 6

  1. Private Sub Timer1_Timer()
  2.  
  3. Image1.Picture = ImageList1.ListImages(1).Picture


ha senso se quell'1 fosse una variabile che viene in qualche modo incrementata per cambiare l'immagine, altrimenti portala in qualche altro punto del codice, altrimenti ad ogni tick del timer ricarichi sempre la stessa immagine con un evidente spreco di risorse.

PM Quote
Avatar
Louis (Normal User)
Pro


Messaggi: 150
Iscritto: 22/04/2008

Segnala al moderatore
Postato alle 19:54
Lunedì, 18/01/2010
Alfonso hai ragione,
nelle prove ho anche inserito diverse bmp nella ImageList e poi é rimasto l'indice...

PM Quote
Avatar
Cronos (Normal User)
Pro


Messaggi: 105
Iscritto: 07/09/2009

Segnala al moderatore
Postato alle 21:08
Lunedì, 18/01/2010
Grazie, non avevo afferrato il concetto di 1 e -1. Ora tutto è chiaro: GRAZIE!!!
:k::k::k:

PM Quote