Listes dynamiques ...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Listes dynamiques ...

Message par Fig »

Bonjour à tous.

Voila mon problème:

J'essaye de faire un jeu type Age of empire.
J'ai une liste dynamique contenant mes personnages et qui s'allonge au fur et à mesure qu'on en créé.
Pour effectuer le traitement des personnage j'utilise une boucle Foreach...next.

Si il y a trop de personnage (1000 par exemple) je ne peux pas les traiter tous en une frame (ca ralentirai trop l'affichage). Je veux donc pouvoir reprendre mon traitement là où je l'ai interrompu la frame suivante pour traiter la totalité en 2-3 frames.

Code : Tout sélectionner

[pseudo code]
repeat
   flipbuffers();****frame 1
   pointeur=0
      foreach (listeperso())
      pointeur+1
      si pointeur=1000:fin de boucle:endif
      do action et modification à chacun d'eux
      next
   flipbuffers();****frame2
      foreach (listeperso(pointeur));***reprend là où je m'etais arrêté
      pointeur+1
      si pointeur=2000:fin de boucle:endif
      do action et modification à chacun d'eux
      next

...etc

boucle repeat
Il faut surement utiliser changecurrentelement() mais comment ?

quelqu'un peut me donner un exemple ?


merci beaucoup. :P
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

moi j'ai fait comme ça pour mon pureGolo
[pseudo code]
global pointeur

Repeat
FlipBuffers();****frame 1
pointeur=0
ForEach (listeperso())
pointeur+1
si pointeur=1000:fin de boucle:EndIf
do action et modification à chacun d'eux
Next
FlipBuffers();****frame2
For i=0 To pointeur-1 : NextElement(listeperso()):Next i ; <<< comme ça (Dobro) , ça marche en principe

ForEach (listeperso());***reprend là où je m'etais arrêté
pointeur+1
si pointeur=2000:fin de boucle:EndIf
do action et modification à chacun d'eux
Next

...etc

tu peut faire comme ça aussi :D

[pseudo code]
Repeat
FlipBuffers();****frame 1
pointeur=0
ForEach (listeperso())
pointeur+1
*Ancien_Element = listeperso() ; on met en memoire l'element courant
si pointeur=1000:fin de boucle:EndIf
do action et modification à chacun d'eux
Next
FlipBuffers();****frame2
ChangeCurrentElement( listeperso(), *Ancien_Element) ; Restitue l'ancien élément courant (mémorisé avant la recherche)

ForEach (listeperso());***reprend là où je m'etais arrêté
pointeur+1
si pointeur=2000:fin de boucle:EndIf
do action et modification à chacun d'eux
Next

...etc


*Ancien_Element = listeperso() ; on met en memoire l'element courant

ChangeCurrentElement( listeperso(), *Ancien_Element) ; Restitue l'ancien élément courant (mémorisé avant la recherche)
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

sinon, tu peux utiliser deux threads:
le premier gererait l'affichage, le deuxieme traiterait les données.
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message par Fig »

Merci beaucoup pour vos réponses.

Je vais opter pour l'option 2 de Dobro ...
L'option 1 avec la boucle incrémentale à vide ne me plait guère. Et ça revient à selectelement() je pense (??)

Pour ce qui est de deux threads, j'y avais pensé mais ça me semble trop complèxe pour moi pour le moment.
Peut être plus tard si ça s'avère vraiment interessant au niveau vitesse avec un traitement séparé sur deux coeurs de proce...
Mais bon je vais déja essayer simplement comme ça, linéairement c'est déja assez difficile pour moi. #jaune

Merci encore une fois à tous deux.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message par Fig »

Dobro a écrit :
*Ancien_Element = listeperso() ; on met en memoire l'element courant

ChangeCurrentElement( listeperso(), *Ancien_Element) ; Restitue l'ancien élément courant (mémorisé avant la recherche)
En fait c'est : *Ancien_Element = @listeperso() ; on met en memoire l'element courant.

J'ai une question de plus:
foreach ... next
Est ce que ca ne traiterai pas la liste depuis son début (annulant le changement d'élément ??)

Punaise je galère, HELPP !!!!! :?
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Fig a écrit :
En fait c'est : *Ancien_Element = @listeperso() ; on met en memoire l'element courant.
Faut que Comtois corrige la Doc alors !! :D

J'ai une question de plus:
foreach ... next
Est ce que ca ne traiterai pas la liste depuis son début (annulant le changement d'élément ??)

Punaise je galère, HELPP !!!!! :?
ben en principe non !!
d'apres la doc toujours
Comme la boucle se termine seulement lorsque le dernier élément de la liste est atteint (en terme de position), il est tout à fait possible de supprimer ou d' ajouter des éléments durant un cycle de boucle. De même il est permis de changer l'élément courant avec ChangeCurrentElement(). Après l’un de ces changements, le prochain cycle de boucle continue avec l'élément qui suit l'élément courant.
la liste chainée est comparable a une pile et son pointeur de pile
rien a priori ne change la position du pointeur, ajouter ou suprimer un élément, si l'on supprime l'élément pointer par le pointeur de liste chaine
il pointera l'élément précedent de lui,
seul la fonction "ChangeCurrentElement()", change la position du pointeur :D
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message par Fig »

Bein j'ai la version demo de purebasic mais dans cette doc j'ai bien @list() peut être que c'est une question de version (??!!) :?:

Pour foreach...next, d'apres les essais que j'ai fait, on reprend bien du début à la fin quelque soit la position du pointeur. Mais je peux me tromper hein ça ne serai pas la première fois :oops:

Pour ce que je crois en comprendre, chaque élement de la liste contient la valeure ou structure associée et les deux adresses des élements précédents et suivants.

Dans mon cas j'utilise: (finalement le fameux @perso() ne m'est pas utile)

for ...
nextelement()
... next

Code : Tout sélectionner

[pseudocode]

repeat
flipbuffers()
If bias=compte:ResetList(perso()):EndIf  ;remet à zero le pointeur de liste

compte=countlist(perso()) ;nombre d'élément dans la liste
pointeur=listindex(perso()) ;élément courant de la liste
bias=1000

If pointeur+bias>compte:bias=compte-pointeur:EndIf
 
 For i=1 To bias ;traite par paquet de 1000 elements
  NextElement(perso())
   do modification et affichage pour chaque perso
  Next i
until...
Dernière modification par Fig le mar. 05/déc./2006 14:54, modifié 2 fois.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

donc ça reviens a faire ce que je disais au debut , une boucle qui tourne dans le vide , qui avance le pointeur avec Next élément jusqu'a l'élément qui nous intéresse :D


en fait pour la doc, j'utilise la Version mise au point par Comtois, donc je n'ai plus la version d'origine :D

j'ai prévenu Comtois dans le topic réservé a ses corrections :D


Pour foreach...next, d'apres les essais que j'ai fait, on reprend bien du début
c'est curieux, car ce n'est pas ce que dit la doc (a Comtois :D)

pas encore eu le temps de faire des essais :D
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message par Fig »

Bein je me trompe peut être... :(

Mais pour ce qui est de la boucle à vide... je n'en fais pas. :wink:

Merci bien pour ton aide en tout cas :multi:
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Dobro a écrit :
Pour foreach...next, d'apres les essais que j'ai fait, on reprend bien du début
c'est curieux, car ce n'est pas ce que dit la doc (a Comtois :D)

pas encore eu le temps de faire des essais :D
Je confirme : ForEach repositionne le pointeur de la liste en début de liste. On n'a pas besoin d'utiliser ResetList() pour re-scanner la liste depuis le début !
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Sehka
Messages : 114
Inscription : dim. 27/févr./2005 11:41

Message par Sehka »

poshu a écrit :sinon, tu peux utiliser deux threads:
le premier gererait l'affichage, le deuxieme traiterait les données.
Poshu, ton idée semble intéressante...
Pourrais tu la développer un peu.
J'ai du mal à voir comment gérer le flipbuffers avec un displaysprite.
Faut il donner un ordre aux threads ?

Merci.
Répondre