2009-04-25 4 views
1

J'ai une application flashlite3 avec navigation composé d'icônes l'utilisateur peut naviguer à gauche ou à droite à travers l'infini.Un algorithme de pile de tableau sans copie

L'algorithme de base J'utilise travaille maintenant (et est adéquate pour ce projet) Toutefois, une partie de la solution dépend d'un double du tableau d'icônes. Selon le nombre d'éléments dans le tableau et/ou la taille du contenu de l'élément, cette solution pourrait devenir moins efficace. Je suis intéressé par une solution ou un algorithme (dans n'importe quelle langue) qui pourrait atteindre la même chose tout en étant évolutif & efficace.

Heres une partie du code correspondant dans la fonction setter pour muter la propriété '_selectedItem' qui:

  1. Évalue le courant '_selectedItem' et le nouveau '_value'
  2. Sur la base de l'étape 1 pop, unshifts droite, ou décalage, bruits restants
  3. Repeats étape 2 jusqu'à ce que l'icône correspondant à la « _selectedItem » est située dans le centre de la matrice

Ce code est exécuté en utilisant des tableaux 3:

  1. [statique] Tableau de positions. Il y a 5 icônes, 3 sont visibles à la fois, la position 0 est hors de la scène, la position 1 est 1/3, position 2 est 1/2 ..
  2. Lorsque les icônes instanciation 2 tableaux sont créés: _viewArray & _icons. L'ordre de l'ordre _viewArray imite à afficher et _icons est laissé seul et utilisé pour la condition de la boucle de vérification

/// /// ActionScript2

public function set selectedItem(value:Number) 
    { 
     var w=Stage.width; 

     if(value > _icons.length-1) 
     { 
      value=0; 
     }else if(value < 0) 
     { 
      value=_icons.length-1; 
     } 

     if(value > _selectedIndex) 
     { 
      while(_viewArray[Math.floor(_icons.length*.5)] != _icons[value]) 
      { 
       var element; 
       element=_viewArray.pop(); 
       _viewArray.unshift(element); 
      } 
     }else if(value < _selectedIndex) 
     { 
      while(_viewArray[Math.floor(_icons.length*.5)]!=_icons[value]) 
      { 
       var element; 
       element=_viewArray.shift(); 
       _viewArray.push(element); 
      }   
     } 




     for(var i:Number=0;i<_viewArray.length;i++) 
     { 
      if(i>=1 && i<= _icons.length-2) 
      { 
       _viewArray[i]._visible=true; 
      }else 
      { 
       _viewArray[i]._visible=false; 
      } 
      Tweener.addTween(_viewArray[i],{_x:positions[i],_alpha:80,time:.5,transition:'elasticIn'}) 
     } 


     Tweener.addTween(_icons[(_viewArray.length*.5)-1],{_alpha:100,time:.0,transition:'elasticIn'}); 
     Tweener.addTween(_selectedServiceIndicator,{_alpha:0,time:.3,transition:'elasticIn',onComplete:function() {Tweener.addTween(this,{_alpha:100,time:.2,transition:'elasticIn'});}}); 

     var eventObject:Object = {target:this, type:'SelectedItemChange'}; 
     eventObject.value=value; 

     for(var key in _serviceData[value]) 
     eventObject[key]=_serviceData[value][key]; 

     dispatchEvent(eventObject); 
     _selectedIndex=value; 
    } 

Répondre

1

Pourquoi chaque élément du _viewArray a pour stocker réellement l'icône, plutôt que seulement l'index dans le tableau _icons? De cette façon, vous n'avez que les icônes stockées une fois, et _viewArray stocke juste leur ordre de présentation.

+0

Evgueni, qui est un bon point et l'utilisation de cette méthode serait plus efficace que de stocker des copies de DisplayObjects, ou AS2 ... MovieClips. –

Questions connexes