Collision

Sujets variés concernant le développement en PureBasic
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Collision

Message par Good07 »

Bonjour à tous !

Voici un petit programme qui ne sert à rien mais qui permet de se familiariser avec les sprites et les collisions.
Mon seul regret, je n'ai pas réussi à faire la même chose avec les listes chaînées. :(
Je ne vois pas comment tester les collisions entre les différentes balles. Dans mon programme je teste la première balle du tableau et je regarde si une collision a eu lieu avec les autres balles en imbriquant deux boucles, mais avec les listes... :?:

Voici le code :

Code : Tout sélectionner

;----------------------------------------
;Good07
;Programme collision 1/11/2004
;Pure Basic version 3.92
;----------------------------------------
; Petit programme qui ne sert à rien sauf pour étudier les collisions entre sprite
; quand deux boules de la même couleur entrent en collision leur couleur change suivant le code ci-après:
; bleu+bleu=vert
; vert+vert=rouge
; rouge+rouge=bleu
;
InitSprite()
InitKeyboard()

#Longueur = 800 ;longueur de l'écran en pixel 
#hauteur = 600 ; largeur de l'écran
#depth=32 ; nombre de couleurs
nbballe=50 ; nombre de balles

Dim balle_x.f(nbballe)
Dim balle_y.f(nbballe)
Dim balle_dx.f(nbballe)
Dim balle_dy.f(nbballe)
Dim balle_cr.b(nbballe)

