kakenette
Messages postés218Date d'inscriptiondimanche 1 mai 2005StatutMembreDernière intervention15 novembre 2009
-
6 févr. 2006 à 00:09
cs_caramelmou
Messages postés56Date d'inscriptionjeudi 25 décembre 2003StatutMembreDernière intervention23 avril 2008
-
10 févr. 2006 à 20:52
Bonjour, voila jaurai voulu savoire si c pas possible d'optimiser ce code pour reduire le nombre de "if" ? je suis sur que sa doit etre possible lol, jai essaye une autre boucle dans la boucle mais sa change rien etant donner quil va faire 4 fois la boucle et donc 4 fois le test "if"...
Bon je suis consciente que je viens pas ici pour me faire servire sur un plateau le nouveau code ! sa minteresserai de voire les possibilitées ou si il ya dautre moyen de pouvoire optimiser ca :
For T = 1 To 50
Rem Haut ( = 1 )
If JMove(T) = 1 Then
Joueur(T).Top = Joueur(T).Top - JMoveSpeed(T) If Joueur(T).Top <JTop(T) Then JMove(T) 0: Joueur(T).Top = JTop(T)
End If
Rem Bas ( = 2 )
If JMove(T) = 2 Then
Joueur(T).Top = Joueur(T).Top + JMoveSpeed(T) If Joueur(T).Top >JTop(T) Then JMove(T) 0: Joueur(T).Top = JTop(T)
End If
Rem Gauche ( = 3 )
If JMove(T) = 3 Then
Joueur(T).Left = Joueur(T).Left - JMoveSpeed(T) If Joueur(T).Left <JLeft(T) Then JMove(T) 0: Joueur(T).Left = JLeft(T)
End If
Rem Droite ( = 4 )
If JMove(T) = 4 Then
Joueur(T).Left = Joueur(T).Left + JMoveSpeed(T) If Joueur(T).Left >JLeft(T) Then JMove(T) 0: Joueur(T).Left = JLeft(T)
End If
Zlub
Messages postés809Date d'inscriptionmercredi 11 octobre 2000StatutMembreDernière intervention29 septembre 20108 6 févr. 2006 à 21:10
Salut,
j'avais pas fais de refresh avant de finir de rédiger ..
Pas tout à fait d'accord avec Gobillot ... Il faut certe tenir compte
du temps de l'appel de fonction (ou mehtode) et également le cout
(espace mémoire) de l'empilement des contextes... Mais une procédure
(pour être générique) me semble être une bonne approche :
- plus lisible ... donc plus facil à maintenir
- plus compacte
- moins de source d'erreurs
- mais plus gourmand,
- plus lent, tout dépend de se que tu mets dedans et si tu prévois des sorties le plus tôt possible.
Bien entendu il faut adapter selon les cas et c'est clair que ça ne convient pas à tous les cas.
Dans la version ci-dessus, ça ne devrait pas faire trop mal ... encore
que les boucle imbriquée, c'est généralement pas top .. Vu qu'on va
faire 21*8 = 88 tours donc 88 if pour determiner si l'on rentre ou non
dans la sub.
Zlub
Messages postés809Date d'inscriptionmercredi 11 octobre 2000StatutMembreDernière intervention29 septembre 20108 6 févr. 2006 à 21:33
Salut,
Petite erreurs dans le code que j'ai proposé
Private Sub ajuster(index As Integer, cas As Integer)
If ActalItem(index, cas) < 1 Then Exit Sub ' On sort si rien à faire
Dim valeur As Integer ' pour eviter d'affecter une valeur,
valeur = ActalItem(index, cas) + 1 ' pour la changer par la suite si > 10
If valeur <= 10 Then
ActalItem(index, cas) = valeur
Item(index).Left = Item(index).Left + 10 ' idem autant stocker la bonne valeur directement
' sauf si c'était voulu pour l'affichage
Else
ActalItem(index, cas) = 0
Item(T).Visible = False
Item(T).Top = 100000
Item(T).Left = 100000
End If
End Sub
Private Sub Timer1_Timer()
Dim T As Integer ' i serait plus simple mais bon bourquoi pas T
For T = 0 To 20
Call ajuster(T, HAUT) ' Autre solution mettre le test dans ajuster
Call ajuster(T, BAS)
Call ajuster(T, GAUCHE)
Call ajuster(T, DROITE)
Next T
End Sub
Zlub
Messages postés809Date d'inscriptionmercredi 11 octobre 2000StatutMembreDernière intervention29 septembre 20108 7 févr. 2006 à 01:15
Salut,
b'hein c'est tout simple, dans une forme tu colles le codes suivant:
les timers sont Timer1 pour le code correspondant à ta premiere demande,
et Timer2 pour la seconde
Option Explicit
Const HAUT = 1
Const BAS = 2
Const GAUCHE = 3
Const DROITE = 4
Const MAXVAL = 50
' Premiere partie
Sub Timer1_Timer() ()
Dim sens(HAUT To DROITE) As Integer
sens(HAUT) = -1
sens(BAS) = 1
sens(GAUCHE) = -1
sens(DROITE) = 1
Dim this As Integer
For T = 1 To MAXVAL
this = JMove(T)
If this < GAUCHE Then
Joueur(T).Top = Joueur(T).Top + (sens(this) * JMoveSpeed(T)) If (Joueur(T).Top - JTop(T)) * sens(this) >0 Then JMove(T) 0: Joueur(T).Top = JTop(T)
Else
Joueur(T).Left = Joueur(T).Left + (sens(this) * JMoveSpeed(T)) If (Joueur(T).Left - JLeft(T)) * sens(this) >0 Then JMove(T) 0: Joueur(T).Left = JLeft(T)
End If
Next T
Erase sens
End Sub
' Seconde partie
Private Sub ajuster(index As Integer, cas As Integer)
If ActalItem(T, cas) < 1 Then Exit Sub
Dim valeur As Integer ' pour eviter d'affecter une valeur,
valeur = ActalItem(index, cas) + 1 ' pour la changer par la suite si > 10
If valeur <= 10 Then
ActalItem(index, cas) = valeur
Item(index).Left = Item(index).Left + 10 'idem autant stocker la bonne valeur directement
' sauf si c'était voulu pour l'affichage
Else
ActalItem(index, cas) = 0
Item(T).Visible = False
Item(T).Top = 100000
Item(T).Left = 100000
End If
End Sub
Private Sub Timer2_Timer()
Dim T As Integer ' i serait plus simple mais bon bourquoi pas T
For T = 0 To 20
Call ajuster(T, HAUT) ' Autre solution mettre le test dans ajuster
Call ajuster(T, BAS)
Call ajuster(T, GAUCHE)
Call ajuster(T, DROITE)
Next T
End Sub
bon courage,
++
Zlub
Vous n’avez pas trouvé la réponse que vous recherchez ?
kakenette
Messages postés218Date d'inscriptiondimanche 1 mai 2005StatutMembreDernière intervention15 novembre 20091 7 févr. 2006 à 05:53
J'ai encore une question, si je met un " Dim Variable " au debut d'un sub, est-ce que a chque fois que le progu passera par le Sub, il perdra de la memoire ? il fait quoi ? il écrase l'encien "Dim Variable" ?
cs_caramelmou
Messages postés56Date d'inscriptionjeudi 25 décembre 2003StatutMembreDernière intervention23 avril 20083 10 févr. 2006 à 20:52
Juste pour info: Je trouvais bizarre que SELECT CASE ne soit pas plus efficace, car le code est plus simple :
joueur(T).top = joueur(T).top - JMoveSpeed(T)
If joueur(T).left >= jLeft(T) Then
est plus vite evalué que
joueur(T).top = joueur(T).top + (sens(this) * JMoveSpeed(T))
If (joueur(T).top - jTop(T)) * sens(this) >= 0 Then
Comme j'avais rien à faire et pour en avoir le coeur net, j'ai testé ces deux algo:
SELECT CASE est plus efficace de 12% environ (avec des données aléatoires ou presque - fonction RANDOM et repetition des algo 100 fois )
Select Case jmove(T)
Case HAUT
joueur(T).top = joueur(T).top - JMoveSpeed(T) If joueur(T).top <jTop(T) Then jmove(T) 0: joueur(T).top = jTop(T)
Case BAS
joueur(T).top = joueur(T).top + JMoveSpeed(T) If joueur(T).top >jTop(T) Then jmove(T) 0: joueur(T).top = jTop(T)
Case GAUCHE
joueur(T).left = joueur(T).left - JMoveSpeed(T) If joueur(T).left <jLeft(T) Then jmove(T) 0: joueur(T).left = jLeft(T)
Case DROITE
joueur(T).left = joueur(T).left + JMoveSpeed(T) If joueur(T).left >jLeft(T) Then jmove(T) 0: joueur(T).left = jLeft(T)
End Select