For a=0 To nbballe
  balle_x(a)=Random(#Longueur)-32
  balle_y(a)=Random(#hauteur)-32
  balle_dx(a)=Random(1)+1
  balle_dy(a)=Random(1)+1
  balle_cr(a)=Random(2)+1
Next a

 
If OpenScreen(#Longueur,#hauteur,#depth,"Balle collision")=0 
  MessageRequester("Attention !", "Could not create DirectX screen",#PB_MessageRequester_Ok)          
  End
EndIf

Procedure CreateBallSprite(c.l,size.l,color.l);procedure qui dessine les balles extrait de code archive 
  CreateSprite(c,size,size,#PB_Sprite_Memory ) 
  StartDrawing(SpriteOutput(c)) 
  BackColor(0,0,0):R.w=color&$FF:G.w=color>>8&$FF:b.w=color>>16&$FF 
  For t.l=size/2 To 1 Step -1 
    R+160/size:G+160/size:b+160/size:If R>255:R=255:EndIf:If G>255:G=255:EndIf:If b>255:b=255:EndIf 
    Circle(size/2,size/2,t,RGB(R,G,b)) 
  Next 
  StopDrawing() 
EndProcedure 

 
CreateBallSprite(1,32,$E85D17);création de la balle bleu

CreateBallSprite(2,32,$A4F05B);création de la balle verte

CreateBallSprite(3,32,$0F19F0);création de la balle rouge



Repeat
  StartSpecialFX()
  ClearScreen(0,0,0)
  
  For a=0 To nbballe
    ;Déplacement des balles
    balle_x(a)=balle_x(a)+((balle_dx(a)))
    balle_y(a)=balle_y(a)+((balle_dy(a)))
    ;détection des bords de l'écran
    If balle_y(a)<1: balle_dy(a)=Random(2)+1:EndIf
    If balle_y(a)>#hauteur-40:balle_dy(a)=-(Random(2)+1):EndIf
    If balle_x(a)<1:balle_dx(a)=Random(2)+1:EndIf
    If balle_x(a)>#Longueur-40:balle_dx(a)=-(Random(2)+1):EndIf
    For b=a+1 To nbballe
      If SpritePixelCollision(1,balle_x(a),balle_y(a),1,balle_x(b),balle_y(b)); détection des collisions 
        If balle_cr(a)=1 And balle_cr(b)=1; on teste la couleur bleu
          balle_cr(a)=2 ; et on change la couleur en fonction du code établit précédemment
          balle_cr(b)=2
          Goto suite
        EndIf
        If balle_cr(a)=2 And balle_cr(b)=2; idem si dessus mais pour la couleur verte
          balle_cr(a)=3
          balle_cr(b)=3
          Goto suite
        EndIf
        If balle_cr(a)=3 And balle_cr(b)=3; idem pour la couleur rouge 
          balle_cr(a)=1
          balle_cr(b)=1
        EndIf
        suite:
        If balle_x(a)<balle_x(b); déplacement des balles en fonction de la collision 
          balle_dx(a)=-1
          balle_dx(b)=1
        EndIf
        If balle_x(a)>balle_x(b)
          balle_dx(a)=1
          balle_dx(b)=-1
        EndIf
        If balle_y(a)<balle_y(b)
          balle_dy(a)=-1
          balle_dy(b)=1
        EndIf
        If balle_y(a)>balle_y(b)
          balle_dy(a)=1
          balle_dy(b)=-1
        EndIf     
      EndIf
    Next b
    DisplayTransparentSprite(balle_cr(a),balle_x(a),balle_y(a))
  Next a
  StopSpecialFX()
  FlipBuffers()
  ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_Escape); press Esc to quit 
CloseScreen()
End 
Voilà j'espère qu'il est assez documenté et compréhensible.

Si des fois quelqu'un sait comment faire avec les listes je suis preneur pour apprendre. :lol:

Merci d'avance et à plus.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Tres sympa ton code ! :D
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

Si des fois quelqu'un sait comment faire avec les listes je suis preneur pour apprendre.
Voilà, M'sieu!
J'ai mis les caractéristiques des balles dans une structure pour pouvoir remplacer les cinq tableaux par une seule liste.
J'ai supprimé le startspecialfx parceque j'ai pas trop compris ce qu'il faisait là :?:
Et j'ai laissé les Goto tranquilles parceque c'est une espèce protégée :wink:

Si ça te semble obscur, n'hésite pas :)

Code : Tout sélectionner


;----------------------------------------
;Good07
;Programme collision 1/11/2004
;Pure Basic version 3.92
;----------------------------------------
; Petit programme qui ne sert à rien sauf pour étudier les collisions entre sprite
; quand deux boules de la même couleur entrent en collision leur couleur change suivant le code ci-après:
; bleu+bleu=vert
; vert+vert=rouge
; rouge+rouge=bleu
;
InitSprite()
InitKeyboard()

#Longueur = 800 ;longueur de l'écran en pixel
#hauteur = 600 ; largeur de l'écran
#depth=32 ; nombre de couleurs
nbballe=50 ; nombre de balles

; Dim balle_x.f(nbballe)
; Dim balle_y.f(nbballe)
; Dim balle_dx.f(nbballe)
; Dim balle_dy.f(nbballe)
; Dim balle_cr.b(nbballe)

Structure balle
  x.l : y.l
  dx.l : dy.l
  cr.l
EndStructure

NewList balle.balle()

For a=0 To nbballe
  AddElement(balle())
  ;balle_x(a)=Random(#Longueur)-32
  balle()\x=Random(#Longueur)-32
  ;balle_y(a)=Random(#hauteur)-32
  balle()\y=Random(#hauteur)-32
  ;balle_dx(a)=Random(1)+1
  balle()\dx=Random(1)+1
  ;balle_dy(a)=Random(1)+1
  balle()\dy=Random(1)+1
  ;balle_cr(a)=Random(2)+1
  balle()\cr=Random(2)+1
Next a

 
If OpenScreen(#Longueur,#hauteur,#depth,"Balle collision")=0
  MessageRequester("Attention !", "Could not create DirectX screen",#PB_MessageRequester_Ok)         
  End
EndIf

Procedure CreateBallSprite(c.l,size.l,color.l);procedure qui dessine les balles extrait de code archive
  CreateSprite(c,size,size,#PB_Sprite_Memory )
  StartDrawing(SpriteOutput(c))
  BackColor(0,0,0):R.w=color&$FF:G.w=color>>8&$FF:b.w=color>>16&$FF
  For t.l=size/2 To 1 Step -1
    R+160/size:G+160/size:b+160/size:If R>255:R=255:EndIf:If G>255:G=255:EndIf:If b>255:b=255:EndIf
    Circle(size/2,size/2,t,RGB(R,G,b))
  Next
  StopDrawing()
EndProcedure

 
CreateBallSprite(1,32,$E85D17);création de la balle bleu

CreateBallSprite(2,32,$A4F05B);création de la balle verte

CreateBallSprite(3,32,$0F19F0);création de la balle rouge



Repeat
  ;StartSpecialFX() <-- M'enfin ? Pourquoi ?
  ClearScreen(0,0,0)
  
  ForEach balle();For a=0 To nbballe
    ;Déplacement des balles
    balle()\x=balle()\x+balle()\dx
    balle()\y=balle()\y+balle()\dy
    ;détection des bords de l'écran
    If balle()\y<1: balle()\dy=Random(2)+1:EndIf
    If balle()\y>#hauteur-40:balle()\dy=-(Random(2)+1):EndIf
    If balle()\x<1:balle()\dx=Random(2)+1:EndIf
    If balle()\x>#Longueur-40:balle()\dx=-(Random(2)+1):EndIf
    *BalleActu.balle=@balle();on stoque l'addresse de l'élément-balle courant
    While NextElement(balle());on va parcourir le reste de la liste
      If SpritePixelCollision(1,*BalleActu\x,*BalleActu\y,1,balle()\x,balle()\y); détection des collisions
        If *BalleActu\cr=1 And balle()\cr=1; on teste la couleur bleu
          *BalleActu\cr=2 ; et on change la couleur en fonction du code établit précédemment
          balle()\cr=2
          Goto suite
        EndIf
        If *BalleActu\cr=2 And balle()\cr=2; idem si dessus mais pour la couleur verte
          *BalleActu\cr=3
          balle()\cr=3
          Goto suite
        EndIf
        If *BalleActu\cr=3 And balle()\cr=3; idem pour la couleur rouge
          *BalleActu\cr=1
          balle()\cr=1
        EndIf
        suite:
        If *BalleActu\x<balle()\x; déplacement des balles en fonction de la collision
          *BalleActu\dx=-1
          balle()\dx=1
        EndIf
        If *BalleActu\x>balle()\x
          *BalleActu\dx=1
          balle()\dx=-1
        EndIf
        If *BalleActu\y<balle()\y
          *BalleActu\dy=-1
          balle()\dy=1
        EndIf
        If *BalleActu\y>balle()\y
          *BalleActu\dy=1
          balle()\dy=-1
        EndIf     
      EndIf
    Wend
    ChangeCurrentElement(balle(),*BalleActu);on rétabli l'élément courrant d'avant la boucle while, pour rester cohérent dans la boucle foreach.
    DisplayTransparentSprite(balle()\cr,balle()\x,balle()\y)
  Next
  ;StopSpecialFX()
  FlipBuffers()
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape); press Esc to quit
CloseScreen()
End
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Effectvement bravo sa réduit à moitier le code :)
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

oui d'ailleurs j'ai fait un petit tuto sur les listes chainées dans la rubrique débutant.

Tu peux aussi regarder mon code source "Invader" qui utilisent les listes chainées et les collisions entre des sprites provenant de plusieurs listes chaînées :) Utilise la rubrique "Rechercher du forum" tu trouveras :)
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Je sais j'ai fait 3 petit jeux avec les linked list à priori personne à regarder :(
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Message par Good07 »

Merci filperj :lol:

Avant d'avoir ta réponse je suis allé voir sur code archive si je ne trouvais pas mon bonheur. J'ai trouvé quelques exemples que j'ai étudié et j'en était arrivé à ceci :

Code : Tout sélectionner

;collision version 2
; Good 07
; -------------------

#scrw=800
#scrh=600
#depth=32
nbballs=100
InitSprite()
InitKeyboard()
 
If OpenScreen(#scrw,#scrh,#depth,"Balle collision")=0 
  MessageRequester("Attention !", "Could not create DirectX screen",#PB_MessageRequester_Ok)          
  End
EndIf

Procedure CreateBallSprite(c.l,size.l,color.l);procedure qui dessine les balles extrait de code archive 
  CreateSprite(c,size,size,#PB_Sprite_Memory ) 
  StartDrawing(SpriteOutput(c)) 
  BackColor(0,0,0):R.w=color&$FF:G.w=color>>8&$FF:b.w=color>>16&$FF 
  For t.l=size/2 To 1 Step -1 
    R+160/size:G+160/size:b+160/size:If R>255:R=255:EndIf:If G>255:G=255:EndIf:If b>255:b=255:EndIf 
    Circle(size/2,size/2,t,RGB(R,G,b)) 
  Next 
  StopDrawing() 
EndProcedure 
 
Structure balles
  sprite.w
  x.w
  y.w
  dx.b
  dy.b
EndStructure
 
NewList objet.balles(); on crée une liste pour gérer les balles

For a=0 To nbballs
  CreateBallSprite(a,24,$E85D17)
  AddElement(objet())
  objet()\sprite=a
  objet()\x=Random(#scrw-24)+1
  objet()\y=Random(#scrh-24)+1
  objet()\dx=Random(1)+5
  objet()\dy=Random(1)+5
Next a



Repeat
  StartSpecialFX()
  ClearScreen(0,0,0)
  ;hit test the sprites
  
  ForEach(objet())
    ;Déplacement des balles
    objet()\x=objet()\x+((objet()\dx))
    objet()\y=objet()\y+((objet()\dy))
    ;détection des bords de l'écran
    If objet()\x<25:objet()\dx=Random(1)+2:EndIf
    If objet()\x>#scrw-24: objet()\dx=-(Random(1)+2):EndIf
    If objet()\y<25: objet()\dy=Random(1)+2:EndIf
    If objet()\y>#scrh-24:objet()\dy=-(Random(1)+2):EndIf
    
    *i.balles=@objet()
    
    While NextElement(objet())
      If SpritePixelCollision(*i\sprite,*i\x,*i\y,objet()\sprite,objet()\x,objet()\y)
        If objet()\x<*i\x; déplacement des balles en fonction de la collision 
          objet()\dx=-1
          *i\dx=1
        EndIf
        If objet()\x>*i\x
          objet()\dx=1
          *i\dx=-1
        EndIf
        If objet()\y<*i\y
          objet()\dy=-1
          *i\dy=1
        EndIf
        If objet()\y>*i\y
          objet()\dy=1
          *i\dy=-1
        EndIf     
      EndIf
    Wend
    ChangeCurrentElement(objet(),*i)
    DisplayTransparentSprite(objet()\sprite,objet()\x,objet()\y)
  Next
  StopSpecialFX()
  FlipBuffers()
  ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_Escape); press Esc to quit 
CloseScreen()
End 
Bon évidemment, mon programme est plus simple car je ne change pas les couleurs des balles. Mais enfin il marche même si je n'ai pas tout compris. Mais avec tes explications, je vois beaucoup plus clair. :lol:

En fait ce n'était pas l'utilisation des listes chaînées par elle même qui me posait un problème, mais comment faire pour tester dans la liste ce qui entrait en collision. Pour moi, spritecollision(1, balle()\x,balle()\y,1,balle()x\,balle()y) ne voulais rien dire puiqu'on testait le même sprite à la même position. Mais maintenant je comprend mieux le fait de faire :*BalleActu.balle=@balle(). Même si j'ai utilisé la même chose dans mon listing c'était du chinois !

Pour la fonction StartSpécialFX(), c'est une erreur. J'ai mal lu la doc. :oops:
Je pensais que cela améliorait la vitesse d'affichage.

Pour Crystal Noir:
Tu peux aussi regarder mon code source "Invader" qui utilisent les listes chainées et les collisions entre des sprites provenant de plusieurs listes chaînées Utilise la rubrique "Rechercher du forum" tu trouveras
Merci :lol: Je vais chercher tout de suite et étudier cela de près.

Merci à tous ! :lol:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Comme ça ?
j'ai une liste chainée et je compare chaque balle entre elle.

Code : Tout sélectionner

Structure InfoBalle
  x.l
  y.l
  ; etc ....
EndStructure

NewList Balle.InfoBalle()

; On ajoute 3 balles
For n = 1 To 3
  AddElement(Balle())
  Balle()\x = n
  Balle()\y = n
Next

ResetList(Balle())
While NextElement(Balle())
  Pos = ListIndex(Balle())
  *BalleTemp.InfoBalle = @Balle()
  
  ResetList(Balle())
  While NextElement(Balle())
    Debug Str(*BalleTemp\x) + ", " + Str(*BalleTemp\y) + " / " + Str(Balle()\x) + ", " + Str(Balle()\y) 
  Wend
  SelectElement(Balle(), Pos)
Wend
et pour améliorer, on peut ajouter un test pour ne pas comparer une balle avec elle même

Code : Tout sélectionner

Structure InfoBalle
  x.l
  y.l
  ; etc ....
EndStructure

NewList Balle.InfoBalle()

; On ajoute 3 balles
For n = 1 To 3
  AddElement(Balle())
  Balle()\x = n
  Balle()\y = n
Next

ResetList(Balle())
While NextElement(Balle())
  PosListeBalle = ListIndex(Balle())
  *BalleTemp.InfoBalle = @Balle()
  
  ResetList(Balle())
  While NextElement(Balle())
    If PosListeBalle <> ListIndex(Balle())
      Debug Str(*BalleTemp\x) + ", " + Str(*BalleTemp\y) + " / " + Str(Balle()\x) + ", " + Str(Balle()\y) 
    EndIf
  Wend
  SelectElement(Balle(), PosListeBalle)
Wend
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Message par Good07 »

Merci Soldat ! :lol:

Cela devient de plus en plus clair. Il est évident que l'utilisation des listes quand on sait les manipuler est beaucoup plus souple que les tableaux.

Pour Crystal Noir

Désolé mais même en utilisant la fonction recherché "Invader" est introuvable. :(
Je trouve celui de Garzul mais pour le tien j'ai trouvé un message du 27 janvier 2004 mais pas de lien ou de listing :(

Mais j'ai peut-être été trop rapide ?
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

ah, aurais-je oublié de le poster ici mon code ?

Pas grave je vais le faire, en attendant tu trouveras le listing ici sur cet autre forum :

http://www.bregeon.net/phpBB2/viewtopic.php?t=2077
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Message par Good07 »

Merci Crystal Noir :lol:

Je vais imrpimer le listing pour pouvoir l'étudier tranquillement. Je vais essayé d'amener ça au boulot, si j'ai un moment...On n'a plein d'ordinateur où je travaille, l'inconvénient c'est que l'administrateur de réseau les à tous vérouillé et il est impossible d'installer PureBasic. :(

De plus je ne connaissais pas ce forum j'irai y faire un tour. :wink:


Merci à tous :D
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

une petite optimisation

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.92
; 
; Explication du programme :
; Faire un test entre chaque valeur d'une liste chainée
; cette exemple s'appuie sur des balles en position X Y, le test qui n'est pas représenté ici est une collision

Structure InfoBalle
  x.l
  y.l
  ; etc ....
EndStructure

NewList Balle.InfoBalle()

NbBalles = 4

; On ajoute #NbBalles balles
For n = 1 To NbBalles
  AddElement(Balle())
  Balle()\x = n
  Balle()\y = n
Next

PosListeBalle1 = -1
ResetList(Balle())
While NextElement(Balle())
  PosListeBalle1 + 1
  *BalleTemp.InfoBalle = @Balle()
  
  PosListeBalle2 = -1
  ResetList(Balle())
  While NextElement(Balle())
    PosListeBalle2 + 1
    If PosListeBalle1 <> PosListeBalle2
      Debug Str(*BalleTemp\x) + ", " + Str(*BalleTemp\y) + " / " + Str(Balle()\x) + ", " + Str(Balle()\y) 
    EndIf
  Wend
  SelectElement(Balle(), PosListeBalle1)
Wend
voici un code pour comparer

Code : Tout sélectionner

NbBalles = 10000

; On ajoute NbBalles balles
For n = 1 To NbBalles
  AddElement(Balle())
  Balle()\x = n
  Balle()\y = n
Next

Temps1 = GetTickCount_()

PosListeBalle1 = -1
ResetList(Balle())
While NextElement(Balle())
  PosListeBalle1 + 1
  *BalleTemp.InfoBalle = @Balle()
  
  PosListeBalle2 = -1
  ResetList(Balle())
  While NextElement(Balle())
    PosListeBalle2 + 1
    If PosListeBalle1 <> PosListeBalle2
      Debug Str(*BalleTemp\x) + ", " + Str(*BalleTemp\y) + " / " + Str(Balle()\x) + ", " + Str(Balle()\y) 
    EndIf
  Wend
  SelectElement(Balle(), PosListeBalle1)
Wend

Temps2 = GetTickCount_()

ResetList(Balle())
While NextElement(Balle())
  PosListeBalle = ListIndex(Balle())
  *BalleTemp.InfoBalle = @Balle()
  
  ResetList(Balle())
  While NextElement(Balle())
    If PosListeBalle <> ListIndex(Balle())
      Debug Str(*BalleTemp\x) + ", " + Str(*BalleTemp\y) + " / " + Str(Balle()\x) + ", " + Str(Balle()\y) 
    EndIf
  Wend
  SelectElement(Balle(), PosListeBalle)
Wend

Temps3 = GetTickCount_()

MessageRequester("Rapidité", "Méthode 1 = " + Str(Temps2 - Temps1) + Chr(10) + "Méthode 2 = " + Str(Temps3 - Temps2), 0)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

encore plus rapide, j'ai également commenté un poil le code

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.92
; 
; Explication du programme :
; Faire un test entre chaque valeur d'une liste chainée
; cette exemple s'appuie sur des balles en position X Y, le test qui n'est pas représenté ici est une collision

Structure InfoBalle
  x.l
  y.l
  ; etc ....
EndStructure

NewList Balle.InfoBalle()

NbBalles = 4

; On ajoute #NbBalles balles
For n = 1 To NbBalles
  AddElement(Balle())
  Balle()\x = n
  Balle()\y = n
Next

PosListeBalle1 = -1
ResetList(Balle())
; Boucle 1
While NextElement(Balle()) ; On passe à l'élément suivant
  PosListeBalle1 + 1 ; On compte pour connaître le numéro de l'élément
  *BalleTemp.InfoBalle = @Balle() ; On récupère l'élément courant de la boucle 1
  
  PosListeBalle2 = -1
  ResetList(Balle())
   ; Boucle 2
  While NextElement(Balle()) ; On passe à l'élément suivant
    PosListeBalle2 + 1 ; On compte pour connaître le numéro de l'élément
    
    ; On compare la balle à la position PosListeBalle1 dans la boucle 1 avec celle à la position PosListeBalle2 dans la boucle 2
    If PosListeBalle1 <> PosListeBalle2 ; Ce test sert à éviter d'avoir le test sur la même balle
      Debug Str(*BalleTemp\x) + ", " + Str(*BalleTemp\y) + " / " + Str(Balle()\x) + ", " + Str(Balle()\y) 
    EndIf
    
  Wend
  ChangeCurrentElement(Balle(), *BalleTemp) ; On remet l'élément courant de la boucle 1
Wend



;- Test de rapidité

ClearList(Balle())
NbBalles = 5000

; On ajoute NbBalles balles
For n = 1 To NbBalles
  AddElement(Balle())
  Balle()\x = n
  Balle()\y = n
Next

Temps1 = GetTickCount_()

PosListeBalle1 = -1
ResetList(Balle())
While NextElement(Balle())
  PosListeBalle1 + 1
  *BalleTemp.InfoBalle = @Balle()
  
  PosListeBalle2 = -1
  ResetList(Balle())
  While NextElement(Balle())
    PosListeBalle2 + 1
    If PosListeBalle1 <> PosListeBalle2
      Debug Str(*BalleTemp\x) + ", " + Str(*BalleTemp\y) + " / " + Str(Balle()\x) + ", " + Str(Balle()\y) 
    EndIf
  Wend
  ChangeCurrentElement(Balle(), *BalleTemp)
Wend

Temps2 = GetTickCount_()

ResetList(Balle())
While NextElement(Balle())
  PosListeBalle = ListIndex(Balle())
  *BalleTemp.InfoBalle = @Balle()
  
  ResetList(Balle())
  While NextElement(Balle())
    If PosListeBalle <> ListIndex(Balle())
      Debug Str(*BalleTemp\x) + ", " + Str(*BalleTemp\y) + " / " + Str(Balle()\x) + ", " + Str(Balle()\y) 
    EndIf
  Wend
  SelectElement(Balle(), PosListeBalle)
Wend

Temps3 = GetTickCount_()

MessageRequester("Rapidité", "Méthode 1 = " + Str(Temps2 - Temps1) + Chr(10) + "Méthode 2 = " + Str(Temps3 - Temps2), 0)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

et ben puisque c comme ca je boude na !
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

:roll: tusors:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre